Java第十天
ASCII码表
字符串(String)
在 Java 中字符串属于对象。
在定义String str = "abc;"
时,“abc"作为常量存储在数据共享区,定义时首先会到数据共享区中去查找是否存在"abc"这样的字符串,如果存在就将"abc"的内存地址赋给str,若不存在则创建一个"abc”,再将内存地址赋给str。(先在数据共享区查找,若没有则创建,若存在则引用内存地址
)
常量字符串是常量,它们的值在创建后不可更改。
注意:下方代码看似改变了str的值实则没有。
1.在数据共享区中首先会创建"abc"并赋予一个内存地址,并将这个内存地址赋给str。
2.其次在运行时发现数据共享区没有"de",所以在数据共享区中创建"de"并赋予一个内存地址。
3.运行后并不是"abc"修改为"abcde",而是在数据共享区中再创建一个"abcde"并赋予一个内存地址,然后将该内存地址赋给str,所以字符串的值在创建后不可更改。
String str = "abc";
str = str + "de";
①String str = "helloworld";
在数据共享区创建的的是一个字符串的常量对象。
②String str1 = new String("helloworld");
先在堆中创建一个字符串的对象,然后再到数据共享区中创建一个字符串的常量的对象,最后再将堆中的对象指向数据共享区的对象。
注意:若已创建①,那么在创建②时会先在堆中创建②的对象,然后将②堆中的对象直接指向数据共享区中已创建的①的对象。
①和②的内存地址不同,但值相同。
③String str = "a";
④String str = "a";
③和④的值与内存地址都相同
1.String str = "a";
2.String str1 = "b";
3.String str2 = "ab";
System.out.print("a"+"b");
1和2拼接后一定会产生新的字符串,并与3的内存地址不相同。因为字符串做拼接时,只要存在一个已存在地址的字符串常量,就会产生新地址。
3和(“a”+“b”)的内存地址相同。因为如果是两个未被引用的常量字符串做拼接,则会去数据共享区中查找,若已存在相等的直接引用,不会重新创建。
字符串常用构造方法
String()
初始化新创建的 String对象,使其表示空字符序列。
例:
String 局部变量名 = new String();
---------------------------------------------------------------------------------
String(byte[] bytes)
通过使用平台的默认字符集解码指定的字节数组来构造新的 String 。
(将字节数组中每一个数值转换成相应的ASCII的字符,然后组成字符串)
例:
String 局部变量名 = new String(byte型的数组名);
byte[] bs ={
65,66,67,68,69,70,71};
String str = new String(bs);
System.out.println(str);
输出结果:
ABCDEFG
---------------------------------------------------------------------------------
String(byte[] bytes, int offset, int length)
通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。
(将字节数组作为参数的字符串截取创建一个新的String)
例:
String 局部变量名 = new String(byte型数组名,起始索引,截取长度);
byte[] bs ={
65,66,67,68,69,70,71};
String str = new String(bs