java基础系列(三)之--java字符串

来源:互联网 发布:好桌道软件下载 编辑:程序博客网 时间:2024/05/29 14:55

字符串String

  • 所在包:java.lang.String
  • 类修饰 :public final class String implements java.io.Serializable, Comparable, CharSequence
  • 成员变量:
    • private final char value[];
    • private int hash; // Default to 0
    • private static final long serialVersionUID = -6849794470754667710L;
    • private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
  • 常用构造方法:
    • public String() {
      this.value = “”.value;
      }
    • public String(String original) {
      this.value = original.value;
      this.hash = original.hash;
      }

理解:

  • final修饰

    • final修饰的类不能被继承。只能用,不用继承
      final不仅可以修饰类,还可以修饰变量,被final修饰的变量就是一个常量,只能赋值一次
    • 所以String类是不能继承的,而且通过String的构造方法可以看出,new String 操作产生的变量也是final修饰的,所以: String类是不可变的(final),对String类的任何改变,都是返回一个新的String类对象。

  • String池机制

    • 上文讲了Sting是由final修饰而且String的成员变量也由fianl修饰,导致new String每次都会产生新的对象在内存中开辟新的空间,然而这样是不够的,大神们对String进行优化,最重要就是String池机制:
      • String是不可改变的,为了提高效率Java引用了字符串池的概念,例如new String(“abc”);首先会在 String池中创建一个对象“abc”,因为有NEW的存在所以会分配地址空间copy String池的内容。当出现的String对象在String池中不存在时即在String池中创建该对象。
      • 解释一下:为什么使用池机制,这里优化这块就不多说了,说说引用和变量的生命周期,一个类的引用的生命周期:在初始化一个类的实例的时候,会经过一系列过程,不多说了,将这个类的实例创建,并在内存中开辟空间保存,类的引用会保存在一块内存区域(栈区),而产生的实例内容保存在(堆区),当引用的指向有内容时,jvm就会认为这个引用还有用,当引用的指向没有内容也就是null时,jvm认为它是个垃圾就回收了。所以有这么个前提下,池在可能被使用,因为你之前创建的内容都会存活在内存中,并没有死去,为了节省空间和创建过程花费的时间,就诞生了池技术,这个还是很强大的,后期可以延伸到request–>data(if(缓存存在)返回缓存的内容 else(查数据库) )—这样就节省了,数据库连接的创建和查询和返回的时间和开支,极大的提升了系统性能。下面附代码:
        public static void main(String[] args) {    String str="123";    System.out.println(str);    String str2=new String(str);    String str3=new String("123");    System.out.println(str2);    System.out.println("hashcode:"+str.hashCode());    System.out.println("hashcode:"+str2.hashCode());    System.out.println("hashcode:"+str3.hashCode());    System.out.println(str3);    str2=null;    System.out.println(str2);    System.out.println(str3);    System.out.println("hashcode:"+str.hashCode());    System.out.println("hashcode:"+str3.hashCode());}
2 0
原创粉丝点击