Java基础之 String类原理分析

在这里插入图片描述
看地址相等吗 不相等 s1!=s2
若是看equals值 它俩是相等的
在这里插入图片描述
这张图 是上面的代码画出来的 栈 和 堆 堆里面有常量池 常量池里面有 粪粪 堆里还有一个对象 粪粪
但若是 单看String s = new String("粪粪");
所画出来的图还是上面那张
首先根据 粪粪这两个字 去堆里的常量池寻找有没有 没有就创建粪粪 (就是常量池要放上使用过的字符串常量 方便以后使用 )
又因为它是new一个 所以在堆里要创建一个粪粪对象

在这里插入图片描述
第一行 在编译时 变量a的值就为a
第二行 在编译时 a1的值不能被确定 因为编译是一行一行代码走的 编译第二行时 跟第一行没有关系 所以不能确定a的值 所以也不能确定a1的值 是在运行期的时候第一行走了 确定了a的 再走第二行 a1的值才确定 字符串连接操作 a1的值是a1
第三行在编译时可以直接确定 因为值是字符串
所以 a1 第二行 会在堆中创建值
a2 第三行 会在常量池中创建
所以a1 a2 地址不相等 结果fals
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190416093839567.png
第二种情况
b被定义为final 即常量
所以b1在编译期就确定了值 所以此次比较返回值是true
在这里插入图片描述
第三种情况 方法在编译期是不运行的 所以结果是false
在这里插入图片描述
第四种情况 结果依然是false 注意虽然定义d为常量 但方法仍然是在运行期才执行 即在运行后 d这个常量才确定值

package com.vince;

/**
 * 
 * @author vince
 * @description
 * String 表示一个字符串,内部使用字符数组实现,不能被继承(最终类),不可变
 */
public class StringDemo {

	public static void main(String[] args) {
		
		//String 的两种赋值方式,JAVA推荐使用第一种方式
		
		//1 直接赋值
		String s1 = "粪粪";
		//2 使用new关键字创建对象,new:表示申请内存空间
		////面试题 问以下代码创建了几个对象? 2个
		String s2 = new String("粪粪");
		
		String s3 = "粪粪";
		
		System.out.println(s1==s2);
		System.out.println(s1==s3);
		System.out.println("-----------------");
		//代码示例:4种情况分析:直接赋值字符串连接时,考虑编译期和运行期
		//如果在编译期值 可以被确定,那么就使用已有的对象,否则会创建新的对象
		String a = "a";
		String a1 = a+1;
		String a2 = "a1";
		System.out.println(a1==a2);
		
		final String b = "b";
		String b1 = b+1;
		String b2 = "b1";
		System.out.println(b1==b2);
		
		String c = getC();
		String c1 = c+1;
		String c2 = "c1";
		System.out.println(c1==c2);
		
		final String d = getD();
		String d1 = d+1;
		String d2 = "d1";
		System.out.println(d1==d2);
	}
	
	private static String getC(){
		return "c";
	}
	private static String getD(){
		return "d";
	}

}

在这里插入图片描述
在这里插入图片描述
最后注意上边跟这张一样的图
注意 粪粪 这两个字 自始至终就只有一个 在常量池中
堆里面常量池外面的那个粪粪 存的其实是常量池那个粪粪的地址
并不是存的粪粪这俩字

猜你喜欢

转载自blog.csdn.net/C_time/article/details/89326854