1、String属于不可变类型,它创建的对象内容是不可以改变的,如果必须改变String str 的内容,就必须重新创建对象,开辟一块新的空间存储变量,同时Stirng因为被被final修饰,属于最终类,不可以被继承。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {}
2、String[] strs = new String[5]; 表示在栈中创建一个连续的空间存储String的地址,每一次修改掉数组中的值,就相当于重新创建新的地址,将新的值放在新的地址空间内,然后将新的地址传给栈中的修改的那个数组的某个值。
3、for(String str : strs)中,将数组中的每一个字符串的地址赋予str,当时字符串属于不可变类型,所以改变str后,str的指针改变,但是不能影响strs,所以不能修改掉strs中的值。
3.1、不修改str信息,地址都一样,
String[] arr = new String[]{"aeag","bfega","cfegad","dgeagr","efegad"};
int i = 0;
for (String s : arr) {
// s = "12";
System.out.println(s.hashCode() + " " + arr[i].hashCode());
i++;
}
3.2、修改str中的信息,所以相当于改变str的地址,不影响数组的地址。
String[] arr = new String[]{"aeag","bfega","cfegad","dgeagr","efegad"};
int i = 0;
for (String s : arr) {
s = "12";
System.out.println(s.hashCode() + " " + arr[i].hashCode());
i++;
}
4、StringBuffer和 StringBuilder多可以在不改变原先创建的对象的地址的情况下,修改其内容,但是两者之间有一定的区别:
4.1
、StringBuffer更加的安全,它利用了缓冲机制,可以在多线程的情况下,能保证数据的正确传输。因为synchronize关键字保证了该方法的安全性。
4.2
、StrignBuilder性能更好,但是它没有利用缓冲机制,在多线程下,数据可能会发生错误。