前言:在介绍字符串常量池之前,我们先来简单了解下Java中字符串的概念以及常见的一些问题.

参考书籍: 《Java核心技术》

参考网站:牛客

作者水平很有限,如果发现错误,麻烦及时告知作者哦!十分感谢!

目录

一、字符串

1.1 子串

1.2 拼接

1.2.1 字符串与字符串拼接

1.2.2 字符串与非字符串拼接

1.3 字符串的不可变性

1.3.1为什么设计成不可变的

1.4 判断字符串是否相等

二、字符串常量池

2.1 字符串常量池的应用

2.1.1 再谈String对象创建

三、面试题

一、字符串

Java字符串其实只是Unicode字符序列,Java本身没有内置的字符串类型,而是在标准Java类库中提供了一个预定类,很自然的叫做String,每一个双引号引起来的字符串都是String类的一个实例:

        String s = "";//空的字符串String str = "Hello";

1.1 子串

提到子串,那就免不了介绍以下subString这个方法了,该方法的功能为:从一个较大的字符串中提取一个子串。

其一为,subString(x,y):(注意这里是左闭右开区间) 所以该方法是截取下标x~y-1 的字符串。

其二为,subString(x) : 该方法是截去前x个字符串后的字符串。

具体情况如下代码:

ps:subString 的工作方式有一个优点,容易计算子串的长度,比如:字符串s.subString(a,b) 的长度就为b-a。

1.2 拼接

1.2.1 字符串与字符串拼接

与绝大多数设计语言一样,Java语言允许使用+号来连接两个字符串。

下述代码将“hello”赋值给了s3变量:

1.2.2 字符串与非字符串拼接

当将一个字符串与非字符串的值进行拼接的时候,后者会转换成字符串,例如:

此特性其实我们经常在打印时候用到:

注意:这里是字符串与非字符拼接并不是字符与非字符拼接:

如果是后者的话;可能会转变成数字,例:

1.3 字符串的不可变性

String类中没有提供修改字符串中某个字符的方法,如果希望将”hello“修改为“help!” ,只能提取想要保存的字符串,再与希望替换的字符串拼接,比如:

分析:

由于不能修改Java字符串中的某个字符,所以Java我、文档中将String类称之为不可变的,不过可以修改s指向的值,让它引用另外的字符串。

可能有人会说,拼接字符串这样的做法是否会降低运行效率呢?

答案其实并不确定,虽然通过拼接的方法,让s2指向了"help!"看上去有些低效,但是不可变字符串却有一个优点:编译器可以让字符串共享。

原因:

通过观察源码可知,String类的value是被private修饰的,类外是拿不到这个值的

可能很多人以为String类不可变是因为value[] 这个数组被final修饰,但其实并不是这样的,因为value存储的是一个引用,而不是常量。

下面用代码诠释一下:

我们发现,arr[1]的值的确被改为了c。准确的说 这里的final限制的是arr指向的值不能改变,也就是不能重新指向一个新的数组对象。

 总结:

  1. String类被final修饰,表明该类不能被继承
  2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。

所以一些设计字符串修改的函数,都是创建一个新的对象,然后修改新的对象。

注意  += 这种的拼接操作,也不是在String类自身上进行的,而是通过中间创建许多临时变量而完成的,效率很低下。于是引入了StringBuffer和StringBuilder。

以下代码可以看出String类在拼接时的效率比StringBuffer和StringBuilder低:

public static void main(String[] args) {long start = System.currentTimeMillis();String s = "";for(int i = 0; i < 1_0000; ++i){s += i;}long end = System.currentTimeMillis();System.out.println(end - start);start = System.currentTimeMillis();StringBuffer sbf = new StringBuffer("");for(int i = 0; i < 1_0000; ++i){sbf.append(i);}end = System.currentTimeMillis();System.out.println(end - start);start = System.currentTimeMillis();StringBuilder sbd = new StringBuilder();for(int i = 0; i < 1_0000; ++i){sbd.append(i);}end = System.currentTimeMillis();System.out.println(end - start);}

1.3.1为什么设计成不可变的

为什么 String 要涉及成不可变的?(不可变对象的好处是什么?)

  1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了.
  2. 不可变对象是线程安全的.
  3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中.

1.4 判断字符串是否相等

