java_String类

来源:互联网 发布:阿里云服务器硬盘扩容 编辑:程序博客网 时间:2024/05/22 02:21

原文地址

class ObjectDemo//其他外部类{    public static void main(String[] args)    {        String s1="a";        System.out.println(s1=="a");    }}

//==比较的是地址,直接定义String a=”asdfghj”(编译时已经确定,指向常量池中)
地址指向常量池中,若判断其是否与”asdfghj”也是与常量池中的字符串asdfg对象相比较,所以返回值是true;
而若是直接定义一个new对象如: String a=new String (“asd”);其地址指向堆内存(运行时在堆内存中确定,编译时不能确定)
用==判断其是否与”asd”相等,自然返回值是false,一个有自己的堆内存,一个指向常量池中;
另外:String s1=”hellow”;
String s2=” world”;
String s3=s1+s2;
用==判断s3是否等于”hello world”返回值是false
因为s3=s1+s2是在运行时刻才能知道的,s3运行时会在堆内存中存在地址
顾一个指向堆内存的地址一个指向常量池,返回false(new对象也在运行时刻知道)
/**

/** * 编译期无法确定 */public void test10(){    String s0 = "ab";     final String s1 = getS1();     String s2 = "a" + s1;     System.out.println("===========test10============");    System.out.println((s0 == s2)); //result = false }private static String getS1() {      return "b";   }

执行上述代码,结果为:false。
分析:这里面虽然将s1用final修饰了,但是由于其赋值是通过方法调用返回的,那么它的值只能在运行期间确定,
因此s0和s2指向的不是同一个对象,故上面程序的结果为false。