资讯专栏INFORMATION COLUMN

5.java String对象

Nosee / 1386人阅读

摘要:使用构造方法进行类对象实例化,会开辟两块堆内存空间,一块是匿名对象所占,一块是使用关键字创建的堆内存。而且在赋值操作完成后,匿名对象所占的堆内存空间将会变成垃圾空间。

String 类

字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

实例化String类

实例化一个String类有两种方法:

直接赋值
String str = "hello world";
利用构造方法

示例:

String str = new String("hello world");
两种实例化方式的区别

字符串常量实际上是String的匿名对象。这里"hello world"就是一个String的匿名对象。因此"hello world" 可以直接调用String类的方法和属性。

因此所谓的直接赋值实际上是给一个匿名对象设置了名字而已,匿名对象由系统自动生成,不再有用户使用new创建。

使用构造方法进行String类对象实例化,会开辟两块堆内存空间,一块是"hello world"匿名对象所占,一块是使用new关键字创建的堆内存。

而且在赋值操作完成后,"hello world"匿名对象所占的堆内存空间将会变成垃圾空间。

因此直接赋值将会比使用构造方法的方式节省一块堆内存空间。而且使用构造方法定义的String对象,也不会保存在对象池中。

使用new一定会开辟新的堆内存空间。

如果希望新开辟的String类内存数据保存进对象池,可以使用String类的intern()方法。

因此这两种实例化的区别总结如下:

直接赋值:只会开辟一块堆内存空间,并且会自动保存在对象池之中,以供下次再次使用。

构造方法:会开辟两块堆内存空间,其中匿名对象所占的空间会成为垃圾空间,并且不会自动入池,但是用户可以使用intern手工入池。

示例:

public class StringDemo{
    public static void main(String args[]) {
        String stra = "hello";
        String strb = "hello";
        String strc = "hello";
        String strd = new String("hello");//一旦使用new,一定会分配新的堆内存。
        String stre = new String("hello").intern();//使用intern手工入池。
        System.out.println(stra == strb);
        System.out.println(stra == strc);
        System.out.println(strc == strb);
        System.out.println(stra == strd);
        System.out.println(stra == stre);
    }
}

输出结果:
true
true
true
false
true
String 方法

参考:https://docs.oracle.com/javas...

String “==” 与 “equals()”的区别

== 是java提供的关系运算符,主要的功能是判断数值是否相同,如果用在String对象上,比较的是两个String对象所指向的堆内存地址是否一样。

equals()是由String提供的一个方法,判断两个String对象的内容是否相同。

示例:

public class StringDemo{
    public static void main(String args[]) {
        String stra = "hello";
        String strb = new String("hello");
        String strc = strb;

        System.out.println(stra == strb);
        System.out.println(stra == strc);
        System.out.println(strc == strb);
        System.out.println(stra.equals(strb));
    }
}

输出结果:
false
false
true
true
String对象内容不可改变

String对象的内容不能改变,而对于String变量内容的变化,是利用了引用关系的变化而实现的。每一次的变化都会使得String变量指向的堆内存空间改变,而且原先的堆内存空间将会变成垃圾空间。

示例:

public class StringDemo{
    public static void main(String args[]) {
        String str = "hello ";
        //使用identityHashCode获取根据对象内存地址计算出来的哈希码,不同的地址算出来的结果是不一样的。
        System.out.println(System.identityHashCode(str));
        str = str + "world ";
        System.out.println(System.identityHashCode(str));
        str += "!!!";
        System.out.println(System.identityHashCode(str));
        System.out.println(str);
    }
}

输出结果:
366712642
1829164700
2018699554
hello world !!!
String类特点总结

String对象有两种实例化方式,使用直接赋值方式可以不产生垃圾空间,并且可以自动入池。使用构造方法会产生一块垃圾空间,也不会自动入池。

String对象一旦实例化,其内容不可改变,String类对象内容的改变是依靠引用关系的改变实现的。因此很多时候可以当成基本数据类型来使用。

String对象的内容相等判断equals()方法完成,“==”实现的是内存地址的判断。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73498.html

相关文章

  • 5. Java 中的变量 【连载5

    摘要:变量中的类型变量中的类型分为三种静态变量或者类变量实例变量局部变量静态变量静态变量也被称为类变量,因为它们与类相关联,并且对于类的所有实例对象都是通用的。局部变量是定义在一个类的函数里面,其作用范围被限制在该函数内部,外部无法访问该变量。 1. 理解 Java 中的变量 程序中需要处理数据,Java 中的变量是用来装载数据。变量类似一个盒子,我们通过这个盒子,就可以操作盒子里面的数据。...

    myshell 评论0 收藏0
  • Java问题汇总,持续更新到GitHub

    摘要:目录介绍问题汇总具体问题好消息博客笔记大汇总年月到至今,包括基础及深入知识点,技术博客,学习笔记等等,还包括平时开发中遇到的汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善开源的文件是格式的同时也开源了生活博客,从年 目录介绍 00.Java问题汇总 01.具体问题 好消息 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技...

    beita 评论0 收藏0
  • 小马哥Java面试题课程总结

    摘要:无限期等待另一个线程执行特定操作。线程安全基本版请说明以及的区别值都不能为空数组结构上,通过数组和链表实现。优先考虑响应中断,而不是响应锁的普通获取或重入获取。只是在最后获取锁成功后再把当前线程置为状态然后再中断线程。 前段时间在慕课网直播上听小马哥面试劝退(面试虐我千百遍,Java 并发真讨厌),发现讲得东西比自己拿到offer还要高兴,于是自己在线下做了一点小笔记,供各位参考。 课...

    FingerLiu 评论0 收藏0
  • JVM 平台上的各种语言的开发指南[z]

    摘要:我们的目标是建立对每一种语言的认识,它们是如何进化的,未来将走向何方。有点的味道是坚持使用动态类型,但唯一还收到合理拥泵的编程语言,然而一些在企业的大型团队中工作的开发者择认为这会是的一个缺陷。 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目。尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的JVM语言么? 如今借助来自...

    phodal 评论0 收藏0

发表评论

0条评论

Nosee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<