浅谈String

String 用于表示字符串,生成的时候有两种方式:

1 .用双引号 String str1="god" ;

此方法生成的字符串,引用地址指向,,先去字符串常量池中寻找是否有此字符串,若是有,则直接拿来引用,反之,存储此字符串在字符串常量池中。

2.用String类的构造函数String str2=new String("god");

此方法生成的字符串,引用地址指向,,先去字符串常量池中寻找是否有此字符串,若是有,则在字符串常量池中复制一个到堆(heap)中,则此方法生成的字符串生成一个对象,若是没有,就在字符串常量池和堆中创建此对象,而不是在堆中创建此对象复制到字符串常量池中,则此方法生成的字符串生成两个对象。

\color{red}{类不能被继承,并且它的成员方法都默认为final方法,String 对象创建后不可改变,String对象的任} \color{red}{何改变都不影响到原对象,相关的任何操作都会生成新的对象。(所以常量池中不会出现两个相同的字符串)}

同一个字符串反复出现,如何节省内存空间的问题:
1.7环境

注: ==比较的是变量(栈)内存中存放的对象的内存地址,则比较的是 是否为相同对象;equal比较的是值是否相等

当多次new一个相同的字符串的时候,(new String都是在堆上创建字符串对象),可以用String的intern()方法,str2.intern();调用intern(),编译器会将字符串(1.7后则是将在堆上的地址引用复制到常量池)添加到常量池中,并返回指向该。因常量池中不会出现两个相同的字符串,所以下次调用intern()的时候,直接返回。

则:

 //第一行
   String a="happy";
        //第二行
  String b=new String("happy");     
  a==b//返回 false
  a==b.intern() //返回 false
//第一行
  String b=new String("happy");    
//第二行
  String a="happy";
  str1==str2   //返回 false
  str1==str2.intern() //返回 true

待续

你可能感兴趣的:(浅谈String)