1. String
String被称为字符串常量,一旦赋值后值不可概念,可以通过修改内存指向重新赋值
== 在字符串中比较的是内存地址
如果想比较两个字符串的内容是否一致需要使用"equals"方法
上述图片中的代码,在使用equals比较后,结果都是true
s1.equals(s2); 结果为true
s3.equals(s4); 结果为true
...
面试题/笔试题: String中==比较的是什么?equals比较的是什么?
答案:==比较的是内存地址是否一致,equals比较的是字符串中内容是否一致
2. String的API
2.1 构造方法
- String();
创建一个表示空字符串("") 的String对象。更多的时候使用的方式
String str = "";
空字符串不代表null,null是指栈中数据是null,空字符串指的是堆中的字符串没有赋值
-
String(byte[] bytes);
构造一个新的 String通过解码的字节数组指定使用平台的默认字符集。(可以理解为利用ASC码的数组构建一个字符串)
-
String(char[] value)
分配一个新的 String所以它代表当前字符序列中包含的字符数组参数。(可以理解为将字符数组中所有字符拼成一个字符串)
-
String(String org)
初始化一个新创建的 String对象,所以它代表了相同的字符序列作为参数;换句话说,新创建的字符串参数字符串的副本。
String str = new String("哈哈");
String str = "哈哈";
-
String(StringBuffer sb)和String(StringBuilder sb)
分配一个新的字符串,它包含当前字符序列中包含字符串缓冲区的字符数据(可以理解为将StringBuffer或StringBuilder转换成String)
更多的是使用StringBuffer和StringBuilder的toString()方法来完成转换 -
String(byte[] b, String charset)
通过charset字符集解码byte数组完成字符串的构建(一般用于字符串在不同字符集之间的转换)
-
String(char[] value, int offset, int count)
在value数组中的offset位置起,使用count个元素构建字符串
char[] c2 = {'你','好','啊','我','还','行','哈','哈'};
String s6 = new String(c2, 3, 3);
System.out.println(s6);
运行结果:“我还行”
更多的构造方法,请参照API文档
2.2 API方法
2.2.1 charAt(int idx) 返回值: char
返回字符串中idx位置上的字符。比如,得到字符串的首字符
String str = "abc";
char c = str.charAt(0);
c得到的字符是'a',字符串的本质上是一个字符数组,注意不要下标越界。
2.2.2 equals(String str) 返回值:boolean
判断字符串与目标字符串str中的内容是否一致
String s1 = new String("haha");
String s2 = new String("haha");
String s3 = new String("Haha");
boolean b1 = s1.equals(s2);
boolean b2 = s1.equals(s3);
b1的结果是true,b2的结果是false
2.2.3 equalsIgnoreCase(String str) 返回值:boolean
判断字符串与目标字符串str中的内容是否一致,忽略大小写
String s1 = new String("haha");
String s2 = new String("haha");
String s3 = new String("Haha");
boolean b1 = s1.equalsIgnoreCase(s2);
boolean b2 = s1.equalsIgnoreCase(s3);
b1的结果是true,b2的结果是true
2.2.4 getBytes() 返回值:byte[]
和toCharArray() 返回值:char[]
getBytes() 返回一个由各个字符拆分成ASC码的byte数组
toCharArray() 返回一个由各个字符拆分成的char数组
2.2.5 indexOf(String s) 返回值:int
和lastIndexOf(String s)返回值:int
indexOf(String s) 返回参数s在字符串中第一次出现的位置,如果没有出现过返回-1
lastIndexOf(String s) 返回参数s在字符串中最后一次出现的位置,如果没有出现过返回-1
String str2 = "I LIKE GIRL";
int i1 = str2.indexOf("I");
int i2 = str2.lastIndexOf("I");
int i3 = str2.indexOf("i");
int i4 = str2.indexOf("LIKE");
结果:i1的结果0,i2的结果是8,i3的结果是-1,i4的结果是2
2.2.6 isEmpty() 返回值:boolean
判断当前字符串是否为空字符串,相当于代码equals("")
一般用于检测字符串变量是否有值
String str3 = null;
if(str3 == null || str3.isEmpty()) {
System.out.println("请输入内容");
}
此处利用了||的短路特征,先判断是否为null,如果str3是null,此处短路越过判断isEmpty,程序正常执行。如果反过来写,先判断isEmpty,当str3为null时会发生空指针异常
2.2.7 length()返回值:int
返回字符串中字符的个数,无论什么字符(英文,数字,汉字,标点,空格)都算1个。
String str2 = "I LIKE GIRL";
String str4 = "哈哈 哈,呵呵";
int l1 = str2.length();
int l2 = str4.length();
l1的值是11,l2的值是7
2.2.8 replaceAll(String s, String t) 返回值:String
在源字符串中,使用字符串t替代所有的子字符串s,并返回替代后的字符串
示例:将源字符串str5中的所有字符A替换为*
String str5 = "ABDFAKADOABASDALOI";
String str6 = str5.replaceAll("A", "*");
System.out.println(str6);
str6结果:*BDF*K*DO*B*SD*LOI
2.2.9 split(String s)返回值:String[]
将源字符串,利用s(正则表达式)作为分隔符,将字符串拆分为字符串数组
String str7 = "A,B,C,11,2,SS,HAH啊,哈哈哈";
String[] sts = str7.split(",");
System.out.println(sts.length);
for(int i = 0; i < sts.length; i++) {
System.out.print(sts[i]);
System.out.print("\t");
}
System.out.println();
结果:长度是8,数组中是拆分后的结果
运行结果
2.2.10 substring(int start)和substring(int start, int end) 返回值:String
substring(int start):从下标start位置起(含start),截取字符串至结尾
substring(int start, int end) :从下标start位置起(含start),截取至下标end位置(不含end) [start,end)
String str8 = "I LIKE GIRL";
String str9 = str8.substring(2);//[2,]
String str10 = str8.substring(2,6);//[2,6)
System.out.println(str9);
System.out.println(str10);
str9的结果是:LIKE GIRL
str10的结果是:LIKE
2.2.11 toLowerCase()和toUpperCase() 返回值:String
toLowerCase(): 将字符串的所有字符变更为小写
toUpperCase(): 将字符串的所有字符变更为大写
String str11 = "I Like Girl";
String str12 = str11.toLowerCase();
String str13 = str11.toUpperCase();
System.out.println(str12);
System.out.println(str13);
str12的结果是i like girl
str13的结果是I LIKE GIRL
2.2.12 trim() 返回值:String
去掉字符串两端多余的空格,并返回去掉空格的结果
String str14 = " adm in ";
System.out.println(str14.length());
String str15 = str14.trim();
System.out.println(str15.length());
System.out.println(str15);
str15的结果是:adm in
更多的API方法,请参照API文档
3. StringBuffer和StringBuilder
StringBuffer被称为字符串变量,线程安全的。主要用途是在字符串拼接时,提升程序的运行效率
StringBuilder被称为字符串变量,线程不安全的。主要用途是在字符串拼接时,进一步提升程序的运行效率
public class Test {
public static void main(String[] args) {
String str = ""; //不是null
long l1 = System.currentTimeMillis();
for(int i = 1; i < 40000; i++) {
str += i;
}
long l2 = System.currentTimeMillis();
System.out.println("耗时:"+(l2-l1)+"ms");
StringBuffer sb1 = new StringBuffer();
long l3 = System.currentTimeMillis();
for(int i = 1; i < 10000000; i++) {
sb1.append(i);
}
long l4 = System.currentTimeMillis();
System.out.println("耗时:"+(l4-l3)+"ms");
StringBuilder sb2 = new StringBuilder();
long l5 = System.currentTimeMillis();
for(int i = 1; i < 10000000; i++) {
sb2.append(i);
}
long l6 = System.currentTimeMillis();
System.out.println("耗时:"+(l6-l5)+"ms");
}
}
运行结果
运行结果 内存表示
面试题和笔试题
(1) ==和equals的区别?
==是比较内存地址,equals比较的是字符串内容
(2) 程序的运行结果
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
str1 == str2?
str1 == str3?
(3) String,StringBuffer和StringBuilder的区别
String是字符串常量,值不能修改,新赋值重新修改内存指向
StringBuffer和StringBuilder是字符串变量,拼接效率比String高。其中StringBuffer是线程安全的,效率低于StringBuilder(线程不安全的)
网友评论