8. 快速掌握String类(含面试题)


String类是秋招面试中的重点,需重点掌握。

1. String类的基础操作

1.1 构造字符串

字符串常量没有/0标记结尾。

通过String类的源代码可知,其成员变量有value(字符数组)和hash(int,默认为0),构造字符串原理图如下(忽略字符串常量池),
在这里插入图片描述

构造字符串的方式有很多种,常用的有三种:

  1. 使用常量串
String s1 = "hello java";
System.out.println(s1); //hello java
  1. 直接new一个String对象
String s2 = new String("hello");
System.out.println(s2); //hello
  1. 使用字符数组
char[] ch = {'h','e','l','l','o','!'};
//方法一
String s3 = new String(ch);
//方法二,offset表示从下标几开始取,count表示偏移量
String str = new String(ch,1,3);
System.out.println(s3); //hello!
System.out.println(str); //ell

  1. Java中" "引起来的也是字符串对象。
System.out.println("hello".length());   
  1. String是引用类型,内部并不存储字符串内容。

  2. 区分空指针和字符串为空

//区分空指针和字符串为空
String str1 = "";                         
System.out.println(str1.length()); //0    
String str2 = null;                       
System.out.println(str2.length()); //抛异常  

1.2 String对象(字符串)的比较

对基础类型,==比较的是变量中的值。
对引用类型,==比较的是引用的地址。

【比较相等】equals方法,返回值为布尔类型

String s1 = new String("hello");         
String s2 = new String("hello");         
System.out.println(s1 == s2);            
System.out.println(s1.equals(s2));                                       

【比较大小】compareTo方法,返回值为int类型

  1. String类实现了Comparable接口,并重写了compareTo方法
  2. 忽略大小写比较,用compareToIgnoreCase()方法
  3. s1 > s2,返回正数;s1 < s2,返回负数;s1 == s2,返回0。
//比较大小                                   
String str1 = new String("abc");         
String str2 = new String("abd");         
System.out.println(str1.compareTo(str2)); //-1
System.out.println(str1.compareToIgnoreCase(str3)); //0

1.3 查找字符串

1. 通过下标找字符。charAt()方法
String str = "hello";
//通过下标找字符
System.out.println(str.charAt(2)); //l
2. 从头找:查字符(或字符串)第一次出现的下标/从指定位置开始查。indexOf()方法
String str = "hello";
//找字符/字符串第一次出现的下标
System.out.println(str.indexOf('e')); //1
System.out.println(str.indexOf("ll")); //2
//从指定下标查下标
System.out.println(str.indexOf('l', 3)); //3

3. 从尾找:查字符(或字符串)第一次出现的下标/从指定位置开始查。lastindexOf()方法
String str = "hello";
System.out.println(str.lastIndexOf("ll")); //2
System.out.println(str.lastIndexOf('o',2)); //-1

2. String类的进阶操作

对字符串的修改操作都是新形成了一个String对象,字符串具有不可修改性。

2.1 转换

1. 基本类型与字符串转换
  1. 基本类型转字符串。valueOf()方法
int a = 10;
//将整型转成字符型
String s = String.valueOf(a);
System.out.println(s); //10
  1. 字符串转基本类型。包装类.paseInt()方法
//将字符串转整型
String str = "1290";
int b = Integer.parseInt(str);
System.out.println(b); //1290
2. 大小写转换
  1. 转大写。toUpperCase()方法
String str1 = "AbC";
//转大写
String s1 = str1.toUpperCase();
System.out.println(str1); //AbC
System.out.println(s1); //ABC
  1. 转小写。toLowerCase()方法
//转小写
String str1 = "AbC";
String s2 = str1.toLowerCase();
System.out.println(str1); //AbC
System.out.println(s2); //abc
3. 字符串与数组转换
  1. 字符串转数组。toCharArray()方法
//字符串转数组
String a1 = "hello";
char[] ch = a1.toCharArray();
System.out.println(Arrays.toString(ch)); //[h, e, l, l, o]
  1. 数组转字符串。
//数组转字符串
char[] arr = {'a','b','c'};
String s3 = new String(arr);
System.out.println(s3); //abc
4. 字符串格式化
//格式化输出
System.out.println(String.format("%s,%s","My","name"));

