首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 中 String 真的可变

我们都知道 Java 中 String 类设计可变,来看下 String 类源码。 ? 可以看出 String 类 final 类型,String 不能被继承。...其值 value 也就是对字符数组封装,即 char[],其值被定义成 private final ,说明不能通过外界修改,即不可变。 String 真的 "不可变 " ? 来看下面这个例子。...这其实是初学者一个误区,从上面看 String 结构可以得知字符串由字符数组构成,str 只是一个引用而已,第一次引用了 "Python",后面变成了 "Java",而 substring 也是用...Java中String真的可变? 所以说,这里字符串并不是可变,只是变更了字符串引用。...String 真的真的真的 "不可变 " ? 上面的例子肯定是不可变,下面这个就尴尬了。 ?

86020

Java 中 String 真的可变

我们都知道 Java 中 String 类设计可变,来看下 String 类源码。...其值 value 也就是对字符数组封装,即 char[],其值被定义成 private final ,说明不能通过外界修改,即不可变。 String 真的 "不可变 " ? 来看下面这个例子。...这其实是初学者一个误区,从上面看 String 结构可以得知字符串由字符数组构成,str 只是一个引用而已,第一次引用了 "Python",后面变成了 "Java",而 substring 也是用...String 真的真的真的 "不可变 " ? 上面的例子肯定是不可变,下面这个就尴尬了。...通过反射,我们改变了底层字符数组值,实现了字符串 “不可变” 性,这是一种骚操作,不建议这么使用,违反了 Java 对 String 类可变设计原则,会造成一些安全问题。 是不是又涨姿势了?

87930
您找到你想要的搜索结果了吗?
是的
没有找到

什么可变对象?用图说话

可变与不可变 列表(list)一个可变容器,可变与不可变一对很微妙概念,因为网上经常出现,所以再重点总结下。 创建一个列表 a = [1,3,[5,7],9,11,13],存储示意图: ?...因此,对列表而言,它能增加或删除元素,所以它是可变。 但是,如果仅仅在列表a中做这一步操作: a[2].insert(1,6) #在`a[2]`(也是一个列表)中插入元素6 插入后可视化图: ?...对于“可变”这个概念而言,这就不是真正让a可变操作。 tuple就是一个典型可变容器对象,对它而言,同样也可以修改嵌套对象取值,但这并没有真正改变tuple内元素。...如下所示,有一个元祖a a =(1,3,[5,7],9,11,13) a存储示意图如下: ? 下面插入一个元素6: a[2].insert(1,6) 可以看到,a内元素没增没减,长度还是6 ?...不可变容器对象本质:一旦创建后,长度就被唯一确定。但是,对于list而言,长度会有增有减,所以它是可变

33310

程序员过关斩将--你业务可变

u on o.UserId=u.UserId where ProvinceId=@ProvinceId 有问题,sql没问题,这时候用户A省市区县信息突然变了(也许是在其他地区买房...那你有没有想过为什么D妹子设计会出现这样问题呢? 深刻理解业务才能避免以上类似的错误发生,一定要深刻理解不变和可变业务点。...拿D妹子统计来说,你业务统计区域订单数,这个业务在产品设计上定义不变性,也就是说在行为产生那个时间点就确定了业务性质,这个业务性质不会随着其他变而变。...具体到当前业务就是:用户在X省下订单不会随着用户区域信息变化而变化,说白了就是说用户在X省生成订单永远属于X省。 谈到业务性质不变性,对应就有业务可变性。...假如你开发过类似于QQ空间这样业务,那肯定也做过类似访客功能。当要显示访客记录时候,访客名称在多数情况设计中属于可变业务。什么意思呢?

33020

String为什么可变

String为什么可变 我们通过查看String源码可以发现 String内部char数组通过 private final修饰,表示不可访问 而且String类也通过final修饰表示不可继承...这样做目的 保证了String类线程安全,如果String可以改变,我们通过写一个类继承String 可以篡改数据 保证了hash属性值不会频繁变更,保证了唯一性,这也是HashMap采用String...作为key原因 实现了字符串常量池,在java中创建字符串对象有两种方式 通过字符串常量创建,这种会在字符串中通过equls方法去判断当前字符串是否存在 存在直接返回,不存在在常量池创建对象 通过new...创建 这样会保证堆和字符串常量中都有该对象,没有就创建该对象,最后返回堆中对象引用地址值 先判断字符串常量池中有没有创建该对象,如果存在就回去堆内存中判断是否存在该对象,如果不存在创建对象,然后返回

52830

String 可变真的是因为 final

可变真的是因为 final ?...我:.....是的吧 面试官:OK,你这边还有什么问题? 我:卒...... 什么可变?...那既然我们说 String 可变,那显然仅仅靠 final 远远不够: 1)首先,char 数组 private ,并且 String 类没有对外提供修改这个数组方法,所以它初始化之后外界没有有效手段去改变它...String 真的不可变? 想要改变 String 无非就是改变 char 数组 value 内容,而 value 私有属性,那么在 Java 中有没有某种手段可以访问类私有属性呢?...简单办法将类声明为 final,更好方法将构造函数声明为私有的,通过工厂方法创建对象; 如果类字段可变对象引用,不允许修改被引用对象。 点击进入小牛肉留言板 ?

