1. 使用双引号创建字符串时,JVM会现在字符串常量池中查找是否已存在该字符串,存在则返回,不存在则在池中创建后再返回。与此同时,使用String的intern方法也是类似处理。

  2. 使用new String的方式创建,或者使用+拼接变量时,JVM都会重新创建一个新对象。

    String s1 = "1";
    String s2 = s1 + "2";

    因为s1是引用变量,JVM在编译期不能确定s1的值,所以会在堆中新创建一个对象指向s2。如果s1加个final限制,让s1就能在编译阶段确定下来,它就是常量,因此在编译时,s1 + "2"就会被优化成12。

  3. new String("123")创建了几个对象?一个或两个。先从常量池中查找123,有则创建,没有则不创建;new会新创建一个对象。

String为什么不可变

不能被继承;未提供能改变它状态的公共方法;它的工具方法都是返回一个新的字符串。

String不可变有什么好处

  • String常量池的必要条件。String常量池就是一个由JVM创建的特殊内存区域,用于存放字符串常量,当创建一个字符串时,JVM先去池中寻找是否存在,存在则返回,不存在则创建。即多个具有相同字符序列的字符串引用会指向池中的同一个对象。如果有一个引用变量对其修改,那其他引用变量的值随之修改,缓存就无意义了。说到这里,我想到了 平时写缓存代码的逻辑,我们使用Redis来缓存重要对象数据的时候,当缓存对象发生修改,我们会立即更新缓存,那字符串常量池也能这么做吗,能在在常量池中实时更新它的值或内部状态吗?显然是不能的。如果真能修改, 首先不能称它为常量池了;其次这会大大提升它的使用难度,很多判断对象相等的场景变得复杂了; 其三,字符串本质是字符序列,它不应该有复杂的内部状态,越简单越安全,否则它也不会被广泛使用。

  • 因为不可变,所以是线程安全的。

  • 很适合作为HashMap的Key。String的hashCode方法在第一次调用的时候会缓存它的hash值,再次调用的时候无需再次计算了。关于这一点,我们去看它的源码就会一目了然:将hash函数的计算结果赋值给String的成员变变量hash,第二次计算就能直接返回。从这里可以看出,从HashMapHashSet等使用hash函数计算元素位置的集合中查找一个元素是非常快的。

String知识点整理的更多相关文章

  1. ACM个人零散知识点整理

    ACM个人零散知识点整理 杂项: 1.输入输出外挂 //读入优化 int 整数 inline int read(){ int x=0,f=1; char ch=getchar(); while(ch& ...

  2. web前端面试知识点整理

    一.HTML5新特性 本地存储 webStorage websocket webworkers新增地理位置等API对css3的支持canvas多媒体标签新增表单元素类型结构标签:header nav ...

  3. 大数据 -- kafka学习笔记:知识点整理(部分转载)

    一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...

  4. sql注入知识点整理(基础版)

    sql注入知识点整理(基础版) 基本步骤 判断是否报错 判断闭合符号 判断注入类型 构建payload 手工注入或者编写脚本 基本注入类型 报错型注入 floor公式(结果多出一个1):and (se ...

  5. Flutter教程- Dart语言规范-知识点整理

    Flutter教程- Dart语言知识点整理 Dart语言简介 Dart语言介绍 ① 注释的方式 ② 变量的声明 ③ 字符串的声明和使用 ④ 集合变量的声明 ⑤ 数字的处理 ⑥ 循环的格式 ⑦ 抛异常 ...

  6. Android 零散知识点整理

    Android 零散知识点整理 为什么Android的更新试图操作必须在主线程中进行? 这是因为Android系统中的视图组件并不是线程安全的.通常应该让主线程负责创建.显示和更新UI,启动子线程,停 ...

  7. vue前端面试题知识点整理

    vue前端面试题知识点整理 1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...

  8. kafka知识点整理总结

    kafka知识点整理总结 只不过是敷衍 2017-11-22 21:39:59 kafka知识点整理总结,以备不时之需. 为什么要使用消息系统: 解耦 并行 异步通信:想向队列中放入多少消息就放多少, ...

  9. JSP页面开发知识点整理

    刚学JSP页面开发,把知识点整理一下. ----------------------------------------------------------------------- JSP语法htt ...

  10. JS知识点整理(二)

    前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...

随机推荐

  1. OSIDP-多处理器和实时调度-10

    多处理器调度 多处理器系统分类: 1.松耦合.分布式多处理器(集群):一系列相对自治的系统组成,每个处理器有属于自己的内存和I/O通道. 2.专用处理器:有一个通用的主处理器,专用处理器由主处理器控制 ...

  2. Python笔记(4)——元组(Python编程:从入门到实践)

    元组 1. 元组:不可变的列表.元组一经创建不能被修改. 2. 表示:用圆括号()来表示,并用逗号来分隔其中的元素.可通过索引访问其元素. 3. 访问:访问列表元素,指出元组的名称,再指出元素的索引, ...

  3. RS485总线常用拓扑结构

    RS485总线拓扑结构一般可分为以下4种,分别是:总线型拓扑结构.星型拓扑结构.树形拓扑结构.环形拓扑结构.根据RS485总线布线规范,只能按照总线拓扑结构布线,但是由于现场环境复杂多变,为了能够使整 ...

  4. C++解决海盗分金问题

    #include <iostream> #include <unordered_map> #include <map> // 假定:每个海盗都是一样的聪明,没有谁比 ...

  5. CMake指定的任务可执行文件"cmd.exe" 未能运行。System.IO.IOException:未能创建临时文件。临时文件夹已满或其路径不正确。对路径"......exec.cmd "的访问被拒绝

    我觉得是我使用VS2022的原因,网上也没有找到相同的问题.

  6. 阿里云centos7 磁盘挂载

    适用于多磁盘的情况 1. 查看本地所有磁盘 fdisk -l 2.格式化磁盘系统 mkfs.ext3 /dev/vdb  (/dev/vdb  为未挂载的磁盘路径) 2.创建挂载点 mkdir /ho ...

  7. element ui el-date-picker format 和 value-format 格式不一致,会导致日期输入框不显示

    element ui el-date-picker和value-format 不一致导致输入框不显示

  8. 将后端的application/json的格式数据类型转换成前端需要的类型格式

    前提:后端返回的数据内容 但是红框的数据对于前端来说是不正确的数据 所以我感觉前端处理这个数据本身这个操作都很傻X 但是我尝试进行转换代码如下: 得到的数据: 点击查看代码 const interfa ...

  9. 【前端工程化】使用Nexus 搭建前端 npm 私服

    参考文献1 - https://blog.51cto.com/lookingdream/3609619 参考文献2 - https://blog.csdn.net/u013278374/article ...

  10. keshe

    keshe 发送方a 代码: package org.example; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.ut ...