在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字 符串应用又非常广泛,因此Java语言专门提供了String类。本片博客非常长,请耐心观看。
一、String类的定义
在Java编程语言中,String类是最常用的类之一。它被广泛应用于字符串的处理、文本内容的分析等各种场景之中。在Java中,String类是一个不可改变的字符序列,即一旦被创建,就不能被修改。这也是String类为什么会这么重要的原因之一。
二、String类的特性
- 字符串是不可变的:这意味着如果原始字符串值变化,则相应的新字符串需要重新复制。
- 字符串长度固定:在Java中字符串的长度是固定的,不能像数组那样改变其容量大小。
- 简单易用的创建方式:创建一个字符串可以采用直接使用字符串字面值、通过 new 关键字来实例化一个字符串对象等方式。
- 支持正则表达式的操作:Java中支持正则表达式,可以用于字符串匹配和分割等操作。
- 支持基本的字符串操作:比如对于字符串的添加、插入、修改、删除等内容操作,都可以在Java中轻松地找到对应的API。
- 与其它数据类型之间的转换:Java提供了特定的方式来将字符串转换为其它数据类型,以及将其它数据类型转换为字符串。
- 存储在字符串池中:Java中字符串被放入字符池中,当创建一个新字符的时候,它会首先查找池中是否存在此字符串来判断是否需要创建一个新的对象。(具体字符池是什么,要等到数据结构才会深入讲解)
三、String类的方法
String类的方法有很多,下面给大家列几种常用的。
3.1、字符串构造
字符串的构造常见的就三种,如下:
(3.1.1)直接赋值
public static void main(String[] args) {
String str = "China.No1";
System.out.println(str);
}
(3.1.2)通过对象赋值
因为String
是个独自的类,所以可以通过new
一个对象来传参给他赋值,代码如下:
public static void main(String[] args) {
String str = new String("China.No1");
System.out.println(str);
}
(3.1.3)通过字符数组赋值
public static void main(String[] args) {
char[] cha = {'C', 'h', 'i', 'n', 'a', '.', 'N', 'o', '1'};
String str = new String(cha);
System.out.println(str);
}
对比起后两种,第一种直接赋值其实更常用。
3.2、求字符串长度
length()
方法:返回字符串的长度,返回值用int类型的变量接收,代码如下:
public static void main(String[] args) {
String arr = "abcde";
int len = arr.length();
System.out.println(len);
}
结果如下:
3.3、字符串判空
isEmpty()
字符串判空方法的返回值是boolean
类型的,所以要创建boolean
类型的变量来接收,代码如下:
public static void main(String[] args) {
String str = "";
boolean flag = str.isEmpty()
//判断str里是否为空,为空输出“true”,反之输出“false”
System.out.println(flag);//输出“true”
str = "China.No1";
flag = str.isEmpty()
System.out.println(flag);//输出“false”
}
3.4、字符串的比较
(3.4.1)“==”比较
public static void main(String[] args) {
String str1 = new String("abcde");
String str2 = new String("abcde");
System.out.println(str1 == str2);//①
System.out.println("==================");
String str3 = "abc";
String str4 = "abc";
System.out.println(str3 == str4);//②
}
大家大可以猜测①和②分别输出的是什么呢?都是false
?还是都是true
呢?答案如下:
怎么样?这样的结果是不是有点诧异呢?第一个flase
好理解,因为这里的等号是比较的地址嘛,str1
和str2
都new
了两个不同的对象,那第二个为什么是一样的呢?其实这涉及到字符串池的问题,可以浅浅的讲一点点,因为第二种采用的是直接赋值,没有规定必须要开辟两个对象的空间,等str3
赋值好了,到str4
赋值的时候,它会优先在字符串池里面找,要是找到了一样的,就把这个地址给str4
,要是没有,就再开辟一块内存区域存放str4
。
(3.4.2)三种方法
equals(Object anObject)
:返回值是boolean
类型的,比较两个字符串的内容是否相等,代码如下:
public static void main(String[] args) {
String str5 = "abc";
String str6 = "abcde";
boolean flag = str5.equals(str6);
System.out.println(flag);
}
运行结果如下:
compareTo(String anotherString)
:返回两个字符串的差距
与equals
不同的是,equals
返回的是boolean
类型,而compareTo
返回的是int
类型。
具体比较方式:先按照字典次序(字符大小的顺序)大小比较,如果出现不等的字符,直接返回这两个字符的大小差值,如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值,下面是代码实现:
public static void main(String[] args) {
String str5 = "abc";
String str6 = "abcde";
int ret = str5.compareTo(str6);
System.out.println(ret);
}
运行结果如下:
compareToIgnoreCase(String str)
:忽略大小写返回差距
具体方法与上面compareTo
相同,只不过忽略大小写,下面是代码实现:
public static void main(String[] args) {
String str5 = "abc";
String str6 = "abC";
int ret = str5.compareToIgnoreCase(str6);
System.out.println(ret);
}
运行结果如下:
3.5、字符串的查找
(3.5.1)charAt()
charAr(int index)
:返回值是char
类型,返回的是index
这个下标的元素是什么,代码实现如下:
public static void main(String[] args) {
String str = "Hello";
char ch = str.charAt(1);//返回1下标的元素
System.out.println(ch);
}
运行结果如下:
(3.5.2)indexOf()
indexOf(int ch)
:返回值是int
类型的,返回ch
该元素的下标是多少,具体代码如下:
public static void main(String[] args) {
String str = "Hello";
int ret = str.indexOf('l');
System.out.println(ret);
}
运行结果如下:
indexOf(int ch, int fromIndex)
:上面方法的重载,表示在fromIndex
的位置开始往后面查ch
的字符,返回第一个的下标,下面是代码实现:
public static void main(String[] args) {
String str = "Hello";
int ret = str.indexOf('l', 3);
System.out.println(ret);
}
运行结果如下:
indexOf(String str)
:返回值是int
类型的,还是重载方法,传入str
字符串查找位置,返回字符串首字符找到的下标,代码实现如下:
public static void main(String[] args) {
String str = "Hello";
int ret = str.indexOf("el");
System.out.println(ret);
}
运行结果如下:
indexOf(String str, int fromIndex)
:返回值是int
类型,又是前面方法的重载,表示在fromIndex
这个下标位置开始往后找str
字符串,返回第一个字符的下标,下面是代码实现:
public static void main(String[] args) {
String str = "Hello";
int ret = str.indexOf("ll",2);
System.out.println(ret);
}
运行结果如下:
(3.5.3)lastIndexOf()
lastIndexOf(int ch)
:返回值是int
类型,这个比较有趣,是从后往前找ch
这个字符,返回第一次找到ch
下标,下面是代码实现:
public static void main(String[] args) {
String str = "Hello";
int ret = str.lastIndexOf('l');
System.out.println(ret);
}
运行结果如下:
lastIndexOf(int ch, int fromIndex)
:还是重载,表示从fromIndex
的位置开始往前找,下面是代码实现:
public static void main(String[] args) {
String str = "Hello";
int ret = str.lastIndexOf('l', 2);
System.out.println(ret);
}
运行结果如下:
lastIndexOf(String str)
:又双叒叕是重载,这次表示从后面往前查找字符串,下面是代码实现:
public static void main(String[] args) {
String str = "Hello";
int ret = str.lastIndexOf("ll");
System.out.println(ret);
}
运行结果如下:
lastIndexOf(String str, int fromIndex)
:还是重载,这次表示从fromIndex
开始往前找,返回下标,下面是代码实现:
public static void main(String[] args) {
String str = "Hello";
int ret = str.lastIndexOf("el", 4);
System.out.println(ret);
}
运行结果如下:
3.6、字符串的转换
(3.6.1)字符串转换大小写
下面是代码实现:
public static void main4(String[] args) {
String str1 = "abababababcabcabd";
String ret1 = str1.replaceAll("ab", "AB");//所有ab替换成AB
System.out.println(ret1);
System.out.println("===================");
String ret2 = str1.replaceFirst("ab", "AB");//第一个ab替换成AB
System.out.println(ret2);
System.out.println("===================");
String ret3 = str1.replace("ab", "AB");//还是把所有的ab替换成AB
System.out.println(ret3);
System.out.println("===================");
String ret4 = str1.replace('a', 'A');//替换所有单个字符成单个字符
System.out.println(ret4);
System.out.println("===================");
String ret5 = str1.toUpperCase();//全部转大写
System.out.println(ret5);
System.out.println("===================");
String ret6 = str1.toLowerCase();//全部转小写
System.out.println(ret6);
System.out.println("==================");
}
运行结果如下:
(3.6.2)字符串和数字之间的转化
- 数字转字符串:下面是代码实现
public static void main(String[] args) {
String str1 = String.valueOf(12345);
String str2 = String.valueOf(123.45);
System.out.println(str1);
System.out.println(str2);
}
运算结果如下:
乍一看没区别,其实这是字符串,不信你可以看str1
和str2
的类型都是String
类型的。
- 字符串转数字:下面是代码实现
public static void main(String[] args) {
int data1 = Integer.parseInt("12345");
double data2 = Double.parseDouble("123.45");
System.out.println(data1);
System.out.println(data2);
}
运行结果如下:
(3.6.3)字符串和数组之间的转换
- 字符串转数组:下面是代码实现
public static void main(String[] args) {
String str1 = "hello";
char[] ch = str1.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.println(ch[i]);
}
}
运行结果如下:
- 数组转字符串:
public static void main(String[] args) {
char[] ch = {'h', 'e', 'l', 'l', 'o'};
String str = new String(ch);
System.out.println(str);
}
运行结果如下:
3.7、字符串的替换
replaceAll(String regex, String replacement)
:返回值是String
类型,意思是将所有的regex
全部替换成replacement
,下面是代码实现:
public static void main(String[] args) {
String str = "helloworld";
String ret = str.replaceAll("l", "_");
System.out.println(ret);
}
运行结果如下:
replaceFirst(String regex, String replacement)
:返回值是String
类型,意思是将第一个regex
替换成replacement
,下面是代码实现:
public static void main(String[] args) {
String str = "helloworld";
String ret = str.replaceFirst("l", "_");
System.out.println(ret);
}
运行结果如下:
3.8、字符串拆分
split(String regex)
split(String regex, int limit)
这两个都是分割字符串,返回值都是String[]
类型,第一个是判断只要是regex
就分割开,第二个是遇见regex
就分割,分割成limit
组,下面是代码实现:
public static void main(String[] args) {
String str = "Hello World Hello Bit.";
String[] ret1 = str.split(" ");//分割字符串
for (int i = 0; i < ret1.length; i++) {
System.out.println(ret1[i]);
}
System.out.println("==================");
String[] ret2 = str.split(" ",2);//分割字符串,分成两组
for (int i = 0; i < ret2.length; i++) {
System.out.println(ret2[i]);
}
}
运行结果如下:
3.9、字符串的删除
substring(int beginIndex)
:返回值是String
类型的,表示删除第beginIndex
个元素。substring(int beginIndex, int endIndex)
:上面方法的重载,表示删除beginIndex
之前,endIndex
之后的元素,包左不包右,这两个的代码如下:
public static void main(String[] args) {
String str1 = "Hello World Hello Bit.";
String ret = str1.substring(1);//删除1下标的元素
System.out.println(ret);
ret = str1.substring(1,5);//删除1下标之前,5下标之后的元素,包左不包右
System.out.println(ret);
}
运行结果如下:
trim()
:返回值是String
,表示删除字符串前面和后面的所以空格,下面是代码实现:
public static void main(String[] args) {
//删减下标值
String str1 = " Hello World Hello Bit. ";
System.out.println(str1.trim());//删除左右的空格,如果没有就不删
}
运行结果如下:
四、总结
在这篇关于Java的String类的博客中,我们深入了解了什么是字符串,什么是String类以及它的常用方法。通过学习,我们可以发现String类在Java编程中起着非常重要的作用,并且它的用途极其广泛,在实际开发中也有着很重要的应用。但是需要注意的是,在使用字符串时,应该避免频繁的创建新的String对象,因为这样会影响程序的性能。如果您想要进一步深入了解Java的String类,请继续学习并探索更多相关的知识。
五、心灵鸡汤
在学习Java的String类的过程中,我们不仅学到了如何有效地处理字符串,也启示了我们在生活中的哲理。在编写代码时,我们需要细心、耐心和热情,才能写出更好的代码;在生活中,同样需要有这些品质,才能成就自己的事业,走向人生的巅峰。因此,请一定要坚持学习、保持希望,在遇到挫折时不要气馁,而是勇往直前,相信自己一定可以成功!