关于String的一些问题

关于equals()和==:

对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是 比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。

关于String是不可变的:

我们都知道String的实例一旦生成就不会再改变了,比如说:String str = “hello” + " " + “world” + “!”; 就是有4个字符串常量,首先”hello”和” ”生成了”hello ”存在内存中,然后”hello ”又和” world” 生成 “hello world“存在内存中,最后又和"!"生成了”hello world!”;并把这个字符串的地址赋给了str,就是因为String的”不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。

几个关于String的问题:

  1. String中的final的使用
final StringBuffer a = new StringBuffer("111");
final StringBuffer b = new StringBuffer("222");
a=b;//此句编译不通过
final StringBuffer a = new StringBuffer("111");
a.append("222");// 编译通过

对于加了final的string类型数据,final只对引用的值(即内存地址有效),它使得引用只能指向初始的那个对象,改变它的引用地址会导致编译时的错误,但是对于引用地址中对象值的变化,final是不负责任的。即用append修改引用地址对象的值是可以的。

几个常见例子的分析:

 String a = "a1";   
 String b = "a" + 1;   
 System.out.println((a == b)); //result = true  
 String a = "atrue";   
 String b = "a" + "true";   
 System.out.println((a == b)); //result = true  
 String a = "a3.4";   
 String b = "a" + 3.4;   
 System.out.println((a == b)); //result = true 

分析:JVM对于字符串常量的"+“号连接,将程序编译期,JVM就将常量字符串的”+“连接优化为连接后的值,拿"a” +
1来说,经编译器优化后在class中就已经是a1。在编译期其字符串常量的值就确定下来,故上面程序最终的结果都为true。

 String a = "ab";   
 String bb = "b";   
 String b = "a" + bb;   
 System.out.println((a == b)); //result = false

分析:JVM对于字符串引用,由于在字符串的"+“连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a” +
bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。

 String a = "ab";   
 final String bb = "b";   
 String b = "a" + bb;   
 System.out.println((a == b)); //result = true 

分析:和[3]中唯一不同的是bb字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量
池中或嵌入到它的字节码流中。所以此时的"a" + bb和"a" + "b"效果是一样的。故上面程序的结果为true。
String a = “ab”;

final String bb = getBB();   
String b = "a" + bb;   
System.out.println((a == b)); //result = false   
private static String getBB() {  return "b";   }

分析:JVM对于字符串引用bb,它的值在编译期无法确定,只有在程序运行期调用方法后,将方法的返回值和"a"来动态连接并分配地址为b,故上面
程序的结果为false。

总结:

字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是王小贱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值