JAVA中的String

来源:互联网 发布:剑三萌萝莉脸型数据 编辑:程序博客网 时间:2024/06/05 19:20

简单而言,java中的直接用字符串初始化的Spring是指向常量池的。而常量池中的内容是不可改变的。

public class Sandbox4 extends Sandbox2{    String s1 = "test1";    public static void main(String[] args) {        Sandbox4 a= new Sandbox4();        a.ChangeString(a.s1);        System.out.print(a.s1);    }    void ChangeString(String s){        s = "test2";    }}

如果你强行要改变他的值。JVM回在常量池中新生成一个对象。而java中都是穿值的。上面的程序中进入方法的s是一个引用。方法改变了引用的值,而不是引用所指向对象的值。所以程序的释出仍然是test1。即使你采用new String的方法声明s1也结果不会改变的。JAVA API中已经明确说了Spring中的内容不能改变。只能新建一个对象替换。

另外的一点是,当你使用字符串给String赋值时,有可能新生成一个对象(比如说上面的例子)。也有可能不新生成一个对象,而是指向常量池中已经存在的对象。

public class Sandbox4 extends Sandbox2{    String s1 = "test1";    public static void main(String[] args) {        Sandbox4 a= new Sandbox4();        String s2 = "test1";        System.out.print("s1==s2:"+(a.s1==s2));    }   }

但是,如果将上述换成new String的方法来定义引用,则是两个不同的对象(虽说也不知道有啥意义)。
如果你想生成一个非常量的String。请使用StringBuffer类。

这里还要牵扯一个问题。就是final。
当书写final Object obj类似的定义时,obj指向的对象并不是不可以变的!而只是obj指向的对象不能变成别的对象。所以跟上面说的情况不同。不能说String是默认final修饰的。这是两回事。

java中的==是比较他们的内存地址。object中的equals就是用==实现的。当然可以重写。hashcode是用来均匀映射的。理论上hashcode相等不代表什么。
但是,在hashmap等的实现中这样却不行。事实上,我们在不能允许两个equals相等的对象hashcode不同。所以,如果你重写了equals方法,而且会用到集合框架。请重写hashcode。你重写的equals方法一般是要求两个对象中部分或者全部字段相等。显然,用这些字段计算hashcode就好啦。

0 0