String 字符串
1.string概述
java.lang.String 类代表字符串,java程序中的所有字符串文字(如“abc”)都为此类对象。
- 注意点:字符串内容是不会发生改变的,它的对象在创建后不能被更改
String name1 = "小孔";
String name2 = "你好";
System.out.print(name1 + name2);//产生一个新的字符串"小孔你好"
String name3 = "大聪明";
name3 = "小聪明";
上面为两个字符串
//2.使用new的方式来获取一个字符串对象
//空参构造:可以获取一个空白的字符串对象
String s2 = new String();
System.out.println("@" + s2 + "!");//""
//传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
String s3 = new String("abc");
System.out.println(s3);
//传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
//需求:我要修改字符串的内容。 abc Qbc
//abc --> {'a','b','c'} --> {'Q','b','c'} --> "Qbc"
char[] chs = {'a', 'b', 'c', 'd'};
String s4 = new String(chs);
System.out.println(s4);//abcd
//传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
//应用场景:以后在网络当中传输的数据其实都是字节信息
//我们一般要把字节信息进行转换,转成字符串,此时就要用到这个构造了。
byte[] bytes = {97, 98, 99, 100};
String s5 = new String(bytes);
System.out.println(s5);//abcd
}
2.String内存图
直接赋值
-
字符串存在堆内存里的字符串常量池(即 串池)并且有内存地址,通过等号将内存地址值赋给等号左边,如下图所示,s1和s2通过 地址值匹配对应的字符串。
-
当执行到
String s2 = "abc"
时,会去串池里检查是否有"abc",如果有,会复用此时"abc"的地址值。此时s1和s2指向同一个地址值。 -
当使用双引号直接复制时,系统会检查该字符串在串池中是否存在。如果不存在会创建新的地址空间,如果存在则复用。
new出来
- 每new 一次会会在堆中开辟一小块空间
3.字符串比较
== 比的是什么?
-
基本数据类型比较的是具体的数据值
-
引用数据类型比较的是地址值
//基本数据类型比较的是具体的数据值,如:
int a = 10;
int b = 20;
System.out.print(a==b);// false
========================================================
//引用数据类型比较的是地址值,如:
String s1 = new String("abc");
String s2 = new String("abc");
System.out.print(s1==s2);// false
String s1 = "abc";
String s2 = "abc";
System.out.print(s1==s2);// true
============================================================
String s1 = new String("abc");//记录堆里面的地址值
String s2 = "abc";// 记录串池中的地址值
System.out.print(s1==s2);// false
-
equals:比较内容完全一致才为true
-
equalsIgnoreCase:忽略大小写,如:a =A
public static void main(String[] args) {
//1.创建两个字符串对象
String s1 = new String("abc");
String s2 = "Abc";
//2.==号比较
//基本数据类型:比的是数据值
//引用数据类型:比的是地址值
System.out.println(s1 == s2);//false
//3.比较字符串对象中的内容是否相等
boolean result1 = s1.equals(s2);
System.out.println(result1);// false
//4.比较字符串对象中的内容是否相等,忽略大小写
//1 一 壹 这不行
//忽略大小写只能是英文状态下的a A
boolean result2 = s1.equalsIgnoreCase(s2);
System.out.println(result2);//true
}