【String字符串之后续】

我们继续上一篇文章为大家讲解,String字符串的相关知识,希望大家有所收获

字符串前篇的链接: link

目录

  • 1.字符串的替换
  • 2.字符串的拆分
  • 3.字符串截取
  • 4.去掉空格
  • 5.String的不可变性
  • 6. 字符串的修改
  • 7.StringBuilder和StringBuffer
  • 8.面试题
    • 8.1面试1
    • 8.2面试2

1.字符串的替换

使用一个指定的新的字符串替换掉已有的字符串数据

由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串

String replaceAll(String regex, String replacement) 
//替换所有的指定内容
String replaceFirst(String regex, String replacement) 
//替换收个内容
public static void main(String[] args) {
        String str="aaabbbccc";
        String str1=str.replaceAll("aaa","111");
        String str2=str.replaceFirst("a","p");
        System.out.println(str1);
        System.out.println(str2);

    }

【String字符串之后续】_第1张图片

2.字符串的拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串

String[] split(String regex) 
//将字符串全部拆分
String[] split(String regex, int limit) 
//将字符串以指定的格式,拆分为limit组
 public static void main(String[] args) {
        String str = "hello world to bit" ;
        String[] result = str.split(" ") ; // 按照空格拆分
        for(String str1: result) {
            System.out.println(str1);
        }
    }

public static void main(String[] args) {
        String str = "hello world to bit" ;
        String[] result = str.split(" ",2) ; // 按照空格拆分
        for(String str1: result) {
            System.out.println(str1);
        }
    }

【String字符串之后续】_第2张图片
【String字符串之后续】_第3张图片

拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义

注意事项:

  1. 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
  2. 而如果是 “” ,那么就得写成 “\\” .
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
 public static void main(String[] args) {
        String str = "192.168.1.1" ;
        String[] result = str.split("\\.") ;
        for(String s: result) {
            System.out.println(s);
        }
    }

多次拆分

public static void main(String[] args) {
        String str = "name=lisi&age=20";
        String[] result = str.split("&");
        for (int i = 0; i < result.length; i++) {
            String[] temp = result[i].split("=");
            System.out.println(temp[0] + " = " + temp[1]);

        }
    }

【String字符串之后续】_第4张图片

3.字符串截取

从一个完整的字符串之中截取出部分内容
这里需要注意,这里的截取区间范围是【)(左闭右开)

String substring(int beginIndex) 
//从指定索引截取到结尾
String substring(int beginIndex, int endIndex) 
//截取部分内容
public static void main(String[] args) {
        String str="abcdef";
        System.out.println(str.substring(2));
        System.out.println(str.substring(2,6));
    }

【String字符串之后续】_第5张图片

4.去掉空格

我么使用String trim() 去掉字符串中的左右空格,保留中间空格

 public static void main(String[] args) {
        String str=" aaa aaa   ";
        System.out.println(str.trim());
    }

【String字符串之后续】_第6张图片

5.String的不可变性

String类在设计时就是不可改变的,String类实现描述中已经说明了
String类中的字符实际保存在内部维护的value字符数组中

注意:

  1. String类被final修饰,表明该类不能被继承
  2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中
    的内容可以修改。
    【String字符串之后续】_第7张图片
    所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内 容是可以修改的。

6. 字符串的修改

尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率
非常低下。

当我们想修改的时候,我们一般会对字符串新建一个对象,然后片拼接在一起

public static void main(String[] args) {
        String str="abc";
        for (int i = 0; i < 5; i++) {
            str=str+'a';
        }
        System.out.println(str);
    }

【String字符串之后续】_第8张图片
我们通过一个代码就可以看出来

        public static void main(String[] args) {
            long start = System.currentTimeMillis();
            String s = "";
            for(int i = 0; i < 10000; ++i){
                s += i;
            }
            long end = System.currentTimeMillis();
            System.out.println(end - start);
            start = System.currentTimeMillis();
            StringBuffer sbf = new StringBuffer("");
            for(int i = 0; i < 10000; ++i){
                sbf.append(i);
            }
            end = System.currentTimeMillis();
            System.out.println(end - start);
            start = System.currentTimeMillis();
            StringBuilder sbd = new StringBuilder();
            for(int i = 0; i < 10000; ++i){
                sbd.append(i);
            }
            end = System.currentTimeMillis();
            System.out.println(end - start);

    }

【String字符串之后续】_第9张图片
可以看出来 StringBuilder的时间是最短的,StringBuiffer其次,String时间是最长的,因为要新建许多的对象

7.StringBuilder和StringBuffer

StringBuff append(Stringstr)
//在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量
char charAt(int index) //获取index位置的字符
int length() //获取字符串的长度
int capacity() //获取底层保存字符串空间总的大小
void ensureCapacity(int mininmumCapacity)//扩容
void setCharAt(int index,char ch) //将index位置的字符设置为ch
int indexOf(String str) //返回str第一次出现的位置
int indexOf(String str, int fromIndex)//从fromIndex位置开始查找str第一次出现的位置
int lastIndexOf(String str) //返回最后一次出现str的位置
int lastIndexOf(String str,int fromIndex)//从fromIndex位置开始找str最后一次出现的位置
StringBuff insert(int offset, String str)/// 在offset位置插入:八种基类类型 & String类型 & Object类型数据
StringBuffer deleteCharAt(int index)//删除index位置字符
StringBuffer delete(int start, int end) //删除[start, end)区间内的字符
StringBuffer replace(int start, int end, String str) //将[start, end)位置的字符替换为str
String substring(int start) //从start开始一直到末尾的字符以String的方式返回
String substring(int start,int end)[start, end)//范围内的字符以String的方式返回
StringBuffer reverse() //反转字符串
String toString() //将所有字符按照String的方式返回
    public static void main(String[] args) {
        StringBuilder sb1 = new StringBuilder("hello");
        StringBuilder sb2 = sb1;// 追加:即尾插-->字符、字符串、整形数字
        sb1.append(' '); // hello
        sb1.append("world"); // hello world
        sb1.append(123); // hello world123
        System.out.println(sb1); // hello world123
        System.out.println(sb1 == sb2); // true
        System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h
        System.out.println(sb1.length()); // 获取字符串的有效长度14
        System.out.println(sb1.capacity()); // 获取底层数组的总大小
        sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Hello world123
        sb1.insert(0, "Hello world!!!"); // Hello world!!!Hello world123
        System.out.println(sb1);
        System.out.println(sb1.indexOf("Hello")); // 获取Hello第一次出现的位置
        System.out.println(sb1.lastIndexOf("hello")); // 获取hello最后一次出现的位置
        sb1.deleteCharAt(0); // 删除首字符
        sb1.delete(0,5); // 删除[0, 5)范围内的字符
        String str = sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回
        System.out.println(str);
        sb1.reverse(); // 字符串逆转
        str = sb1.toString(); // 将StringBuffer以String的方式返回
        System.out.println(str);

}

【String字符串之后续】_第10张图片

从上述例子可以看出:
String和StringBuilder最大的区别在于String的内容无法修改,
而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder。

注意:
String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
StringBuilder变为String: 调用toString()方法

8.面试题

8.1面试1

String、StringBuffer、StringBuilder的区别
String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
StringBuffer与StringBuilder大部分功能是相似的
StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操 作

8.2面试2

String str = new String("ab"); // 会创建多少个对象
String str = new String("a") + new String("b"); // 会创建多少个对象

【String字符串之后续】_第11张图片

你可能感兴趣的:(java,java,servlet,android)