黑马程序员技术交流社区

标题: 有关String类 [打印本页]

作者: 李前进    时间: 2014-3-29 20:20
标题: 有关String类
String str = "abc";与
String str = new("abc");
有什么不同吗?
作者: Up↑Lee↗    时间: 2014-3-29 20:42
                 String s1 = "abc";  //s1是一个类类型变量, "abc"是一个对象。
                                                //字符串最大特点:一旦被初始化就不可以被改变。

                String s2 = new String("abc");


                //s1在内存中有一个对象。
                //s2在内存中有两个对象。
               


作者: 学习代码    时间: 2014-3-29 20:46
第一个 是建立一个对象,
而第二个是建立了 ,两个对象,new一个就会产生一个对象,而里面的的内容是字符串,也是一个对象

这两个对象的内存地址值是 不同的但是呢里面的内容是相同的

基本上就是这个样子了
作者: Amorvos    时间: 2014-3-29 20:59
String str = "abc";是将“abc”放到常量池里
String str = new("abc");是创建了一个新对象,该对象指向堆中的“abc”
作者: 小武8686886    时间: 2014-3-29 23:00
如果是:String str_1="abc"; String str_2=new String("abc");就明显了。
几个概念吧
1.常量池

  指的是在编译期确定,并被保存在已编译的字节码文件中的一些数据,它包括类、方法、接口等中的常量,也包括字符串常量。

2.==: 比较是否是同一个对象

3.equals(): 比较的是对象里的内容
区别
第1种:

  String a="abc";
  String b="abc";
  System.out.print(a==b);
  结果:true
  原因:编译时,这两个"abc"被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。
第2种:
  String a=new String("abc");
  String b=new String("abc");
  System.out.print(a==b);
  结果:false
  原因:用构造器创建的对象,是不会被放入常理池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。
第3种
  String a="abc";
  String b=new String("abc");
  System.out.print(a==b);
  结果:false
  原因:同上
第4种
  String a="abcdef";
  System.out.print(a=="abcdef");
  结果:true
  原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象
第5种
  String a="abcdef";
  String b="";
  String c=a+b;
  System.out.print(c=="abcdef");
  结果:false
  原因:编译时,先将"abcedf"放在常量池中,而c的值则是在运行时在堆里创建的。所以为false。
作者: 小武8686886    时间: 2014-3-29 23:01
小武8686886 发表于 2014-3-29 23:00
如果是:String str_1="abc"; String str_2=new String("abc");就明显了。
几个概念吧
1.常量池

这个可是我整理半天的啊 亲好好看




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2