为什么 String 在 Java 中是不可变的(终极答案) 我们可以从2个角度去看待这个问题: 1.为什么要设计成不可变2.如何保证不可变? 1.为什么设计不可变? 1.String对象缓存在String池中,由于缓存的字符串在多个客户之间共享,因此始终存在风险,其中一个客户的操作了一个String对象会影响其他客户.例如,如果一段代码将String "Test" 的值更改为"TEST",则所有其他客户也将看到该值.由于String对象的缓存性能是很重要的一方面,…
我最喜欢的 Java 面试问题,很棘手,但同时也非常有用.一些面试者也常问这个问题,为什么 String 在 Java 中是 final 的.字符串在 Java 中是不可变的,因为 String 对象缓存在 String 池中.由于缓存的字符串在多个客户之间共享,因此始终存在风险,其中一个客户的操作会影响所有其他客户.例如,如果一段代码将 String "Test" 的值更改为 "TEST",则所有其他客户也将看到该值.由于 String 对象的缓存性能是很重要的一…
深入理解Java中的不可变对象 不可变对象想必大部分朋友都不陌生,大家在平时写代码的过程中100%会使用到不可变对象,比如最常见的String对象.包装器对象等,那么到底为何Java语言要这么设计,真正意图和考虑点是什么?可能一些朋友没有细想过这些问题,今天我们就来聊聊跟不可变对象有关的话题. 以下是本文目录大纲: 一.什么是不可变对象 二.深入理解不可变性 三.如何创建不可变对象 四.不可变对象真的"完全不可改变"吗? 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载…
一.Java中的不可变类 不可变类(Immutable Objects):当类的实例一经创建,其内容便不可改变,即无法修改其成员变量. 可变类(Mutable Objects):类的实例创建后,可以修改其内容. Java 中八个基本类型的包装类和 String 类都属于不可变类,而其他的大多数类都属于可变类. 二.与引用不可变的区别 需要特别注意的是,不可变类的不可变是指该类的实例不可变而非指向该实例的引用的不可变. String s = "abc"; System.out.print…
String在Java中是个不可更改的类.一个不可更改的类简单来说就是这个类的所有实例是不可以更改的.所有的实例信息在创建的时候被初始化而且信息是不可以更改的.不可更改的类有很多好处.这篇文章总结了为什么String被设计成不可以改变的.一个好的回答需要深入理解内存.同步和数据结构等.1. 字符串池的需要字符串池(字符串内部池) 是在方法区域的特殊区域.当一个string被创建如果这个string已经在内存里面存在了,那个存在的string的引用被返回,而不是创建个新的对象和返回它的引用.下面的…
概念:不可变类的意思是创建该类的实例后,该实例的属性是不可改变的.java中的8个包装类和String类都是不可变类.所以不可变类并不是指该类是被final修饰的,而是指该类的属性是被final修饰的. 自定义不可变类遵守如下原则: 1.使用private和final修饰符来修饰该类的属性. 2.提供带参数的构造器,用于根据传入的参数来初始化属性. 3.仅为该类属性提供getter方法,不要提供setter方法. 4.如果有必要,重写hashCode和equals方法,同时应保证两个用equal…
这个是Java的经典问题.许多类似的问题在stackoverflow被提问,有很多不正确或不完备的答案.如果不想太多你会认为这个问题比较简单.( The question is simple if you don't think too much.)如果你想的多的话,它会非常让你困扰. 1. 下面的代码片段是有有趣和让人困惑的 public static void main(String[] args) { String x = new String("ab"); change(x);…
如何在Java中写出Immutable的类? 要写出这样的类,需要遵循以下几个原则: 1)immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象. 2)Immutable类的所有的属性都应该是final的. 3)对象必须被正确的创建,比如:对象引用在对象创建过程中不能泄露(leak). 4)对象应该是final的,以此来限制子类继承父类,以避免子类改变了父类的immutable特性. 5)如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一…
如果有下面的一个笔试题: 已知我们有如下的调用关系 logIt(”log message 1 “); logIt(”log message2”, " log message3”); logIt(”log message4”,"log message5”,"log message6"); 请问下面的答案中哪个是正确的 A. public void logIt(String * msgs) B. public void logIt(String [] msgs) C.…
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. Java代码 new String() 和 new String(“”)都是申明一个新的空字符串,是空串不是null: 3. String str=”kvill”: String str=new String (“kvill”); 的区别: 在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念…