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

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

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

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


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

先解释一下两者的区别

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

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

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


字符串的内容不可变

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


public class NoneChangedString {
	public static void main(String[] args) {
		String str = "hello"; //String类的将匿名对象“hello”的对使用权交给str
		str +=",world!";
		System.out.println(str);
	}
}
//结果 hello,world!

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


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

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




你可能感兴趣的:(Java面向对象)