可以使用equals方法来检测字符串是否相等,形如:s.equals(r); 如果字符串s与字符串r相等,则返回true,否则返回false。

需要注意的是:s与t可以是字符串常量,也可以是字符串字面量(用双引号引起来的部分)。

比如以下的语句也是合法的:

Java字符串常量池详解(StringTable)相关推荐

  1. JVM——字符串常量池详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   在Java开发中不管是前后端交互的JSON串,还是数据库中的数据存储,我们常常需要使用到String类型的字符串.作为最常用也是 ...

  2. JVM_04 字符串常量池(详解intern( ))

    一.String的基本特性 String:字符串,使用一对""引起来表示. String sl = "hello"://字面量的定义方式 String s2 = ...

  3. java class文件常量池_《Java虚拟机原理图解》 1.2.3、Class文件中的常量池详解(下)...

    Java内存区域         1.程序计数器(Program Counter Register)(线程私有的)         2.Java虚拟机栈 (Java Virtual Machine S ...

  4. 《性能调优之JVM》❤️04JVM常量池详解之深入理解Class常量池、运行时常量池、字符串常量池、八种基本数据类型的包装类和对象池

    JVM常量池详解 一.Class常量池 1.1字面量 1.2符号引用 二.运行时常量池 三.字符串常量池 3.1设计思想 3.2设计原理 3.3字符串常量池位置 3.4三种字符串操作 四.八种基本数据 ...

  5. 常量池详解(含栈、堆、方法区简析)

    1 位置分布图 2 内存区域类型 寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制: 堆:存放所有new出来的对象: 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈 ...

  6. 理解Java字符串常量池与intern()方法

    理解Java字符串常量池与intern()方法 阅读目录 Java内存区域 两种创建方式在内存中的区别 解释开头的例子 intern()方法 参考资料 String s1 = "Hello& ...

  7. java 常量池详解

    参考资料:http://chenzehe.iteye.com/blog/1727062 注意: 1.首先,我们平时在讨论字符串新建问题时所说的常量池其实指的是字符串常量池.并不是运行时常量池,更加不是 ...

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

    目录 1. String类是什么 1.1 定义 1.2 类结构 1.3 所在的包 2. String类的底层数据结构 3. 关于 intern() 方法(重点) 3.1 作用 3.2 字符串常量池(S ...

  9. java 常量字符串过长_90%的同学都没搞清楚的 Java 字符串常量池问题(图文并茂)

    字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...

最新文章

  1. Android进阶笔记:Messenger源码详解
  2. 一款由css3和jquery实现的响应式设计导航
  3. java集合框架史上最详解(list set 以及map)
  4. 算法--------删除重复元素,但保留两个
  5. 设计模式--工厂方法(Factory Method)模式
  6. 队列定义、队列的存储结构
  7. 2021华为软件精英挑战赛总结
  8. 错误“操作必须使用一个可更新的查询”原因及解决办法
  9. 为什么html中图片显示不出来,网页图片显示不出来是什么原因?
  10. 树莓派笔记8:UDP传输视频帧
  11. 人工神经网络与遗传算法,遗传算法和神经算法
  12. python百位数千位数取整
  13. dsp28335杂记1
  14. 水电设计院信息管理系统1.0
  15. JSP学习笔记(八):使用ArrayList
  16. 蓝牙认证,蓝牙BQB认证,蓝牙BQB测试内容,蓝牙BQB认证多少钱?蓝牙BQB认证流程
  17. 各类文件的文件头尾总结
  18. Bootstrap5 弹出框
  19. 2021-10-21分享几个贼拉好用的电脑小窍门
  20. 远程服务器套娃,无限套娃!RemoteView云上浏览器:运行在浏览器里的远程浏览器...

热门文章

  1. 扩容刚烧录至sd卡的linux系统
  2. USB OTG插入检测识别
  3. 动态SQL,单表查询
  4. 【渝粤教育】广东开放大学 新闻写作 形成性考核 (23)
  5. IDEA 2018 Mybatis Plugin插件安装破解及使用
  6. 用计算机怎么做蒙特卡洛模拟,蒙特卡罗模拟
  7. js创建svg元素并插入到html中使用createElementNS
  8. 备份曾经开放数据源码
  9. 基于H5跳转APP,未安装的话就跳转appstore
  10. Ubuntu桌面放大随鼠标移动