一 String的内存

java中String类型想要重新赋值 string可以重新赋值吗_java中String类型想要重新赋值


1)String 声明为final 不可继承;

2)String实现了Serializable接口,表示String可以比较大小

实现了Compareble接口,表示String可以比较大小

3)String内部定义了final char[] value用于存储字符串数据,具有不可变性

总结:一个值,一个内存区域地址,且不存相同值,是一 一映射

体现:1当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值

2 当对现有的字符串进行连接操作时候,也需要重新指定内存区域赋值,不能使用原有的value进行赋值

3.当调用String的replace修改指定的字符或字符串时,也需要重新指定内存区域进行赋值***

java中String类型想要重新赋值 string可以重新赋值吗_java中String类型想要重新赋值_02

public class JavaTest {
    public static void main(String[] args) {
        String s1="abc";
        String s2="abc";
        System.out.println(s1==s2);//true
    }
}

4)通过字面量的方式给一个字符串赋值,此时字符串声明在字符串常量池中
5)字符串常量池是不会存储相同内容的字符串的(所有上面二者在同一个地址,因为只存一次)
详情见
例题

String test=“javaandpython”;
 String str1=“java”;
 String str2=“and”;
 String str3=“python”;
 System. out. println(test==“java”+“and”+“python”):
 System. out. println(test ==str1 + str2 + str3);


对于上面这段代码,结果是true false
这是因为字符串字面量拼接操作是在Java编译器编译期间就执行了,也就是说编译器编译时,直接把"java"、“and"和"python"这三个字面量进行”+“操作得到一个"javaandpython” 常量,并且直接将这个常量放入字符串池中,这样做实际上是一种优化,将3个字面量合成一个,避免了创建多余的字符串对象(只有一个对象"javaandpython",在字符串常量池中)。而字符串引用的"+“运算是在Java运行期间执行的,即str1 + str2 + str3在程序执行期间才会进行计算,它会在堆内存中重新创建一个拼接后的字符串对象。且在字符串常量池中也会有str1,str2与str3,这里创建多少个新的对象与原来字符串常量池中有没有str1\str2\str3有关,如果之前存在就不会创建新的对象。
总结来说就是:字面量”+“拼接是在编译期间进行的,拼接后的字符串存放在字符串池中;而字符串引用的”+"拼接运算实在运行时进行的,新创建的字符串存放在堆中。
那么再来看这题,很明显只在编译期间在字符串常量池中创建了"welcometo360"一个字符串
6)基本数据类型传递数据 引用数据类型传递地址值

java中String类型想要重新赋值 string可以重新赋值吗_java中String类型想要重新赋值_03


此图中

str引用了ex.str ,但是由于String的不可变性,str="test ok"则新指向一个地址,原来的ex.str不变

而char[]则是更改第一位

二 String的方法

chatAt (int index):返回某索引处的字符

trim()返回字符串的副本,忽略前导空白和尾部空白

equal(Object obj)比较字符串的内容是否相同

equalIsignoreCase(String anotherString)与euals类似忽略大小写

concat(String str)将指定字符串连接到此字符串的结尾

java中String类型想要重新赋值 string可以重新赋值吗_字符串_04


java中String类型想要重新赋值 string可以重新赋值吗_java_05


java中String类型想要重新赋值 string可以重新赋值吗_java中String类型想要重新赋值_06


三 String-----与char的转换

String转换为char

char[] charArray=str1.tocharArray

char转换为String

String str2=new String(arr)

四 String与byte[]之间的转换

String---->byte

str.getBytes()

java中String类型想要重新赋值 string可以重新赋值吗_java_07


byte---->String

new String(bytes)

java中String类型想要重新赋值 string可以重新赋值吗_赋值_08


五 String StringBuffer StringBuilder

String 不可变的字符序列

StringBuffer 可变的字符序列 线程安全 效率低 底层用char[](没有加final)

java中String类型想要重新赋值 string可以重新赋值吗_java_09


StringBuffer sb2=new StringBuffer(“abc”);//char[] value=new char[“abc”.length()+16];

底层是一个初始创造并多出了16个字节

//问题1:sb2.length()==3

//问题2:扩容问题:如果要添加的数据底层数据盛不下,那就需要扩容底层的数组

默认情况下,扩容为原来容量的2倍+2,同时将原有数组的元素复制到新的数组中

指导意义:建议使用StringBuffer(int capacity)

StringBuilder 可变的字符序列 线程不安全 效率高 底层用char[] (没有加final)

六 StringBuffer的方法

java中String类型想要重新赋值 string可以重新赋值吗_java_10