Java String对象

 

package org.onepiece;

import java.lang.String;

public class Main {

    public static void main(String[] args) {

        //常量
        String str1 = "abc";
        String str2 = "abc";

        //变量
        String newStr1 = new String("abc");
        String newStr2 = new String("abc");


        //String == 操作符比较的是:引用地址(内存)是否一致
        println( str1 == str2 );       //true
        println( str1 == newStr2 );    //false
        println( newStr1 == newStr2 ); //false


        //String equals()方法比较的是:比较值是否相等
        println( str1.equals(str2) );      //true
        println( str1.equals(newStr2) );   //true
        println( newStr1.equals(newStr2) );//true
    }

    private static void println(Object obj) {
        System.out.println(obj); //sout
    }
}

String str1 = "abc" ;定义的是一个常量。

在常量池(堆空间)中开辟了一块空间,在其中存放了字符串"abc",并通过str1对象指向这个常量对象。

 

String newStr1 = new String("abc");通过 new 关键字,定义了一个变量。

在堆空间中通过 new关键字开辟了一块内存,在其中存放字符串"abc",并把内存的地址(引用地址)赋予newStr变量。

 

str1 和 str2 两个常量,它们是存放在常量池中。Java虚拟机会对常量池进行优化。

str1 和 str2 这两个常量的值相同,因此它们是存放在一个空间中的。也就是说 str1 和 str2 这两个引用是指向同一块内存。

 

str1 和 newStr1 分别处在常量池和堆空间中,因此它们的内存地址不可能一致。 

如果通过 new关键字来创建字符串,即使它们的值是一致的,但是它们是处在内存的两个不同的空间中。

 

package org.onepiece;

import java.lang.String;

public class Main {

    public static void main(String[] args) {

        String str = "abc"; //常量

        String a = "a";        //常量
        String b = a + "bc";   //变量
        String c = "a" + "bc"; //常量


        println(str == b); //false
        println(str == c); //true
        println(b == c);   //false


        println(str.equals(b));//true
        println(str.equals(c));//true
        println(b.equals(c));//true
    }

    private static void println(Object obj) {
        System.out.println(obj); //sout
    }
}

 String a = "a";定义了一个常量a,它的值是"a"。

String b = a + "bc";是一个字符串的连接操作。引用的a对象已经是一个变量,所以b是变量。

String c = "a" + "bc";执行了两个常量的连接操作,根据Java虚拟机的优化操作,c对象是一个常量。

 

结论:

1、String常量存放在常量池中,Java虚拟机出于优化的考虑,会让内容一致的对象共享共享内存块。

但变量是放在堆空间中的,new 定义的不同变量内存地址不会相同。 

2、String常量连接常量,依然用常量池管理,但变量连接变量就是变量。

 

posted @ 2019-07-23 21:59  茗::流  阅读(128)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。