20220921String面试题
1.String s1 = “hsp”;
和String s2 = new String(“hsp”);
这两者的区别在哪里?
String s2 = new String(“hsp”);
1创建对象栈空间
2.1看String常量池,有的话直接拷贝其地址。
2.2没有的话,⭕️在栈中 创建字符串
String s1 = “hsp”;
1看String常量池有无"hsp",有的话拷贝地址
2没有的话,⭕️在String常量池 创建字符串
2.String为什么是不可变字符串?但是我们在实际应用中 String是可以被改变的,能详细说一下嘛?
1.保存字符串内容的池子叫做:value数组
2.value数组有final修饰
小知识点final如何封印变量
1.final修饰基本数据类型:值不可改变
2.final修饰引用数据类型:地址不可改变
3.与==相关面试题
//指向字符串池
String str1 = "java";
//指向字符串池
String str2 = "blog";
String s = str1+str2;
String str1 = "java";
的底层代码String str1 = String.valueOf("java");
这里创建了一个对象
这段代码块总共创建了3个对象
详细:
+ 运算符会在堆中建立起两个 String 对象,这两个对象的值分别是 “java” , “blog” ,也就是说从字符串常量池中复制这两个值,然后再堆中创建两个对象。然后再建立对象 s ,然后将 “javablog” 的堆地址赋给 s 。
String s = str1+str2这句话共创建了3个 String 对象。
实验1
//结果是false
System.out.println(s=="javablog");
实验2
String s = “java” + “blog”;
jvm没有那么傻,这里是创建一个对象
//直接将javablog对象放入字符串常量池中
String s = "java" + "blog";
//结果是true
System.out.println(s=="javablog");
实验3
//不放在字符串常量池中,而是在堆中分分配
String s=str1+"blog";
//结果是false;
System.out.println(s=="javablog");