目录

1. String类是什么

1.1 定义

1.2 类结构

1.3 所在的包

2. String类的底层数据结构

3. 关于 intern() 方法(重点)

3.1 作用

3.2 字符串常量池(String Pool)

4. String类所用的连接符

5. String类的主要作用(简)

正文

1. String类是什么

1.1 定义

String类表示字符串。Java程序中的所有字符串都是这个String的实例,比如"abc"。字符串为常数,它们的值在创建之后不能更改。因为字符串对象是不可变的,避免了现线程安全问题的出现,所以可以共享它们。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

问:“字符串为常数,它们的值在创建之后不能更改”——①这句话的具体表现(从String的使用角度出发)?②为什么要一经创建就不可更改?③怎么做到一经创建就不可更改的?

答:

①通过调用String的方法我们可以发现,String并未真正提供“字符串的修改”方法,诸如replace这类的字符串替换方法,也只是创建一个新的字符串来替换,而非在原字符串上进行替换;

②这个问题从字符串的使用场景来解释比较好理解:从用户使用时的安全性考虑(线程安全),八种基本数据类型的“复制”是再新创建一份相同的数据,而String其实也相当于是一种基本的数据类型,只是它有引用,比较复杂一些,所以字符串要一经创建就不能更改。

③封装:虽然String的底层数据结构是char数组(数组的内容是可以更改的),但是,String将该字段声明为private,且并不对外暴露修改数组内容的方法。

1.2 类结构

public final class String implements java.io.Serializable, Comparable, CharSequence{……}

① final:String类不能被继承;

② Serializable:可序列化;

③ Comparable:用于字符串之间的比较;

1.3 所在的包:java.lang

java.lang包是java语言的核心,它提供了java中的基础类。包括基本Object类、Class类、String类、基本类型的包装类、基本的数学类等等最基本的类。

2. String类的底层数据结构

private final char value[];//不可变的字符数组

问1. 如果说String的底层数据结构是“不可变的char数组”,那不应该是声明为“ private final char[] value;”吗?

答:这也是数组的一种声明方式,只是比较少见、少用,或许因为历史原因所以String保留使用着这种不常用的数组声明方式。

问2. 不可变的字符数组的声明只能保证String对象的引用不可变,而用了char数组来作为存储结构,只能保证字符串一经声明其长度不可变,但是数组中存储的内容时可以改变的,从何保证字符串一经声明就不能再变呢?

答:见 1.1的第③点;

3. 关于 intern() 方法(重点)

3.1 作用:该方法用于返回字符串对象的规范表示形式。

public native String intern();//native方法,看不到具体实现。

当调用intern方法时:

①如果字符串常量池中已经包含了一个由equals(object)方法确定的String对象的字符串,则返回池中的字符串。

②否则,将这个 String对象添加到池中(这是JDK1.8中intern()方法的注释给出的说明,但通过下面的测试,我认为是“将这个String对象的字符串内容添加到池中”会更好理解),并返回对这个String对象的引用。

@Testpublic voidtest() {//池中没有相应的字符串内容:

String s1 = new String("hello");//在堆中生成"hello"字符串对象

String s2 = s1.intern();//执行“s1.intern()”时,String Pool中没有"hello",会直接先将s1对象的字符串内容“hello”复制到池中

System.out.println(s1 == s2); //false,s1指向堆中的对象,s2指向字符串常量池中的字符常量。

System.out.println(s1.intern()); //hello//池中有:

String s3 = "world"; //直接在String Pool中生成"world"字符串

String s4 = s3.intern(); //从池中拿"world"字符串返回给s4

System.out.println(s3 == s4); //true

}

3.2 字符串常量池(String Pool)

字符串常量池最初是空的,由类 String私下维护。

(1)在哪儿

在JDK6及之前版本:字符串常量池是放在永久代中;

在JDK7版本中:字符串常量池被移到了堆中。

(2)数据结构

在HotSpot VM中字符串常量池是通过一个StringTable类(一个Hash表,并非java实现类,所以知道即可)实现的;这个StringTable在每个HotSpot VM的实例中只有一份,被所有的类共享;

(3)存放的内容

在JDK6及之前版本:String Pool里放的都是字符串常量;

在JDK7.0中:由于String.intern()发生了改变,因此String Pool中也可以存放放于堆内的字符串对象的引用。

(4)特性:常量池中不存在两个相同的对象

(5)字符串常量池存在的意义(为什么要有它?):避免字符串常量的重复创建,节省内存空间。

(6)什么情况下生成的字符串才会被放到String Pool中?

① 字面量:代码中直接使用双引号引着的字符串都会被存储到字符串常量池中,如:String abc = "abc";;

② 调用String的 intern()方法,如果字符串内容是字符串常量池中没有的,那么会先复制一份内容到字符串常量池中;

4. String类所用的连接符

Java语言为“+”连接符以及将对象转换为字符串提供了特殊的支持:

字符串对象可以使用“+”连接其他对象。其实字符串连接是通过StringBuilder(或 StringBuffer)及其 append()方法 实现的。

