我看JAVA 之 String

简介: 我看JAVA 之 String 注:基于jdk11 String 在java语言中用来表示字符串,所有的字符串(比如“abc”)都String的实例对象。 String是常量,一旦创建不可以被修改,可以使用StringBuffer创建可变字符串。

我看JAVA 之 String

注:基于jdk11

String

在java语言中用来表示字符串,所有的字符串(比如“abc”)都String的实例对象。
String是常量,一旦创建不可以被修改,可以使用StringBuffer创建可变字符串。
String类提供了字符串比较,查找,拷贝,大小写转换等操作。大小写转换基于标准的Unicode.  
字符串拼接”+”:根据不同版本的jdk会有不同实现,如StringBuilder、StringBuffer、StringConcatFactory(invokeDynamic)

实现了如下接口

1. java.io.Serializable
2. Comparable<String>
3. CharSequence 提供对字符数组多种只读形式的统一访问方法规范

几个重点的成员变量

/**
 * jdk9开始使用byte[]存储字符串,1.8及之前使用char[]保存
 */
@Stable
private final byte[] value;

/**
 *  coder用来表示此字符串使用的编码,coder=0使用LATIN1,coder=1使用UTF16
 *
 *  LATIN1 是8比特的字符集,定义了256个字符。前128个字符与ASCII完全一致,即为ASCII的超集
 *  UTF16  是可变长度编码。可以是一个或二个16比特。
 *  根据不同的编码由不同的工具类实现String的内部编码,Latin1对应StringLatin1,UTF16对应StringUTF16
 *
 */
private final byte coder;

/** 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;

/**
 * 如果关闭压缩,字符串的bytes使用UTF16编码
 *
 * 如下为jit优化方面,为什么不直接初始化COMPACT_STRINGS的值:
 *
 * The instance field value is generally opaque to optimizing JIT
 * compilers. Therefore, in performance-sensitive place, an explicit
 * check of the static boolean {@code COMPACT_STRINGS} is done first
 * before checking the {@code coder} field since the static boolean
 * {@code COMPACT_STRINGS} would be constant folded away by an
 * optimizing JIT compiler. The idioms for these cases are as follows.
 *
 * For code such as:
 *
 *    if (coder == LATIN1) { ... }
 *
 * can be written more optimally as
 *
 *    if (coder() == LATIN1) { ... }
 *
 * or:
 *
 *    if (COMPACT_STRINGS && coder == LATIN1) { ... }
 *
 * An optimizing JIT compiler can fold the above conditional as:
 *
 *    COMPACT_STRINGS == true  => if (coder == LATIN1) { ... }
 *    COMPACT_STRINGS == false => if (false)           { ... }
 *
 * @implNote
 * The actual value for this field is injected by JVM. The static
 * initialization block is used to set the value here to communicate
 * that this static final field is not statically foldable, and to
 * avoid any possible circular dependency during vm initialization.
 * 事实上,COMPACT_STRINGS的值是由JVM填充的
 */
static final boolean COMPACT_STRINGS;

static {
    COMPACT_STRINGS = true;
}

/**
 * Class String is special cased within the Serialization Stream Protocol.
 *
 * A String instance is written into an ObjectOutputStream according to
 * <a href="{@docRoot}/../specs/serialization/protocol.html#stream-elements">
 * Object Serialization Specification, Section 6.2, "Stream Elements"</a>
 */
private static final ObjectStreamField[] serialPersistentFields =
    new ObjectStreamField[0];
    
@Native static final byte LATIN1 = 0;
@Native static final byte UTF16  = 1;

几个重要的方法

    
    1. getBytes()相关
    /**
    *  getBytes() 将当前字符串转换为当前文件系统默认编码格式的字节数组
    *  getBytes(charset) 将当前字符串转换为指定编码格式的字节数组
    */
    public byte[] getBytes(String charsetName)
            throws UnsupportedEncodingException {
        if (charsetName == null) throw new NullPointerException();
        return StringCoding.encode(charsetName, coder(), value);
    }
    public byte[] getBytes(Charset charset) {
        if (charset == null) throw new NullPointerException();
        return StringCoding.encode(charset, coder(), value);
     }
    public byte[] getBytes() {
        return StringCoding.encode(coder(), value);
    }
    2. length()
    /**
    * 返回当前字符串长度,如果是LATIN1字符串长度等于LATIN1格式字节数组长度,否则需要取value.length>>1,长度减半
    */
    public int length() {
        return value.length >> coder();
    }
    3. native intern()
    /**
     * 当调用intern方法时,如果常量池中已经存在equal当前String的对象,那么返回String常量池中的字符串。
     * 否则,当前String对象会被添加到String常量池并且返回常量池中的String对象引用
     * 如果a.intern() == b.intern(),那么a.equal(b) == true
     */
    public native String intern();

几个重要的工具类

1. StringLatin1 提供了启用压缩编码Latin1的情况下的一些常用操作如indexOf、hashcode、replace、trim、strip、compare等
2. StringUTF16 提供了编码为UTF16的情况下的一些常用操作如indexOf、hashcode、replace、trim、strip、compare等
3. StringCoding 提供了为String编解码decode & encode操作
相关文章
|
4月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
49 0
java基础(13)String类
|
26天前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
1月前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
java 为什么 String 在 java 中是不可变的?
|
3月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第14天】Java零基础教学篇,手把手实践教学!
128 65
|
2月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
118 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
5月前
|
Kubernetes jenkins 持续交付
从代码到k8s部署应有尽有系列-java源码之String详解
本文详细介绍了一个基于 `gitlab + jenkins + harbor + k8s` 的自动化部署环境搭建流程。其中,`gitlab` 用于代码托管和 CI,`jenkins` 负责 CD 发布,`harbor` 作为镜像仓库,而 `k8s` 则用于运行服务。文章具体介绍了每项工具的部署步骤,并提供了详细的配置信息和示例代码。此外,还特别指出中间件(如 MySQL、Redis 等)应部署在 K8s 之外,以确保服务稳定性和独立性。通过本文,读者可以学习如何在本地环境中搭建一套完整的自动化部署系统。
77 0
|
26天前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
2月前
|
Java
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
63 7
|
3月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第13天】Java零基础教学篇,手把手实践教学!
65 1
|
3月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
64 2