博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5.java String对象
阅读量:6371 次
发布时间:2019-06-23

本文共 2555 字,大约阅读时间需要 8 分钟。

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);    }}输出结果:truetruetruefalsetrue

String 方法

参考:

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));    }}输出结果:falsefalsetruetrue

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);    }}输出结果:36671264218291647002018699554hello world !!!

String类特点总结

  • String对象有两种实例化方式,使用直接赋值方式可以不产生垃圾空间,并且可以自动入池。使用构造方法会产生一块垃圾空间,也不会自动入池。
  • String对象一旦实例化,其内容不可改变,String类对象内容的改变是依靠引用关系的改变实现的。因此很多时候可以当成基本数据类型来使用。
  • String对象的内容相等判断equals()方法完成,“==”实现的是内存地址的判断。

转载地址:http://jnyqa.baihongyu.com/

你可能感兴趣的文章
李洪强经典面试题148-多线程
查看>>
RSA 分段加解密【解决“不正确的长度”的异常】
查看>>
webview调起浏览器
查看>>
PHP数组对象对比机制
查看>>
OSX: SSH密钥使用日记(2)
查看>>
今天研究了下webservice 终于OK了
查看>>
BNUOJ27873:A Special "Happy Birthday" Song!!!
查看>>
CocoStudio学习资源
查看>>
如何处理 android 方法总数超过 65536 . the number of method references in a .dex file exceed 64k...
查看>>
iOS - NSURLConnection 网络请求
查看>>
MapReduce ----数据去重
查看>>
【Python】在控制台输出不同颜色的文字
查看>>
函数式编程扫盲篇 [转]
查看>>
poj3070
查看>>
Cobar 关系型数据的分布式处理系统
查看>>
loadrunner -56992
查看>>
AngularJS体验式编程系列文章
查看>>
SQL Server 2012 开发新功能 序列对象(Sequence)(转)
查看>>
分享:使用 TypeScript 编写的游戏代码
查看>>
java使用AES加密解密 AES-128-ECB加密
查看>>