Java中String new和直接赋值的区别

    对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

例如:

String str1="ABC"; 和String str2 = new String("ABC");

String str1="ABC" 可能创建一个对象或者不创建对象,如果"ABC"这个字符串在Java String池里不存在,会在java String池创建这个一个String对象("ABC").如果已经存在,str1直接reference to 这个String池里的对象。

String str2 = new String("ABC") 至少创建一个对象,也可能两个。因为用到new 关键字,会在heap创建一个 str2 的String 对象,它的value 是 "ABC".同时,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("ABC").

String 有一个intern() 方法,native,用来检测在String pool是否已经有这个String存在。

public String intern()

返回字符串对象的规范化表示形式。

一个初始时为空的字符串池,它由类 String 私有地维护。

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

所有字面值字符串和字符串赋值常量表达式都是内部的。

返回:

一个字符串,内容与此字符串相同,但它保证来自字符串池中。

考虑下面的问题:

String str1 = new String("ABC");
String str2 = new String("ABC");

str1 == str2 的值是True 还是False呢? False.

String str3 = "ABC";
String str4 = "ABC";

String str5 = "A" + "BC";

str3 == str4 的值是True 还是False呢? True.

str3 == str5 的值是True 还是False呢? True.

在写代码的时候,一般不要 String str2 = new String("ABC");

String a = "ABC";
String b="AB";
String c=b+"C";
System.out.println(a==c); false

a和b都是字符串常量所以在编译期就被确定了!

而c中有个b是引用不是字符串常量所以不会在编译期确定。
而String是final的!所以在b+"c"的时候实际上是新创建了一个对象,然后在把新创建对象的引用传给c.

public static void main(String[] args) throws Exception {    String a =  "b" ;     String b =  "b" ;     System.out.println( a == b);     String d = new String( "d" ).intern() ;   String c = "d" ;    //String d = new String( "d" ).intern() ;     System.out.println( c == d);    System.out.println("------------------");   String d1 = new String( "d" ) ;   String e1=d1.intern();  String c1 = "d" ;    //String d = new String( "d" ).intern() ;     System.out.println( c1 == d1);    System.out.println( c1 == e1);    System.out.println( e1 == d1);   System.out.println("------------------");   String s1=new String("kvill");   String s2=s1.intern();   System.out.println( s1==s2 ); //s1=s1.intern()  System.out.println( s1+" "+s2 );   System.out.println( s2==s1.intern() );   }    

运行结果:

true
true
------------------
false
true
false
------------------
false
kvill kvill
true

s1==s1.intern()为false说明原来的“kvill”仍然存在; 

例子代码:

String s1 = "china";
String s2 = "china";
String s3 = "china";
String ss1 = new String("china");
String ss2 = new String("china");
String ss3 = new String("china");     

这里解释一下,对于通过 new 产生一个字符串(假设为 ”china” )时,会先去常量池中查找是否已经有了 ”china” 对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此 ”china” 对象的拷贝对象。

也就是有道面试题: String s = new String(“xyz”); 产生几个对象?

一个或两个。如果常量池中原来没有 ”xyz”, 就是两个。如果原来的常量池中存在“xyz”时,就是一个。

对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。

java中new String和字符串池比区别是浪费空间,为什么还需要它?

对 于下面程序中:ss0 = new String( "hello" );是用new()来新建对象的,存于堆中。每调用一次就会创建一个新的对象。当然从节省空间的角度来讲,肯定不如str="hello",有童鞋一定 问,那要它有什么用?当时设计编译器时,为什么要设计它?马克-to-win,那我请问你,如果在你编程序时,你还不知道字符串内容怎么办?这时就用到 new String,所以,什么都有什么的用处。

java中String new和直接赋值的区别相关推荐

  1. Java中String、StringBuffer、StringBuilder的区别

    Java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  2. Java中String、StringBuffer和StringBuilder的区别

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6581009.html  在编程中,对于字符串拼接,我们可以用String类重载的+或concat(str).S ...

  3. JAVA中String与StringBuffer 、StringBuilder的区别

    String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结. 在java中有3个类来负责字符的操作. 1.C ...

  4. 如何理解java中String的不可变性

    文章目录 问题 String类的声明 final关键字的作用 String的不变性 String的不变性有哪些好处 String真的是绝对不可变吗 问题 为什么大家都在说String是不可变的? St ...

  5. java中String s=abc及String s=new String(abc)详解

    java中String s="abc"及String s=new String("abc")详解 1.   栈(stack)与堆(heap)都是Java用来在R ...

  6. Java中String是个什么类型?

    Java中String是个什么类型 Java中的八大基本数据类型 String 是个什么类型 String常见的方法 Java中的八大基本数据类型 面试官的套路 Java中的数据类型分为四类 1.整型 ...

  7. java中String的常用方法

    java中String的常用方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len ...

  8. java中String,int,Integer,char、double类型转换

    java中String,int,Integer,char.double类型转换----https://www.cnblogs.com/kangyu222/p/5866025.html 转载于:http ...

  9. java中String对象和String变量

    2019独角兽企业重金招聘Python工程师标准>>> java中String对象和String变量 (2011-12-27 20:40:27) 转载▼ 标签: it 最近在论坛上看 ...

最新文章

  1. 入职后发现公司是外包全职_我如何通过全职工作,伴侣和3岁的双胞胎男孩打造产品...
  2. B2B行业网站编辑轻松创造内容,提高搜索权重
  3. Python运算符与Pandas方法的映射关系
  4. python连接linux获取日志_Python 日志记录模块logging的使用
  5. CentOS 7 如何按行删除文件内容
  6. boost::char_separator相关的测试程序
  7. 辗转相除求最大公约数
  8. Java 算法 比赛安排
  9. PCL之多可视化窗口
  10. python爬取资源网站资源
  11. 幅相曲线渐近线_对数幅频特性渐近线的绘制
  12. VUE源码解析(持续更新)
  13. Kafka 数据丢失问题
  14. 6.22 android计算字符高度宽度,红蓝3D图片的制作原理及NDK生成实现
  15. python基础学习笔记
  16. win10 无法拨号上网720错误
  17. 柿子营养丰富 吃柿子的几点注意
  18. MFC Windows程序设计学习笔记--文件和串行化
  19. JavaScript系列之FileReader
  20. android黑色背景图片,Android png透明图片转jpg时背景变黑的解决方法

热门文章

  1. 首个中文多项选择阅读理解数据集:BERT最好成绩只有68%
  2. 如何理解李飞飞价值十亿美金的“人文AI”计划 ?
  3. AI突破难题才能预见未来
  4. Tensorflow—Droupout
  5. torch.full()简介
  6. 不止摩尔定律,计算领域值得学习的定律还有哪些?
  7. 智能如何产生,这仍然是个问题
  8. 李德毅院士:基于驾驶脑的智能驾驶车辆硬件平台架构
  9. 一个诡异的循环:意识何以意识到意识自身?
  10. 量子计算机混战:新贵离子 vs 老派超导体