String的讲解(Java系列9)

目录

前言:

1.String

1.1字符串的构造

1.2Sting对象的比较

1.3字符串的查找

1.4字符串的转化

1.4.1数值和字符转换

1.4.2大小写转换

1.4.3字符串转数组

1.4.4格式化

1.5字符串的替换

1.6字符串拆分

1.7字符串截取

1.8字符串去空格

1.9字符串的不可变性

1.10字符串修改

2.StingBuilder和StingBuffer

2.1StringBuffer

2.2StringBuilder

2.3String、StringBuilder和StringBuffer的区别

结束语:


前言:

在C语言中我们是没有String这个概念的,在C语言中我们都是通过指针来表达的,但是在Java中我们就可以通过String来表示一个字符串了。那么接下来就和小编一起来见识一下String究竟是什么,我们又该怎么使用他们。

1.String

为什么会出现String类呢?

在C语言中以及涉及到了字符串这个概念了,但是在C语言中要表示字符串只能使用字符数组或者是字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数组和操作数据方法分离开的方式不符合面向对象的思想,而字符串应用有非常广泛,因此Java语言专门提供了String类。

1.1字符串的构造

常用的三种构造方式:

代码如下所示:

public class Test1 {
    public static void main(String[] args) {
        //1.使用常量串构造
        String str1 = "str1:hello";
        System.out.println(str1);
        //2.直接new一个String对象
        String str2 = new String("str2:hello");
        System.out.println(str2);
        //3.使用字符数组进行构造
        char[] array = {'s','t','r','3',':','h','e','l','l','o'};
        String str3 = new String(array);
        System.out.println(str3);
    }
}

结果如下所示:

 注意:

1.String是引用类型,内部并不存储字符串本身。

2.在Java中“”引起来的也是String类型对象。

1.2Sting对象的比较

1.==比较是否引用同一个对象。

代码如下所示:

public class Test2 {
    public static void main(String[] args) {
        //对于基本类型变量,==比较两个变量中存储的值是否相同。
        int a = 10;
        int b = 20;
        int c = 10;
        System.out.println(a == b);
        System.out.println(a == c);
        //对于引用类型变量,==比较两个引用变量引用的是否为同一个对象。
        String s1 = new String("hello");
        String s2 = new String("hello");
        String s3 = new String("world");
        System.out.println(s1 == s2);
        System.out.println(s2 == s3);
    }
}

结果如下所示:

2.boolean equals (Object anObject),那么我们可以通过equals来进行比较两个引用所指向的对象当中的内容是否是一致的。

代码如下所示:

public class Test3 {
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("hello");
        String s3 = new String("world");
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));
    }
}

结果如下所示:

3.int compareTo(String s)比较两个字符串的大小,方法:按照字典序进行比较。

与equals不同的是,equals返回的是Boolean类型,而compareTo返回的是int类型。具体的比较方法如下所示:

  • 先按字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值。
  • 如果前K个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值。

代码如下所示:

public class Test1 {
    public static void main(String[] args) {
        String s1 = "abcdef";
        String s2 = "abcdfe";
        String s3 = "abcd";
        String s4 = "abcd";
        System.out.println(s1.compareTo(s2));//不同输出字符差值-1
        System.out.println(s1.compareTo(s3));//前K个字符相同,则输出长度差值2
        System.out.println(s3.compareTo(s4));//相同则输出0
    }
}

如果如下所示:

4.int compareTolgnoreCase(String str)忽略大小写进行比较,方法:与compareTo方式相同,但是忽略大小写比较。

代码如下所示:

public class Test1 {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "Hello";
        String s3 = "world";
        System.out.println(s1.compareToIgnoreCase(s2));
        System.out.println(s1.compareToIgnoreCase(s3));
    }
}

结果如下所示:

1.3字符串的查找

1.char charAt(int index),返回index位置上的字符,如果index为负数或者越界,抛出indexOutOfBoundsException异常。

代码如下所示:

