当前位置:   article > 正文

Java String类详解

java string类详解

java.lang.String;是字符串类型,关于String类,首先需要注意以下几点:

1.字符串一旦创建不可改变。“abc”字符串对象一旦创建,不可再变成“abcd”;

2.提升字符串的访问效率:在程序中使用了“缓存”技术。所以在Java中所有使用“双引号”

括起来的字符串都会在“字符串常量池”中创建一份。字符串常量池在方法区中被存储。

3.在程序执行过程中,如果程序用到某个字符串,例如"abc",那么程序会在字符串常量池

中新建一个“abc”字符串,如果找到就直接拿来用。(字符串常量池是一个缓冲区,为了提高访问字符串的效率)

 

  1. public class StringTest01{
  2.  public static void main(String[] args){
  3.    //创建一个“abc”字符串对象,该对象的内存地址,让s1变量保存。
  4.    //s1是一个引用,s1指向“abc”对象。
  5.    String s1="abc";
  6.    //可以让s1重新指向
  7.    //但是"def"字符串本身不可变
  8.    s1="def";
  9.    String s2="hello";  //在字符串常量池中新建一个"hello"字符串对象,该对象不可变
  10.    String s3="hello";  //从字符串常量池中直接拿来用
  11.    System.out.println(s2==s3);  // true
  12.    //判断字符串是否相等不能用==
  13.    String s4=new String("abc");
  14.    String s5=new String("abc");
  15.    System.out.println(s4==s5);  //false
  16.    //以下程序在执行结束之后,会在字符串常量池中创建三个字符串对象"aaa""bbb""aaabbb"
  17.    String s6="aaa";
  18.    String s7="bbb";
  19.    String s8=s6+s7;
  20.  }
  21. }

 

上述代码中,首先创建一个“abc”字符串对象,并且该对象的内存地址,让s1变量保存,也就是说s1是一个引用,指向“abc”对象。s1="def";是将s1重新指向字符串"def",但是"def"字符串本身不可变。接着创建了一个新的字符串s2,String s2="hello";在字符串常量池中新建一个"hello"字符串对象,该对象不可变,接下来再创建"hello"字符串时发现字符串常量池中已经存在这个字符串了,就不需要再重新创建,直接拿过来就可以用,也就是刚开始讲的第三条,这样做可以提高访问字符串的效率。使用String的时候我们还应该注意:尽量不要做字符串频繁的拼接操作,如上面的String s8=s6+s7,因为字符串一旦创建不可改变,只要频繁拼接,就会在字符串常量池中创建大量的字符串对象,给垃圾回收带来问题。

 

接下来看看不同的方法创建字符串对象的区别。

1.String s1="abc";只会在字符串常量池中创建一个“abc”字符串对象;

2.String s2=new String("hello");会在字符串常量池中创建一个“hello”字符串对象,并且在堆中再创建一个字符串对象。

第二种方式比较浪费内存,常用的是第一种方式。好了,接下来做一道题吧,运用刚刚讲的知识判断以下程序创建了了几个对象?

 

  1. public class StringTest03{
  2.  public static void main(String[] args){
  3.    String s1=new String("hello");
  4.    String s2=new String("hello");
  5.    
  6.  }
  7. }

 

答案是三个,不知道大家有没有做对?

String s1=new String("hello");

String s2=new String("hello");

new出两个字符串对象,所以在堆中有两个对象,因为在Java中所有使用“双引号”括起来的字符串都会在“字符串常量池”中创建一份,字符串常量池在方法区中被存储,所以方法区的字符串常量池中一个,堆中的两个加常量池中的一个,就是最后的答案。

 

最后再来看看关于字符串常用的构造方法。

 

  1. /*
  2. 关于字符串常用构造方法
  3. */
  4. public class StringTest05{
  5.  public static void main(String[] args){
  6.    //1.
  7.    String s1="abc";
  8.    //2.
  9.    String s2=new String("abc");
  10.    //3.
  11.    byte[] bytes={97,98,99,100};
  12.    String s3=new String(bytes);
  13.    System.out.println(s3);   //abcd   String已经重写了Object中的toString方法
  14.    //4.
  15.    String s4=new String(bytes,1,2);   //1代表起始下标,2代表长度
  16.    System.out.println(s4);   //bc
  17.    //5.
  18.    char[] c1={'我','是','中','国','人'};
  19.    String s5=new String(c1);
  20.    System.out.println(s5);   //我是中国人
  21.    //6.
  22.    String s6=new String(c1,2,2);
  23.    System.out.println(s6);  //中国
  24.    }
  25. }
  26. wx搜索“程序员考拉”,专注java领域,一个伴你成长的公众号!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/321938
推荐阅读
相关标签
  

闽ICP备14008679号