String类为什么是不可变的】的更多相关文章

0. 前言   如果一个对象,在它创建完成之后不能再改变它的状态,包括对象内的成员变量.基本数据类型的值等等.那么这个对象就是不可变的.众所周知String类就是不可变的.转载请注明出处为SEU_Calvin的博客. 1. String类为什么是不可变的  首先看一下String类的源码中: //JDK1.6 public final class String implements java.io.Serializable, Comparable<String>, CharSequence {…
大家都知道,在JAVA中字符串一旦声明就不可改变,如果尝试修改字符串的内容,将会重新实例化一个新的字符串对象,这也是为了安全性和效率. 由于字符串在程序之中被大量使用,所以JAVA引入了一个字符串常量池,所有被声明的字符串都会保存在字符串常量池中,如果下次使用到同样的字符串,就会从常量池中获取.由于字符串可以用来表示很多重要的信息,例如用户名,密码,URL地址等,如果被引用的字符串可以随意修改,那么这些信息也会变得非常不安全. 但是,反射让这一切发生了变化,字符串并不是一种基本数据类型,他的底层…
最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型?不可变对象,顾名思义就是创建后不可以改变的对象,典型的例子就是Java中的String类. 答案一: 相对于可变对象,不可变对象有很多优势:1).不可变对象可以提高String Pool的效率和安全性.如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地…
String类为啥是final的? 我们找到string的jdk源码 1.看到String类被final修饰.这里你就要说出被final修饰的类不能被继承,方法不能被重写,变量不能被修改. 2.看到final修饰的char[]代表了被存储的数据不可更改性.但是:虽然final代表了不可变,但仅仅是引用地址不可变,并不代表了数组本身不会变,请看下面图片 上图说明:数组中的值发生了改变. 上图说明:无论如何修改,数组的地址值不会改变. 综上:所以在这里只有final修饰是不能确保string的不可变…
String类是Java中的一个不可变类(immutable class). 简单来说,不可变类就是实例在被创建之后不可修改. 在<Effective Java> Item 15 中提到了为了使类成为不可变,需要遵循的五条规则: 不要提供任何会修改对象状态的方法. 保证类不会被扩展. 使所有的域都是final的. 使所有域都成为私有的. 确保对于任何可变组件的互斥访问. 不可变类有许多优点,不可变类比可变类更加易于设计.实现和使用,不容易出错,且更加安全. Java把String类设计为不可变…
为什么String类是不可变的? String类 什么是不可变对象 当满足以下条件时,对象才是不可变的: 对象创建以后其状态就不能修改. 对象的所有域都是final类型的. 对象是正确创建的(在对象的创建期间,this引用没有逸出). 这是<Java并发编程实战>一书中的定义.在书中,说明并不是一定要将所有的域都设为final类型,比如String类就是这种情况,String会将散列值的计算推迟到第一次调用hashCode()时进行,并将计算得到的散列值缓存到非final类型的域中,但这种方式…
首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,每次返回的都是原对象,可以通过append()方法来修改值 (2)String类对象的性能远不如StringBuffer类. 关于以上具体解释如下: 在java中有3个类来负责字符的操作. 1.Character 是进行单个字符操作的, 2.String 对一串字符进行…
1.常用方法 1)判断字符串是否为空 public boolean isEmpty()2)获取字符串长度 public int length()3)截取子子串 public String substring(int beginIndex) public String substring(int beginIndex, int endIndex) 4)在字符串中查找字符或子字符串,返回第一个找到的索引位置,没找到返回-1 public int indexOf(int ch) public int…
引用 String类包含在java.lang包中.这个包会在Java启动的时候自动import,所以可以当做一个内置类(built-in class).我们不需要显式的使用import引入String类. 创建 String类是唯一一个不需要new关键字来创建对象的类.使用的时候需要注意 String s = "Hello World!"; System.out.println(s); 操作 可以用+实现字符串的连接(concatenate),比如: "abc" +…
IT第九天 上午 包 1.包的命名规则:域名.项目名称.模块名 2.如:Wfei.com.windows.login 访问限制符 1.四种访问限制符分别对应为: (1)default:默认的,默认为protect (2)public:公共的引用了本类的都可以访问的 (3)protect:在同一个包中的可以访问 (4)private:只能在当前类中才可以访问 方法优化 1.逻辑思维:猜拳游戏的设定 下午 内存分配 1.在8种数据类型中,除了String型是类外,其他7种数据类型,均是结构体,结构体…