public class Test1 {
    public static void main(String[] args) {
        String s1 = "hello";
        System.out.println(s1.charAt(0));
        System.out.println(s1.charAt(1));
        System.out.println(s1.charAt(2));
        System.out.println(s1.charAt(3));
        System.out.println(s1.charAt(4));
        //System.out.println(s1.charAt(5));//会抛出异常
    }
}


结果如下所示:

 

2.int intdexOf(int ch),返回的是ch第一次出现的位置,没有则返回-1。

代码如下所示:

public class Test4 {
    public static void main(String[] args) {
        String s1 = "hello world";
        System.out.println(s1.indexOf('e'));
    }
}

结果如下所示:

 

3.int indexOf(int ch , int fromIndex),从fromindex位置开始查找ch第一次出现的位置,没有则返回-1。

代码如下所示:

public class Test3 {
    public static void main(String[] args) {
        String s1 = "hello world";
        System.out.println(s1.indexOf("o",5));
    }
}

结果如下所示:

4.int index(String str),返回str第一次出现的位置,没有则返回-1。

代码如下所示:

public class Test5 {
    public static void main(String[] args) {
        String s1 = "abcdef";
        System.out.println(s1.indexOf("cd"));
    }
}

结果如下所示:

 

5.int intdex(String str, int fromIndex),从fromindex位置开始找str第一次出现的位置,没有返回-1。

代码如下所示:

public class Test6 {
    public static void main(String[] args) {
        String s1 = "abcdefabcd";
        System.out.println(s1.indexOf("abc",4));
    }
}

 

结果如下所示:

6.int lastindex(int ch),从后往前找,返回ch第一次出现的位置,没有则返回-1。

代码如下所示:

public class Test7 {
    public static void main(String[] args) {
        String s1 = "acbcdefabcd";
        System.out.println(s1.lastIndexOf('a'));
    }
}

结果如下所示:

7.int lastIndex(int ch, int fromindex),从fromindex位置开始找,从后往前找ch第一次出现的位置,没有返回-1。

代码如下所示:

public class Test8 {
    public static void main(String[] args) {
        String s1 = "acbcdefabcd";
        System.out.println(s1.lastIndexOf('b',4));
    }
}

结果如下所示:

 

8.int lastIndexOf(String str),从后往前找,返回str第一次出现的位置,没有则返回-1。

代码如下所示:

public class Test9 {
    public static void main(String[] args) {
        String s1 = "hello world";
        System.out.println(s1.lastIndexOf("or"));
    }
}

结果如下所示:

9.int lastIndexOf(String str,int fromlndex),从fromindex位置往前找,从后往前找str第一次出现的位置,没有则返回-1。

代码如下所示:

public class Test10 {
    public static void main(String[] args) {
        String s1 = "hello world";
        System.out.println(s1.lastIndexOf("or",3));
    }
}

 

结果如下所示:

1.4字符串的转化

对于字符串的转换返回的都是一个新的字符串,不会再之前的字符串基础上进行操作。

1.4.1数值和字符转换

代码如下所示:

public class Test11 {
    public static void main(String[] args) {
        //数字转字符串
        String s1 = String.valueOf(123);//将整形转换成字符型
        String s2 = String.valueOf('s');//将字符型转换成字符型
        String s3 = String.valueOf(1.2f);//将单精度浮点型转换成字符型
        String s4 = String.valueOf(1.23);//将双精度浮点型转换成字符型
        String s5 = String.valueOf(123L);//将long转换成字符型
        System.out.println("-----数字转字符串---");
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
        System.out.println(s5);
        System.out.println("-----字符串转数字----");
        //字符串转数字
        int d1 = Integer.parseInt("1234");
        short d2 = Short.parseShort("12");
        double d3 = Double.parseDouble("12.3");
        float d4 = Float.parseFloat("1234.5");
        long d5  = Long.parseLong("123");
        System.out.println(d1);
        System.out.println(d2);
        System.out.println(d3);
        System.out.println(d4);
        System.out.println(d5);
    }
}

 

结果如下所示:

1.4.2大小写转换

  • toUpperCase:转大写
  • toLowerCase:转小写

代码如下所示:

