目录
String 字符串
特点
字符串常量池
字符串比较
其他常用方法
String 字符串
java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例。类 String 中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻译为大写或小写的所有字符的字符串的副本。
特点
1. 字符串不变:字符串的值在创建后不能被更改。
String s1 = "abc";
s1 += "d";
System.out.println(s1); // "abcd"
// 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。
2. 因为String对象是不可变的,所以它们可以被共享。
String s1 = "abc";
String s2 = "abc";
// 内存中只有一个"abc"对象被创建,同时被s1和s2共享。
3. "abc" 等效于 char[] data={ 'a' , 'b' , 'c' } 。 字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组。
String str = "abc";
相当于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
// String底层是靠字符数组实现的。
创建字符串的常见方式:
// 使用空参构造
String str1 = new String(); // 小括号留空,说明字符串什么内容都没有。
System.out.println("第1个字符串:" + str1);
// 根据字符数组创建字符串
char[] charArray = { 'A', 'B', 'C' };
String str2 = new String(charArray);
System.out.println("第2个字符串:" + str2);
// 根据字节数组创建字符串
byte[] byteArray = { 97, 98, 99 };
String str3 = new String(byteArray);
System.out.println("第3个字符串:" + str3);
// 直接创建
String str4 = "Hello";
System.out.println("第4个字符串:" + str4);
直接写上双引号创建的字符串,就是字符串对象。
字符串常量池
程序当中直接写上的双引号字符串,就在字符串常量池中。常量池是堆内存中的一片特殊区域。
创建过程:
首先,创建了str1 ,常量池中会产生一个新的字符串,以byte[] 的形式存储“abc” , 最后把“abc” 的引用赋值给栈中的str1 。创建str2时,jdk发现常量池中已经存在了字符串“abc”对象,于是就不再重复创建,直接将0x666 也就是 “abc”的引用赋值给了str2 。后面又创建char[] charArray 时 ,应为char[] 不是字符串常量, 所以不会去常量池中比对,而直接在堆中创建了char[] ,并将引用返回给charArray 。通过new String(charArray) 这种方式创建字符串时,jvm将char[] 先转换成了byte[] ,然后将byte[] 的引用返回给str3 。
字符串比较
对于基本类型来说,==是进行数值的比较。
对于引用类型来说,==是进行【地址值】的比较。
public boolean equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果一样。
public boolean equalsIgnoreCase(String str):忽略大小写,进行内容比较。
如果比较双方一个常量一个变量,推荐把常量字符串写在前面。
推荐:"abc".equals(str) 不推荐:str.equals("abc")
String str1 = "Hello";
String str2 = "Hello";
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
String str3 = new String(charArray);
System.out.println(str1.equals(str2)); // true
System.out.println(str2.equals(str3)); // true
System.out.println(str3.equals("Hello")); // true
System.out.println("Hello".equals(str1)); // true
String str4 = "hello";
System.out.println(str1.equals(str4)); // false
System.out.println("=================");
String str5 = null;
System.out.println("abc".equals(str5)); // 推荐:false
// System.out.println(str5.equals("abc")); // 不推荐:报错,空指针异常NullPointerException
System.out.println("=================");
String strA = "Java";
String strB = "java";
System.out.println(strA.equals(strB)); // false,严格区分大小写
System.out.println(strA.equalsIgnoreCase(strB)); // true,忽略大小写
System.out.println("abc一123".equalsIgnoreCase("abc壹123")); // false
注意,只有英文字母区分大小写,其他都不区分大小写
其他常用方法
public int length () :返回此字符串的长度。
public String concat (String str) :将指定的字符串连接到该字符串的末尾。
public char charAt (int index) :返回指定索引处的 char值。
public int indexOf (String str) :返回指定子字符串第一次出现在该字符串内的索引。
public String substring (int beginIndex) :返回一个子字符串,从beginIndex开始截取字符串到字符
串结尾。
public String substring (int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到
endIndex截取字符串。备注 :[beginIndex,endIndex),包含左边,不包含右边。
public char[] toCharArray () :将此字符串转换为新的字符数组。
public byte[] getBytes () :使用平台的默认字符集将该 String编码转换为新的字节数组。
public String replace (CharSequence target, CharSequence replacement) :将与target匹配的字符串使用replacement字符串替换。
public String[] split(String regex) :将此字符串按照给定的regex(规则)拆分为字符串数组。
split方法的参数其实是一个“正则表达式”,注意:如果按照英文句点“.”进行切分,必须写"\\."(两个反斜杠)