Java_基础_String 的比较

从字符串的创建角度去分析字符串的面试题

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
}

猜你喜欢

转载自blog.csdn.net/lizhi1817/article/details/80521119