String不可变性】的更多相关文章

java基础解析系列(九)---String不可变性分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及装箱拆箱 java基础解析系列(三)---HashMap原理 java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 java基础解析系列…
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 记录一次在写代码时愚蠢的操作,本文涉及到的知识点:String不可变性 一.交代背景 我这边有一个系统,提供一个RPC接口去发送短信.外部调用我的接口需要传入手机号等等参数,我这边负责解析这些参数.做一些业务的处理,然后调用短信渠道商的接口发送短信. 每当调用完短信渠道商的接口时,我会对这次发送的记录入库(存入MySQL中),同样地短信渠道商会返回发…
在所有编程语言领域,我想字符串应该是地球上最常用的表达手段了吧. 在java的世界里,String是作为类出现的,核心的一个域就是一个char数组,内部就是通过维护一个不可变的char数组,来向外部输出的. 这是jdk一段String类定义,首先类是final,表明类不可被继承:核心域是private final的,final表明这个引用所指向的内存地址不会改变,但这还不足说明value[]是不可变的:因为引用所指向的内存的值有可能发生变化,但是jdk是不会让这样的事情发生的.private 保…
这里有一堆例子来说明Java的String的不可变性. 1.声明一个String String s = "abcd"; s 变量保存string对象的引用,下面的箭头解释成保存了哪个对象的引用. 2. 给一个String 变量赋值为另外一个String 变量. String s2 = s; String对象不可变展示2变量s2 保存这相同引用的值,它们都指向了同一对象的值. 3.连接String s = s.concat("ef"); 变量s 现在保存的是新创建的s…
转载请注明出处: jiq•钦's technical Blog - 季义钦 String的不可变性 Java规定String是不可变的(immutable).事实上这个不可变具备两层含义: 1 内容不可变 不论什么看起来改动它们的操作.实际上都是又一次new出一个对象. String s = new String("111"); String newS = s; newS = "dsfsd"; System.out.println(s); //111 假设不能做到内…
今天分析一下String,String有很多实用的特性,比如说“不可变性”,是工程师精心设计的艺术品.用final就是拒绝继承,防止内部属性或方法被破坏. 一,什么是不可变? String不可变很简单,如图,给一个已有字符串“abcd”,第二次赋值为“abcde”,不是在原内存地址上修改数据,而是重新指向一个新对象,新地址. 二,String为什么不可变? 翻看IDK源码,String类前几行是这样写的: public final class String implements java.io.…
一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创建,其内在成员变量的值就不能被修改.其中String类就是不可变类的经典应用. 二 例子 package cn.xy.test; public class StringTest{ /**  * a的值在编译时就被确定下来,故其值"xy"被放入String的驻留池(驻留池在堆中)并被a指向.…
// ... literals are interned by the compiler // and thus refer to the same object String s1 = "abcd"; String s2 = "abcd"; s1 == s2; // --> true // ... These two have the same value // but they are not the same object String s1 = new…
1.String的不可变性 String s="abcd": 上面的语句定义了一个字符串变量s.该变量指向字符串"abcd",当初始化变量s时,会在堆中为s非配内容空间.例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXVuemVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=&qu…
1.string不可变性 java的docs有这样一句话:Strings are constant; their values cannot be changed after they are created. 对Java的String类而言,核心的一个域就是一个char数组,内部就是通过维护一个不可变的char数组,来向外部输出的.比如进行进行字符的提取.子字符串的提取等等. 1 public static void main(String[] args){ 2 String a="hello…
概览 String被声明为final,因此它不可被继承. public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; 内部使用char数组存储数据,该数组被声明为final,这意味着value数组初始化之后就不能再引用…
String为什么不可变? 简单的来说:String类中使用final关键字字符数组保存字符串,private final char value[],所以 String 对象是不可变的.而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[] value 但是没有用final关键字修饰,所以这两种对象都是可变的.   为什么将String设计成不可…
前言 public class Test { public static void main(String[] args) { String a = "abc"; String b = "abc"; String c = new String("abc"); System.out.println(a==b); System.out.println(a.equals(b)); System.out.println(a==c); System.out…
一 String 概述: String 被声明为 final,因此它不可被继承. 在 Java 8 中,String 内部使用 char 数组存储数据. public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; }…
一.String概述 String被声明为final,因为它不可被继承. 内部使用char数组存储数据,该数组被声明为final,这意味着value数组初始化之后就不能再引用其他数组.并且String没有改变value数组的方法,因此可以保证String不可变. public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used f…
<Think in Java>中说:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”. "=="判断的是两个对象的内存地址是否一样,适用于原始数据类型和枚举类型(它们的变量存储的是值本身,而引用类型变量存储的是引用):equals是Object类的方法,Object对它的实现是比较内存地址,我们可以重写这个方法来自定义“相等”这个概念.比如类库中的String.Date等类就对这个方法进行了重写. 综上,对于枚举类型和原始数据类型的相等性比较,…
String 相关知识点总结 字符串的不可变性 概述 String 被声明为 final,因此它不可继承 在 Java8 中,String 内部使用 char 数组存储数据 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char v…
(二)String Sring 被声明为 final ,因此不可被继承. String的不可变性: 看String的定义(java9版本): public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** value为存储TSring字符的字符数组 */ private final byte[] value; /** 使用Coder标识使用哪种编码 **/ pri…
一.JDK 8 版本下 JVM 对象的分配.布局.访问(简单了解下) 1.对象的创建过程 (1)前言 Java 是一门面向对象的编程语言,程序运行过程中在任意时刻都可能有对象被创建.开发中常用 new 关键字.反射等方式创建对象, JVM 底层是如何处理的呢? (2)对象的创建的几种常见方式? Type1:使用 new 关键字创建(常见比如:单例模式.工厂模式等创建). Type2:反射机制创建(调用 class 的 newInstance() 方法). Type3:克隆创建(实现 Clonea…
开局两张图,内容全靠刷! 马甲哥看到这样的现象,一开始还是有点懵逼. 这个例子,string是纯粹的引用类型,但是在函数传值时类似于值传递: 我之前给前后示例的内存变化图吧: 根因就是大多数高级语言都把String设计成不可变的:由一个字符串池管理字符串面值. 为什么被设计成不可变. 这个我还真的搜索了一下: 总结起来: string 被设计为不可变, 是因为 string在现代任何语言中,使用很频繁:多个对象可能都是这个字符面值, 然后就设计一个Pool来存储string. 既然pool里面共…
摘要: Java 中的 String类 是我们日常开发中使用最为频繁的一个类,但要想真正掌握的这个类却不是一件容易的事情.笔者为了还原String类的真实全貌,先分为上.下两篇博文来综述Java中的String类.笔者从Java内存模型展开,结合 JDK 中 String类的源码进行深入分析,特别就 String类与享元模式,String常量池,String不可变性,String对象的创建方式,String与正则表达式,String与克隆,String.StringBuffer 和 String…
文章目录 String String实例化的方式 方式一:通过字面量定义 方式二:new + 构造器的方式 String s = new String("abc")方式创建对象,在内存中创建了几个对象? 不同拼接操作的对比 结论 Test 常用方法 String --> 基本数据类型.包装类 基本数据类型.包装类-->String String -->char[] char[] --> String 编码:**String --> byte[]** 解码:…
原文链接:https://www.cnblogs.com/huameitang/p/10528646.html 字符串是用于表示文本的字符的有序集合. String对象是对象的有序集合 System.Char ,表示字符串; System.Char 对象对应于 utf-16 代码单元. 对象的值 String 是对象的顺序集合的内容 System.Char ,并且该值是不可变的 (也就是说,它是只读,反射也不能修改) . 有关字符串不可变性的详细信息,请参阅 永久性和 StringBuilder…
1. java不可变性初探 我们先看下面一个例子:代码如下: import java.math.BigInteger; public class BigProblem { public static void main(String[ ] args) { BigInteger fiveThousand = new BigInteger("5000"); BigInteger fiftyThousand = new BigInteger("50000"); BigIn…
常用类库 学习.net就是学习它的无数个类库怎么用,先看两个简单的 String 字符串,不可变特性.字符串可以看成字符数组 属性 Length 方法 IsNullOrEmpty() 静态方法 ToCharArray() ToLower() string不可变性 ToUpper() Equals() 忽略大小写的比较 Join() 静态方法 Format () 静态方法 IndexOf() LastIndexOf() Substring() Split() Replace() Trim()  C…
1.代码规范 -命名规范:定义的变量或者方法名要有意义. 1.骆驼命名 :第一个单词首字母小写,之后的单词首字母大写 userName.userPassword.realName…(普通变量(局部变量).字段) 2.帕斯卡命名:第一个单词首字母大写,之后的单词首字母大写 GetMax().ChangeName()…(方法名.类名.属性名) 注释:(代码说明书) 1.单行注释(//注释内容) 2.多行注释(/*注释内容*/) 3.文档注释(///注释内容) 2..net程序基本编写.执行流程 1.…
1.本周学习总结 java的数据类型 基本数据类型:介绍了java特有的boolean 引用数据类型 String:不变性:需要频繁修改时使用StringBuilder 包装类:自动拆.装箱 数组 一维数组 多维数组(包括不规则数组) 使用ArrayList构造动态数组 2.书面作业 1.String-使用Eclipse关联jdk源代码 1.1 查看String对象的源代码(截图),分析String使用什么来存储字符串? 答:大致浏览一遍String代码后,我认为是用这个字符数组存储字符串的,底…
1.Java 语言的优点 面向对象,平台无关,内存管理,安全性,多线程,Java 是解释型的 2.Java 和 C++的区别 多重继承(java接口多重,类不支持,C++支持) 自动内存管理 预处理功能 goto语句(java不支持) 引用与指针.在Java中不可能直接操作对象本身,所有的对象都由一个引用指向,必须通过这个引用才能访问对象本身,包括获取成员变量的值,改变对象的成员变量,调用对象的方法等.而在C++中存在引用,对象和指针三个东西,这三个东西都可以访问对象.其实,Java中的引用和C…
1.本周学习总结 本周学习了java的数据类型,有基本数据类型和引用数据类型(不同c),特有的boolean类型,取值只有true和false.还有包装类和数组,每一个基本类型都有相对应的包装类,对应的语法有自动拆箱和自动装箱.数组的构建也和c语言有一些区别,java还可以直接简单构建不规则数组 2.书面作业 1.String-使用Eclipse关联jdk源代码 1.1 查看String对象的源代码(截图),分析String使用什么来存储字符串? String用char[]数组来存储字符串. 1…
1. 本周学习总结 学会String 类的一些用法,比如用subString()截取字符串,频繁对字符串进行修改应使用StringBuilder()等. 学会Array 类的一些用法,比如sort()排序,deepToString()打印二维数组等. 学会调用函数. 了解了equals 与 == 的区别. 学习了一种新的循环 foreach循环,格式为for(type element:arr). 了解了ArrayList动态数组的基本使用方法等. 2. 书面作业 1. String-使用Ecli…