Java--String类

String的构造

//常用的就是以下三种
//方法一:使用常量串构造
String s = "Hello"
//方法二:直接newString对象
String s = new String("Hello");
//方法三:使用字符数组构造
char[] str = {'H','e','l','l','o'};
String s = new String(str);

常用方法

对于一些常用的方法,我们需要记住。下图提到的方法都只是String类的一小部分,详细的可以查阅帮助手册

字符串比较

对于引用类型而言,==只可以比较引用的地址是否相同,是否为同一个对象。如果比较字符串的内容,String提供了一些方法

  1. boolean equals(Object anObject) 方法
    String重写了Object类的equals方法,这个方法比较的是字符串的内容。是如何进行比较的呢?首先先判断两者地址是否相同,如果相同表示引用对象一样,内容肯定一样。如果不同,再判断equals()括号中传过来的类型是否为String类型,如果不是,返回false(类型都不一样还判断啥呢),如果是再判断两个字符串的长度是否相同,如果不同返回false,相同再按照字典序,从前往后逐个字符依次比较。
  2. int compareTo(String s) 方法: 按照字典序进行比较
    这个方法与equals不同之处在于返回值,这个方法返回整数,比较方法如下:按照字典序逐个比较,如果遇到不同的,返回两个字符的差值,如果前k个相同则返回字符串长度的差值。
  3. int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较。

字符串查找

在这里插入图片描述

其他类型与字符串的相互转换

//其他类型转为字符串用String.valueOf方法
String s = String.valueOf(123);
//字符串转为其他类型需要用到其他类型的包装类
int num = Integer.parseInt("123");
double num1 = Double.parseDouble("12.3");

大小写转换

        String s = "hello";
        String s1 = s.toUpperCase();//全部变大写
        System.out.println(s1);
        String s2 = s1.toLowerCase();//全部变小写
        System.out.println(s2);

字符串与数组的相互转换

        char[] str = {'h','e','l','l','o'};
        //数组转为字符串
        String s = new String(str);
        //字符串转为数组
        char[] str1 = s.toCharArray();

字符串格式化

        String s = String.format("%d年%d月%d日",2024,8,1);
        System.out.println(s);

字符串替换

指定新的字符串替换掉已有的字符串,注意,替换并不是在原有基础上操作的,而是创建了一个新对象
在这里插入图片描述

字符串拆分

可以按照指定的字符对字符串进行拆分
在这里插入图片描述

  1. 如果划分字符是“|”,“.”,“*”,“+”,前面需要加上“\”
  2. 如果划分字符是“\”,需要写为“\\”
  3. 如果想根据多个字符进行分隔,中间可以用"|"进行分隔

字符串截取

从一个完整的字符串中截取部分内容
在这里插入图片描述

  1. 索引从0开始
  2. 区间为前闭后开形式[0,5)

String trim()

去掉字符串的左右两边空格,留下中间的空格

字符串常量池与不同方法创建String的区别

为了节省存储空间和运行效率,提供了字符串常量池。字符串常量池在JVM中是StringTable类,实际是一个固定大小的HashTable(一种高效用来进行查找的数据结构)

对于创建String,最开始提到了使用常量池来创建,那么有什么区别呢?请看下面图解
在这里插入图片描述
1.对于直接赋值String s = "hello"时,创建对象s时,会先去常量池中查找是否有相同对象,如果有相同的对象,则直接返回该对象在常量池中的引用,如果没有则会在常量池中创建一个对象并存进去,再反对一个对象的引用。
2.对于new String(“hello”)这种,首先也会去常量池检查是否存在这个对象,如果存在,会在堆中创建一个对象,如果不存在会先在常量池中创建一个对象再在堆中创建一个对象。但不管是否存在返回的都是堆内存中的引用。

intern()方法

这个方法是用来手动将String放到常量池

字符串的不可变性

上面我们也提到,对于字符串的修改并不是在原字符串上修改,而是又创建了一个新对象。那么究竟为啥不可以修改呢?
在这里插入图片描述
很多人认为和final有关,但是这是错的!!!
final写在类上表示这个类不可被继承,写在引用变量上指的是指向不可以改变,但指向的内容可以变。
那么究竟为啥不可变呢?原因就是前面的private,这个变量被设置为了私有,并且这个类没有设置set,get方法,我们拿不住到值怎么去修改呢!

字符串修改

上面我们说了字符串不可变,变化会创建新对象,所以我们应该避免对字符串进行修改。那么我们如何修改字符串呢?

StringBuilder和StringBuffer类

StringBuilder和StringBuffer功能类似,而且和String的最大区别在于String不可修改,而这两个类可以进行修改。
StringBuffer采用了同步处理,(我进行的时候别的线程不允许操作,我进行完了以后,别的线程才允许操作)而StringBuilder么有采用同步处理。
1.String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
2.StringBuilder变为String: 调用toString()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值