编程语言
首页 > 编程语言> > Java String 字符串(未完结)

Java String 字符串(未完结)

作者:互联网

若发现文中有描述不当的地方欢迎评论指出,谢谢大家在这里插入图片描述

String类源码分析

String类被final修饰,不可被继承,其方法则隐式被final修饰,不能被重写

实现接口

成员属性

/** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
成员属性说明
private final char value[]可以看出String类其实时通过这个char数组保存字符串
private final int hash通过hashCode方法将一个字符串映射成一个整数
private static final long serialVersionUID = -6849794470754667710L;实现Serializable接口的目的是为类可持久化,serialVersionUID适用于java序列化机制。Java序列化的机制是通过 判断类的serialVersionUID来验证的版本一致的。

构造方法
构造方法有多种重载形式
常用构造方法如下:

public String() {
    this.value = "".value;
}

public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}

第一个空参构造生成一个 “” 空字符串,第二个构造方法是将一个已存在的字符串的value和hash值复制。

Tips:
JDK1.7以及之后的版本的JVM已将常量池从方法区移除,在Heap堆中开辟了一块区域存放运行时的常量池。
自JDK1.8起,java的方法区被位于内存的元空间代替。
创建字符串常用的两种方式有何不同:
Java中的String pool存在于方法区而非堆栈,是常量池Constant pool中的一部分
。变量一般存在于栈中因其是可变的。常量池指的是编译期被确定并保存在.class文件中的数据。例如int i=1; String s = “hello”;都被看做常量,JVM会将他们统一放在常量池中。

常用第一种创建字符串的方式:String str1 = new String("hello");
这种方式JVM会直接在堆中创建一个String对象,而不会主动的将对象存入String pool中维护。
常用第二种创建字符串的方式:String str2 = "hello";
这种方式JVM首先会在String pool通过equals方法查找是否存在该String对象,如果有则直接返回,而不是像方式一中那样不先查找而直接创建一个对象,通俗的说就是JVM会去String pool中寻找内容相同的字符串并返回地址。如果String pool中没有该String对象,JVM则会在堆中创建一个新的String对象,返回引用同时也会将引用加入String pool中。

还有其他方式创建字符串,如String s = str1 + str2;//s1,s2为变量JVM会在堆上直接创建str1和str2,即便s1和s2指向的对象在池中已经存在,也会将值拷贝到对象创建新对象,然后创建str1+str2并赋给s。

常用方法

标签:Java,String,未完结,int,value,JVM,字符串,final
来源: https://blog.csdn.net/super__x/article/details/108903164