字符串转换是通过 toString()方法实现的,该方法由Object定义,并由Java中的所有类继承。

5. String类的主要作用(简)

①检查序列的单个字符、

②比较字符串、

③搜索字符串、

④提取子字符串

⑤创建一个字符串的副本的方法,

⑥大小写转换;

⑦更多;

java字符串常量池长度_Java String类相关知识梳理(含字符串常量池(String Pool)知识)...相关推荐

  1. Java · 认识 String 类(上)· 创建字符串 · 字符串比较相等 · 字符串常量池 · 字符串不可变 · 字符字节与字符串

    目录 一.创建字符串 二.字符串比较相等 三.字符串常量池 3.1 直接赋值的内存情况 3.2 采用构造方法的内存情况 四.理解字符串不可变 五.字符.字节与字符串 5.1 字符与字符串 5.2 字节 ...

  2. 【C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )

    文章目录 C++ 字符串 对象 C++ 字符串 对象 创建方法 C++ 字符串 对象 输出到控制台 C++ 字符串 拼接 C++ 字符串 方法调用 ( 栈内存对象 ) C++ 字符串 方法调用 ( 堆 ...

  3. java的知识点15——String基础、String类和常量池、String类常用的方法、字符串相等的判断、组合模式

    String基础 1. String类又称作不可变字符序列. 2. String位于java.lang包中,Java程序默认导入java.lang包下的所有类. 3. Java字符串就是Unicode ...

  4. String类菜鸟级教程(字符串常量池及不可变,StringBuffer 和 StringBuilder)

    文章目录 前言 1.创建字符串 2.字符串比较相等 2.1字符串传参 3.字符串常量池 4.字符串创建实例分析 5.理解字符串不可变 6.字符, 字节与字符串 6.1字符与字符串 6.2字节与字符串 ...

  5. java 常量 内存分配_Java内存分配之堆、栈和常量池

    寄存器:最快的存储区,位于不同于其他存储区的地方--处理器内部.寄存器的数量极其有限,所以寄存器由编译器根据需求 进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. 栈:存放基本类型 ...

  6. Java 中String 类的不可变性与字符串拼接解析

    目录 一.String 类是不可变的 1.1 不可变的原因 1.2 不可变的好处 二.字符串的"+" 拼接 2.1 官方解释 2.2 append() 方法 2.3 具体实现 2. ...

  7. java 常量池 堆_Java 内存分配(堆、栈、常量池)

    Java内存分配: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,以及成员方法中的局部变量 ◆堆:存放对象本身(成员变量+成员方法的引用) ◆静态域:存放在对象中用static ...

  8. java怎么定义字符长度_java – 当字符串长度超过列长度定义时,如何以静默方式截断字符串?...

    我有一个Web应用程序,使用EclipseLink和MySQL存储数据. 其中一些数据是字符串,即DB中的varchars. 在实体代码中,字符串具有如下属性: @Column(name = &quo ...

  9. java character是什么意思_Java Character 类

    利用Character提取字符串中的大写字母和小写字母: public class UpperLowerCase { /* * 利用Character类提取字符串中的大写字母和小写字母 * @auth ...

最新文章

  1. 一文为你详解2D与3D人脸识别有什么区别?
  2. python ndarray
  3. 东芝再曝财务造假丑闻 日企百年老店怎么了?
  4. PowerShell因为在此系统中禁止执行脚本
  5. Tensorflow-gpu安装
  6. 深度译文:机器学习那些事
  7. SAP中事务代码ME2N中引出的表格里,仍要Invoice数量是什么含义?
  8. mysql创建只读权限用户_新品速递 | Harbor 修复权限提升漏洞,MySQL Plus 支持密码强度校验以及审计功能...
  9. MySQL下perror工具查看System Error Code信息
  10. WebView::drawExtras
  11. UIButton和UIimageView
  12. C语言课后习题(53)
  13. MongoDB数据库因安全漏洞,导致Family Locator泄露二十多万名用户数据
  14. Linux建立信任主机
  15. C/C++编程语言中枚举类型(enum)介绍
  16. 每日算法系列【LeetCode 810】黑板异或游戏
  17. Python 时间序列数据平滑去噪 Savitzky-Golay滤波器
  18. Python 递归函数计算阶乘
  19. Android网络收音机项目
  20. Qt入门教程【Core篇】Layout布局(布局管理器、手动布局)

热门文章

  1. 办公自动化-带样式的表格xlutils库-0223
  2. django-命名空间与反向解析-模板反向解析-视图反向解析
  3. linux-vim编辑器简览
  4. Android 应用内更新 Support in-app updates [GP官方支持]
  5. fzyzojP2291 -- 小添添的庄园之道路修复
  6. 【python接口自动化-requests库】【三】优化重构requests方法
  7. 根据个人亲身进阶架构师经历系统构建20大进阶架构师专题!
  8. MySQL 大表优化方案,收藏了细看!
  9. window.open完美替代window.showModalDialog
  10. 设置环境变量ANDROID_SDK_HOME有什么用?