public class Test12 {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO";
        String s3 = "Hello";
        System.out.println(s1.toUpperCase());//转大写
        System.out.println(s2.toLowerCase());//转小写
        System.out.println(s3.toLowerCase());//不一样的字符,转小写
        System.out.println(s3.toUpperCase());//不一样的字符,转大写
    }
}

结果如下所示:

 

1.4.3字符串转数组

代码如下所示:

public class Test13 {
    public static void main(String[] args) {
        //字符串转数组
        System.out.println("-----字符串转数组---");
        String s1 = "1234";
        char[] array = s1.toCharArray();
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
        //数组转字符串
        System.out.println("-----数组转字符串---");
        String s2 = new String(array);
        System.out.println(s2);
    }
}

结果如下所示:

 

1.4.4格式化

代码如下所示:

public class Test14 {
    public static void main(String[] args) {
        String s1 = String.format("%d-%d-%d",2023,1,4);
        System.out.println(s1);
    }
}

结果如下所示:

 

1.5字符串的替换

使用一个指定的字符串替换掉所有的字符串数据,可用以下方法:

  • replaceAll:替换所有的指定内容
  • replaceFirst:替换首个内容

代码如下所示:

public class Test15 {
    public static void main(String[] args) {
        //替换所有的指定内容
        System.out.println("---替换所有的指定内容--");
        String s1 = "hello world";
        String s2 = s1.replaceAll("l","_");
        System.out.println(s2);
        //替换首个内容
        System.out.println("------替换首个内容------");
        System.out.println(s1.replaceFirst("l","_"));
    }
}

 

结果如下所示:

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

1.6字符串拆分

关键字:split

代码如下所示:

public class Test16 {
    public static void main(String[] args) {
        String s1 = "Embrace you through the wind and rain";
        //将字符全部拆分
        System.out.println("---------将字符全部拆分------");
        String[] array1 = s1.split(" ");//按空格进行分隔
        for (String i:array1) {
            System.out.println(i);
        }
        //将字符串以指定的格式,拆分为指定的组数
        System.out.println("----将字符串以指定的格式,拆分为指定的组数---");
        String[] array2 = s1.split(" ",4);
        for (String s:array2) {
            System.out.println(s);
        }
    }
}

结果如下所示:

注意:

  • 字符“|”,“*”,“+”都得加上转义字符,前面加上“\\”。
  • 而如果是“\\”,那么就得写成“\\\\”。
  • 如果一个字符串中有多个分隔符,可以用“|”作为连字符。

代码如下所示:

public class Test17 {
    public static void main(String[] args) {
        String s1 = "198.123.890";
        String[] array1  = s1.split("\\.");
        for (String s:array1) {
            System.out.println(s);
        }
        System.out.println("--------------------");
        String s2 = "1233=32-21";
        String[] array2 = s2.split("=|-");
        for (String s:array2) {
            System.out.println(s);
        }
        System.out.println("--------------------");
        String s3 = "1243\\2324";
        String[] array3 = s3.split("\\\\");
        for (String s:array3) {
            System.out.println(s);
        }
    }
}

结果入下所示:

 

1.7字符串截取

关键字:substring

代码如下所示:

public class Test18 {
    public static void main(String[] args) {
        String s1 = "Embrace you through the wind and rain";
        //从指定的索引截取结尾
        System.out.println("-------从指定的索引截取结尾----");
        System.out.println(s1.substring(7));
        //截取部分内容
        System.out.println("--------截取部分内容------");
        System.out.println(s1.substring(7,17));
    }
}

结果如下所示:

注意:截取部分的时候是“左闭右开”的,也就是在上述代码中可以截取到7,但是截取不到17位置上的字母,即[7,17)

1.8字符串去空格

关键字:trim

trim是去掉字符串左右的空格保留中间的空格。

代码如下所示:

public class Test19 {
    public static void main(String[] args) {
        String s1 = "    Embrace you through the wind and rain     ";
        System.out.println("去掉之前:");
        System.out.println(s1);
        System.out.println("去掉之后:");
        System.out.println(s1.trim());
    }
}

 

