从字符串的创建角度去分析字符串的面试题
1、字符串到底存储在哪?
首先看看Java数据存储在哪?堆 & 栈 & 常量池
TIPS:
堆:存放所有对象的引用,并不存放对象。
栈:存放new 出来的对象。
常量池:存放字符串常量和基本类型常量。
对于String,直接双引号定义的存储在常量池中,new出来的存在栈中,引用全部是放在堆中。
equals比较出相等的字符串:
常量池永远只有一份,指向的永远是一个地址。
栈中有多份,且指向也不一样的。
扩展:
堆内存和栈内存的区别?
java中堆内存就是存放实例对象的,基本上实例对象都在这个地方。被所有线程共享。如果堆内存没了,又不分配那么就会出现OutOfMemoryError错误。
java中栈内存,线程私有!!捆绑线程的生命周期,每个java方法执行时会创建属于自己的栈帧。Java方法的调用到执行完成对应一个栈帧的入栈到出栈的过程。
2、String 数据比较到底比什么?
== 判断两个对象是不是一个对象
equals 判断两个 对象的值是不是一样
3、字符串创建说明
到底什么是直接创建,什么是new?
直接创建 >>>> String str = "a" + "b" + "c"; String str = "abc";
new >>>> String str = new String("abc");
String str1 = "ab"; String str2 = "c"; String str3 = str1 + str2; 注意 这个在创建str3的时候是new;
4、一个小例子
public class testString { public static void main(String[] args) { String str1 = "ab"; String str2 = "c"; String str3 = str1 + str2; String addStr ="ab" + "c"; String str = "abc"; String newStr = new String("abc"); System.out.println(str3 == str); //false System.out.println(str == "abc"); //true System.out.println(newStr == "abc" );//false System.out.println(str == newStr);//false System.out.println(str3 == newStr );//false System.out.println(newStr.equals(str3)); } //记住这里所有的equals 比较都是true }