第13章 字符串类

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(线程不安全的)

你可能感兴趣的:(第13章 字符串类)