结果如下所示:

1.9字符串的不可变性

String是一种不可变对象,字符串中的内容是不可以改变的,字符串不可以被修改,是因为:

1.String在设计的时候就是不可变的,我们可以看一下String类中的描述。

 

由上述图可得:

  • String类中数值实际是保存在value数组中,而该成员变量是由private修饰的,所以是不可以修改的。
  •  其次我们还可以看出String类是有fina修饰的,故不可以被继承。
  • value被final修饰,表明value自身的值不能改变,即不能引用其他字符数组,但是其引用空间中的内容可以修改。

2.所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象。 

1.10字符串修改

在使用String的时候应该尽量避免直接对字符串进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。

如下面的代码所示:

public class Test20 {
    public static void main(String[] args) {
        String s1 = "hello";
        s1 += " world";
        System.out.println(s1);
    }
}

在进行字符串拼接的时候就会产生新的对象。所以会大大降低速率。那么怎样才能提高效率呢?

接下来我们就看StringBuilder和StringBuffer都有哪些好处吧。 

2.StingBuilder和StingBuffer

由于String的不可更改性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个大部分功能是相同的,下面我们就来分别看一下吧!

2.1StringBuffer

1.尾部追加:append

代码如下所示:

public class Test21 {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = " world";
        StringBuffer stringBuffer = new StringBuffer(s1);
        stringBuffer.append(s2);
        System.out.println(stringBuffer);
    }
}


结果如下所示:

2.char charAt(int index)获取index位置的字符。

代码如下所示:

public class Test22 {
    public static void main(String[] args) {
        String s1 = "hello";
        StringBuffer stringBuffer = new StringBuffer(s1);
        char ret = stringBuffer.charAt(2);
        System.out.println(ret);
    }
}

结果如下所示:

 3.void setCharAt(int index,char ch),将index位置的字符设置为ch。

代码如下所示:

public class Test23 {
    public static void main(String[] args) {
        String s1 = "hello";
        StringBuffer stringBuffer = new StringBuffer(s1);
        stringBuffer.setCharAt(2,'o');
        System.out.println(stringBuffer);
    }
}

结果如下所示:

 4.reverse:反转字符

代码如下所示:

public class Test24 {
    public static void main(String[] args) {
        String s1 = "hello";
        StringBuffer stringBuffer = new StringBuffer(s1);
        stringBuffer.reverse();
        System.out.println(stringBuffer);
    }
}

结果如下所示:

2.2StringBuilder

其实StringBuilder与StringBuffer有很多相同的方法。

如下面的代码所示:

public class Test25 {
    public static void main(String[] args) {
        String s = "abcdef";
        StringBuilder stringBuilder = new StringBuilder(s);
        //尾部追加字符append
        System.out.println("-------尾部追加字符append-------");
        stringBuilder.append("hello");
        System.out.println(stringBuilder);
        //获取某个位置上的字符
        System.out.println("--------获取某个位置上的字符---------");
        char ret = stringBuilder.charAt(3);
        System.out.println(ret);
        //设置某个位置上的字符
        System.out.println("---------设置某个位置上的字符-------");
        stringBuilder.setCharAt(2,'o');
        System.out.println(stringBuilder);
        //返回第一次出现指定字符的位置
        System.out.println("-------返回第一次出现指定字符的位置------");
        int d = stringBuilder.indexOf("cd");
        System.out.println(d);
        //将某个区间内的字符返回
        System.out.println("-------将某个区间内的字符返回--------");
        System.out.println(stringBuilder.substring(1, 5));
        //反转字符
        System.out.println("------------反转字符-----------");
        System.out.println(stringBuilder.reverse());
    }
}

结果如下所示:

 

2.3String、StringBuilder和StringBuffer的区别

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

结束语:

好啦这次小编和大家分享到这里啦!这次主要和大家讲了String类的主要用法和Sting是可以改变内容的,但是我们可以通过StringBuilder和StringBuffer来进行改变,希望对大家有所帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!) 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力敲代码的小白✧٩(ˊωˋ*)و✧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值