String类 String 字符串的比较 String 字符串值不可变

我们经常使用String声明一个字符串,相信大家应该对这个不陌生吧,但是要是仔细看,会发现String声明时单词首字母大写,所以String本身也是一个类,但是它在使用时有较多的要求,而且在Java中也算是个比较特殊的类,那么下面我们讲讲吧。首先来看个一个程序。
[java]   view plain  copy
  1. public class CompareStringTest {  
  2.     public static void main(String[] args) {  
  3.         String str0 = "hello";  
  4.         String str1 = "hello";  
  5.         String str2 = new String("hello");  
  6.         String str3 = str2;  
  7.         System.out.println("str0==str1-->"+(str0==str1));  
  8.         System.out.println("str1==str2-->"+(str1==str2));  
  9.         System.out.println("str1==str3-->"+(str1==str3));  
  10.         System.out.println("str2==str2-->"+(str2==str2));  
  11.     }  
  12. }  
  13. /** 
  14. str0==str1-->true 
  15. str1==str2-->false 
  16. str1==str3-->false 
  17. str2==str2-->true 
  18. **/  

上面的例子中我们可以看到使用了两种方式对字符串进行赋值,而且从效果上看没有什么却别,那么实际上呢? 看看结果我们可以发现,比较时并不全是true那这又是怎么回事儿呢,看看内存分布也许会明白些。

可以看到 两种方式赋值后,在内存中分布并不一样, 其中str0,str1 使用对象池的世界思路(共享设计),即在对象池中保存多个对象,新实例化的对象如果在对象池中,那么则不再重复新定义,而是从对象池中直接取出来直接使用。因此,可知str0,str1指向的是同一个堆内存。而采用new String()不管是否存在,都会在堆内存中新开辟空间,所以指向堆内存地址不同。


.字符串的比较(==和 equals 区别)

先解释一下两者的区别

== : 比较的是地址值,由上图可以见 两种方式赋值在内存的值是不同的;

equals: 比较的是具体的内容,因此可以想象,如果使用equals 在上述例子中,结果应该全是true. 

故而equals 在开发中比较常用。


字符串的内容不可变

使用String 类进行操作时还有个特性是特别重要的,那就是字符串的内容一旦声明则不可改变,


[java]   view plain  copy
  1. public class NoneChangedString {  
  2.     public static void main(String[] args) {  
  3.         String str = "hello"//String类的将匿名对象“hello”的对使用权交给str  
  4.         str +=",world!";  
  5.         System.out.println(str);  
  6.     }  
  7. }  
  8. //结果 hello,world!  

从结果看 ,结果变了,那么实际呢,看内存分布:


从图中可知,这种方式是断开了已有的连接,然后再指向新的连接。知道了后,那么我要避免下面操作:

[java]   view plain  copy
  1. public static void main(String[] args) {  
  2. String str = "zhangsan";  
  3. for (int i = 0; i < 100; i++) {  
  4.     str +=i;  
  5. }  
  6. System.out.println(str);  
  7. }  
有人就要问了,为什么要避免这种使用呢,因为这意味着字符串的指向要“断开-连接”100次,此程序的代码性能很低的,那么如果需要实现这种需要那么我可以用StringBuffer来代替。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值