55730

关于 Java 可变参数你真的了解

我们都知道 Java 支持可变参数形式定义方法,这种语法糖在某些时候可以简化我们代码,但是关于可变参数如何实现以及其他更多细节,你真的知道?今天阿粉就带你来了解一下。...这里我们需要注意几个点: 可变参数只能作为函数最后一个参数,在其前面可以有也可以没有任何其他参数; 由于可变参数必须最后一个参数,所以一个函数最多只能有一个可变参数; Java 可变参数,会被编译器转型为一个数组...可变参数方法调用 可变参数方法调用跟其他方法调用没什么区别,这里要说明,我们除了通过可变参数进行调用之外,还可以通过传入数组形式来进行调用,如下所示: public static void...method1(3); } 通过可变参数和数组形式,这两种调用形式本质上一样;另外可变参数个数也可以为 0。...;第二个一个 String 类型固定参数和第二个参数可变参数方法。

43820

什么可变基础设施?

换句话说,这些服务器可变; 它们可以在创建后进行更改。由可变服务器组成基础设施本身可称为可变,传统或(贬低)手工艺。 一个不变基础设施另一个基础设施范例,他们部署了服务器之后决不会被修改。...实际上,可变基础架构一种更老基础架构范例,它早于核心技术,如虚拟化和云计算,使不可变基础架构成为可能和实用。...可变基础设施起源于此。由于更换服务器成本非常高,因此尽可能在尽可能短停机时间内尽可能长时间地使用您运行服务器最实际。...失去一个可能毁灭性。另一方面,不可变基础架构中服务器一次性,易于复制或使用自动化工具进行扩展。通过这种方式,他们就像cattle一样:牛群中众多群体中没有一个人独一无二或不可或缺。...一种方法实现本文中推荐一些设计实践,例如配置管理,即使您仍然在很大程度上可变环境中工作。这将在未来更容易过渡到不变性。

4.1K10

为什么String可变

区分对象和对象引用 对于Java初学者, 对于String可变对象总是存有疑惑。...“ABCabc”, 然后又让s值为“123456”。...从打印结果可以看出,s值确实改变了。那么怎么还说String对象是不可变呢? 其实这里存在一个误区: s只是一个String对象引用,并不是对象本身。...对象在内存中一块内存区,成员变量越多,这块内存区占空间越大。引用只是一个4字节数据,里面存放了它所指向对象地址,通过这个地址可以访问对象。...也就是说,s只是一个引用,它指向了一个具体对象,当s=“123456”; 这句代码执行过之后,又创建了一个新对象“123456”, 而引用s重新指向了这个心对象,原来对象“ABCabc”还在内存中存在

13320

【小家java】final修饰变量真的不可变

每篇一句 穷不练酒,富不占赌 1、概述 这可能大家一个共识:如果我们希望这个变量不可变,我们可以用final进行修饰。...所以用final修饰,但内容个对象啥,然后改变对象属性值,这个不在本文讨论范围以内。本文想讨论,直接就概念final地址,让它去指向另外一块内存地址。...System.out.println(str2); //efg System.out.println(field.get(this)); //gfe 通过反射拿到 我们通过反射拿到正确...后续JVM相关博文,我会重点讨论),即编译时把该 final 值直接放到了引用它地方。即使反射修改了该属性,但这种事后处理于事无补。...所以,咱们确实是可以通过反射来修改final值,但是我们在后续代码中却不能用,尴尬。为了解决这个问题,设计面实在有点多,所以此处不适合展开来说。

76120

什么可变基础设施

