10String,StringBuffer,StringBuilder(equals和==)

1String

1.1String字符串常量

  • String只有常量没有变量
    String的值放在String常量池中,并且不会被JVM释放

上栗子:

		String str1 = new String("abc");
		String str2 = new String("abc");
		System.out.println(str1==str2);		//false
		System.out.println(str1.equals(str2));	//true
		
		String str3 = "abc";
		String str4 = "abc";
		System.out.println(str3==str4);		//true
		System.out.println(str3.equals(str4));	//true

输出结果是:

false
true
true
true
疑问:str1==str2是false,而str3==str4就为true。(前者是比较引用(用了new),后者是赋值比较)。

str1.equals(str2)为true。(equals是比较引用的值)(其实equals和==本质上没区别,只是String重写了equals方法)

看内存模型解析:

10String,StringBuffer,StringBuilder(equals和==)_第1张图片

解析:

str1和str2都是new出来的,所以str1和str2分别指向堆中的内存块。但注意的是String值不是在堆中的,而是在String常量池中,所以说String是常量字符串。

并且它的值是不会被释放的,而是一直停留在常量池中(就算是没有被引用夜不会被释放),例如:

		String str1 = "abc";
		str1 = "dfg";
		str1 = "ttt";
看内存:只画String常量池

10String,StringBuffer,StringBuilder(equals和==)_第2张图片

执行完语句后str1最终指向了ttt,但其它的abc,dfg都还会存在内存中,不会被JVM回收。



2Stringbuffer和StringBuilder

其实这两个类都差不多,只不过一个线程安全(StringBuffer),一个线程不安全(StringBuilder),一般来说String类不会晕倒线程不安问题,建议使用StringBuilder(线程不安的速度快)

因为String是字符串,所在拼接字符串操作会产生大量内存,StringBuilder就能很好的解决这个问题

看栗子:
这段代码会拼接100次字符串就会有100块内存,但是有用的只有最后一块

	String str = "";
		for(int i=0;i<100;i++){
			//拼接字符串,这就要拼接100次
			str = str+i;
		}
		System.out.println(str);//输出结果是:01234.......99
看内存:只画了String常量池

10String,StringBuffer,StringBuilder(equals和==)_第3张图片

所以就需要用StringBuilder来解决这个问题。

上栗子:

		//实例化Stb
		StringBuilder stb = new StringBuilder("");
		
		for(int i=0;i<100;i++){
			//用append()方法拼接
			stb.append(i);
		}
		
		System.out.println(stb);//输出结果是:01234.......99

所以建议在做拼接字符串处理的是用StringBUilder





你可能感兴趣的:(java基础(学习笔记),java,string)