java:String

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了java:String脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

String类是final类,它内部的方法也默认被final修饰,不能重写.

字符串常量池

当这样声明一个字符串

  String str = "hello java";

JVM会检测字符串常量池中是否存在这个值的字符串,如果存在,就直接赋值给str,否则创建一个新的,再赋值给str.
当连续用同样的方式声明两个字符串并作比较

 String str1 = "hellojava"; String str2 = "hellojava"; boolean flag = str1==str2;//true

结果为true.

"=="这个操作符比较的是什么?对于基本变量,比较的就是变量的值;对于引用变量,比较的是它们指向的内容.
当我们这样声明
 String str1 = "hello"; String str2 = "java"; String str3 = "hellojava"; String str4 = str1+str2; boolean flag = str3==str4;//false

结果为false.这是因为str4是有两个引用类型结合而成,它的值在编译期无法确定.
如果将str1和str2声明为final类型

@H_304_100@final String str1 = "hello"; final String str2 = "java"; String str3 = "hellojava"; String str4 = str1+str2; boolean flag = str3==str4;//true

str1和str2都是被final修饰的字符串常量,那么str4在编译期就可以被确定.因此结果是true.

通过new创建字符串

String str3 = "hellojava"; String str4 = new String("hellojava"); boolean flag = str3==str4;//false

这是因为new会在堆中创建一个hellojava的实例对象,并用栈中的str4指向它.而str3指向的是方法区中字符串常量池中的hellojava.当然堆中的hellojava指向的也是字符串常量池中的hellojava(如果存在的话).
了解一下str3和str4的声明做了什么?

先声明str3.会在方法区的字符串常量池中直接创建一个字符串"hellojava",使str3指向它.紧接着用new创建str4时,会先查找字符串常量池中是否包含字符串"hellojava".如果有直接返回,没有就在常量池中创建.然后在堆中创建实例对象,并将这个实例对象指向常量池中的字符串"hellojava",然后将实例对象赋给栈中的str4.

intern()方法

//"java"字符串在常量池中  String str1 = "java"; //直接从常量池中获取"java"字符串  String str2 = str1.intern(); boolean equal = str1==str2;//true //在堆内存中声明一个"java"字符串 String str3 = new String("java"); //常量池没有"java"字符串,将str3的字符串加入到常量池,再返回这个常量池中的"java"字符串给str4 String str4 = str3.intern(); boolean equal = str3==str4;

intern()方法会先在字符串常量池中查找是否有"java"这个字符串,如果有就直接返回这个字符串的引用,如果没有,就把str1指向的"java"字符串加入到常量池,再返回常量池中"java"字符串的引用.

脚本宝典总结

以上是脚本宝典为你收集整理的java:String全部内容,希望文章能够帮你解决java:String所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。