2.2 替换字符串

  1. repalce方法。参数为CharSequence却能传String类型,是因为String源码实现了CharSequence接口。
//参数为Char
String s = "hello";
String s1 = s.replace('l','p');
System.out.println(s1); //heppo

//参数为CharSequence
String s2 = s.replace("ll","a");
System.out.println(s2);//heao
  1. replaceAll方法,支持正则表达式,除此之外和repalce方法的用法基本没区别。

  2. repalceFirst方法,只替换第一次出现的字符。

String s = "hello world";
String s3 = s.replaceFirst("l","6");
System.out.println(s3);//he6lo world

2.3 拆分字符串

spilt方法,填limit参数是表示分成几组

  1. 字符串拆分
//参数为一个
String s = "My name is Java";
String[] s1 = s.split(" ");
for (int i = 0; i < s1.length; i++) {
    System.out.println(s1[i]);
}

//运行结果
//        My
//        name
//        is
//        Java

//参数为两个
String s = "My name is Java";
String[] s1 = s.split(" ",3);
for (int i = 0; i < s1.length; i++) {
    System.out.println(s1[i]);
}

//运行结果
//        My
//        name
//        is Java  
  1. IP地址拆分
String s2 = "198.010.1.0";
String[] s3 = s2.split("\\.");
for (int i = 0; i < s3.length; i++) {
    System.out.println(s3[i]);
}

//198
//010
//1
//0
  1. 字符 “|” “*” “.” “+” 前面要加" \ \ "
  2. " \ “前面要加” \ \ \ \ "
  3. 如果要分割的字符串中有多个字符串分隔符,用按位或符号( | )连接
String s2 = "198\\019\\1\\0&limit";
String[] s3 = s2.split("\\\\|&");
for (int i = 0; i < s3.length; i++) {
    System.out.println(s3[i]);
}

//198
//019
//1
//0
//limit

2.4 截取字符串

subString方法,截取区间为左闭右开

String s = "hello";
//从截取下标到末尾
String s1 = s.substring(2);
System.out.println(s1);//llo
//指定区间截取
String s2 = s.substring(1,3);
System.out.println(s2);//el

2.5 其他操作

trim方法,去掉字符串左右的空格,中间的空格不去除

String s = "  he  llo  ";
System.out.println(s);
String s1 = s.trim();
System.out.println(s1);

//运行结果
//  he  llo  
//he  llo

2.6 修改字符串——字符串的不可修改性

下图是String的源码
在这里插入图片描述
字符串的不可修改性是private导致的,与final无关。final修饰value是不能修改value指向的数组地址(数组是引用类型),若不修改引用,只修改数组内容也不会违背final。所以不是final在起作用,而是private导致的字符串不可修改。
若想直接修改字符串,可以用StringBuffer和StringBuilder类。

3. StringBuilder和StringBuffer

由汇编语言可见,String拼接字符串时需要创建StringBulider对象,再append两次,再toString方法。而StringBuilder只需要append即可。
在这里插入图片描述
按照汇编语言编写代码,运行效果和源代码相同。再看String和StringBuilder和StringBuffer的拼接字符串的差距,如下,

public static void main(String[] args) {
        //测试String拼接100000个数字所有的时间,用结束时间-开始时间
        String s = "";
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            s = s + i;
        }
        long end = System.currentTimeMillis();
        System.out.println("String:" + (end - start));

        //测试StringBuilder拼接100000个数字所有的时间,用结束时间-开始时间
        StringBuilder stringBuilder = new StringBuilder();
        start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            stringBuilder.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println("StringBuilder:" + (end - start));

        //测试StringBuffer拼接100000个数字所有的时间,用结束时间-开始时间
        StringBuffer stringBuffer = new StringBuffer();
        start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            stringBuffer.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println("StringBuffer:" + (end - start));
    }

//运行结果
String:17571
StringBuilder:1
StringBuffer:2

* String,StringBuilder和StringBuffer区别(面试题)

  1. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改。String拼接时需要耗费大量资源,StringBuilder(或StringBuffer)则基本不耗费资源。
  2. StringBuffer与StringBuilder大部分功能是相似的,StringBuffer属于线程安全操作;而StringBuilder属于线程不安全操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值