Java_String小结

Java_String小结

完全用例子告诉你!不过首先你要清楚问题问的是什么?

首先,因该明白String是引用类型,是一个类,是一个不可变的类,并且有着特殊的作用。
String 只能复制一次!复制后不可改变!

String s = new String(“abc”);
s = new String(“cba”);
 
以上的代码并不是对s进行赋值,而是将“abc”的引用地址,从新赋给了s;
这个过程的内存是怎么分配的呢?



有几个问题要给大家说明一下:


1.String s = new String("abc"); //在运行时涉及几个String实例?
  
    答案:两个,一个是字符串字面量"xyz"所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,另一个是通过new String(String)创建并初始化的、内容与"xyz"相同的实例。


2.String s = new String("abc");// 涉及用户声明的几个String类型的变?

    答案:一个,就一个String s 。


3.String s = null;
  
    Java里变量就是变量,引用类型的变量只是对某个对象实例或者null的引用,不是实例本身。声明变量的个数跟创建实例的个数没有必然关系。


4.String s = new String("abc"); // 创建了几个String Object?

    答案:两个,一个是“abc”——这是一个匿名对象;一个是指向“abc”的引用对象s——这个是将匿名对象的地址赋给了s。


下面我们来看一段代码:

public class text{
   
   public static void main(String[] args){
      //定义一个str
      String str = new String("abc");
      //定义一个str1
      String str1 = "abc";
      //定义一个str2
      String str2 = "abc";
     
      System.out.println(str1 == str);
      System.out.println(str2 == str1);


}
 
}

运行结果是什么呢?




为什么第一个运行结果是false呢?  在这里"==" 其实比较的是他们在堆内存中的地址,因为str 和 str1 在堆内存中的地址不同的所以运行结果是false;
为什么第二个运行结果是true呢?   在这要说明一下,Sting是一个共享式输出类型,在内存中有一个String pool 用于存放String类型中相同的值。所以在给str2赋值的时候,JVM会在String pool中查找是否有与其所赋的值相等,如果相等就将相等的值的地址赋给str2,如果没有则在String pool中新开辟一块控件存放str2的内容。


这是我现在对String的一些理解,如果有错误,希望大家指出来,在这里谢谢大家了!
























你可能感兴趣的:(Java_String小结)