可变服务器组成基础设施本身可以称为可变、传统或手工。 不可变基础设施另一种基础设施模式,其中服务器在部署后永远不会被修改。...考虑放弃和替换物理服务器不切实际,但是使用虚拟服务器,不仅是可能,而且简单和高效。 传统可变基础设施中服务器不可替代、必须始终保持运行独特系统。...失去一个可能毁灭性。另一方面,不可变基础设施中服务器一次性,易于使用自动化工具复制或扩展。在这种情况下,他们就像牛群:一个群体中没有一个个体独特或不可缺少。...没有配置漂移或雪花服务器 不可变基础设施中所有配置更改都是通过以下两步实现:一将更新后镜像签入带有文档版本控制中,二用一个自动化统一部署流程来根据该映像部署替换服务器。...总结 本文介绍了什么可变基础设施,它与老式可变基础设施在概念和实践上区别,使用它优点,以及其实现详细信息。

11320

Java中String为什么可变

什么可变对象? 众所周知, 在Java中, String类可变。那么到底什么可变对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它状态,那么这个对象就是不可变。...区分对象和对象引用 对于Java初学者, 对于String可变对象总是存有疑惑。...System.out.println("ss = " + ss); 打印结果: ss = 123456 ss = 123456 String对象真的不可变?...valuefinal修饰,也就是说final不能再指向其他数组对象,那么我能改变value指向数组? 比如将数组中某个位置上字符变为下划线“_”。...这个反射实例还可以说明一个问题:如果一个对象,他组合其他对象状态可以改变,那么这个对象很可能不是不可变对象。

66530

面试题之  什么可变类? 为什么String可变类? 如何创建一个不可变

大家好,又见面了,我你们朋友全栈君。 面试题: 什么可变类? 为什么String可变类?...从String类不可变好处进行分析 ---- 只有当字符串可变,字符串池才有可能实现。字符串池实现可以在运行时节约很多heap空间,因为不同字符串变量都指向池中同一个字符串。...但如果字符串可变,那么String interning将不能实现(译者注:String interning指对不同字符串仅仅只保存一个,即不会保存多个相同字符串。)...,因为这样的话,如果变量改变了它值,那么其它指向这个值变量值也会一起改变。 ---- 如果字符串可变,那么会引起很严重安全问题。...因为字符串可变,所以它不可改变,否则黑客们可以钻到空子,改变字符串指向对象值,造成安全漏洞。 ---- 因为字符串可变,所以是多线程安全,同一个字符串实例可以被多个线程共享。

32510

Java 中 String 为什么可变

什么可变对象? 众所周知, 在Java中, String类可变。那么到底什么可变对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它状态,那么这个对象就是不可变。...区分对象和对象引用 对于Java初学者, 对于String可变对象总是存有疑惑。...System.out.println("ss = " + ss); 打印结果: ss = 123456 ss = 123456 String对象真的不可变?...valuefinal修饰,也就是说final不能再指向其他数组对象,那么我能改变value指向数组? 比如将数组中某个位置上字符变为下划线“_”。...这个反射实例还可以说明一个问题:如果一个对象,他组合其他对象状态可以改变,那么这个对象很可能不是不可变对象。

1.8K01

「云计算」什么可变基础设施?

换句话说,这些服务器可变;它们可以在创建后进行更改。由可变服务器组成基础设施本身可称为可变,传统或(贬低)手工艺。 不可变基础架构另一种基础架构范例,其中服务器在部署后永远不会被修改。...实际上,可变基础架构一种更老基础架构范例,它早于核心技术,如虚拟化和云计算,使不可变基础架构成为可能和实用。...可变基础设施起源于此。由于更换服务器成本非常高,因此尽可能在尽可能短停机时间内尽可能长时间地使用您运行服务器最实际。...传统可变基础架构中服务器不可替代,独特系统必须始终保持运行。通过这种方式,它们就像宠物一样:独一无二,无法模仿,并且倾向于手工制作。失去一个可能毁灭性。...另一方面,不可变基础架构中服务器一次性,易于复制或使用自动化工具进行扩展。通过这种方式,他们就像牛一样:牛群中众多群体中没有一个人独一无二或不可或缺

1.1K31

为什么Java里面String类可变

在Java里面String类型可变对象,这一点毫无疑问,那么为什么Java语言设计者要把String类型设计成不可变对象呢?这是一个值得思考问题。...在这之前,我们先来简单了解一下,什么可变对象? 不可变对象指的是在对象创建之后,对象内部状态以及对象内存指针地址都不不能被改变。...在Java里面final关键字就是用来辅助创建不可变对象,但需要注意,对于基本类型被final修饰后,就彻底变成了不可变对象,而引用类型被final修饰后,仅仅是指针内存地址不能改变,如果想要变成彻底可变类型...ok,下面我们来分析下为什么String可变? 通过String源码可以看到,String类型底层由final修饰char数组存储。...另一方面,如果String可变,那么同时运行其他线程如果修改这个值,就有可能导致混乱。

69740
领券