文章目录
- 一、认识String类
- 1、创建String对象
- 2、不可变的String
- 3、字符串常量池
- 二、字符串常用操作
- 1、字符串比较
- 1.1 用“==”比较
- 1.2 用equals()方法比较
- 1.3用compareTo()方法进行比较
- 2、获取字符串长度
- 3、字符串查找
- 4、字符串转换
- 4.1valueOf()数值转换为字符串
- 4.2字母大小写转换
- 5、字符串替换
- 6、字符串拆分
- 7、字符串截取
- 总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、认识String类
在Java中,字符串是一个由字符序列组成的对象,它用于存储和处理文本数据。字符串是Java编程语言中最常用的数据类型之一,用于表示一系列字符,例如名字、地址、句子等。在Java中,字符串是由java.lang.String类来表示的,这意味着你可以利用这个类提供的丰富的方法来创建、访问以及操作字符串。
1、创建String对象
我们常见的创建String对象,一般有以下的三种:
public class Test {
public static void main(String[] args) {
//创建String对象的三种常见方法
//使用字面量创建字符串
String s1 = "hello";
System.out.println(s1);//输出hello
//使用构造器创建字符串
String s2 = new String("hello" );
System.out.println(s2);//输出hello
//使用char数组创建字符串
char[] chars = {'h', 'e', 'l', 'l', 'o'};
String s3 = new String(chars);
System.out.println(s3);//输出hello
}
}
2、不可变的String
在 Java 中,String 类是一个非常重要的类,它用来表示文本字符串,不仅可以表示数字,英文,还可以表示中文等文本。String 类的对象是不可变的,这意味着一旦创建了一个 String 对象,它的值就不能被改变,我们通过JDK 1.8的文档可以查看到:
由此我们还可以知道,String类是继承了多接口的,一旦创建了String对象就不可以被改变,但可以共享,我们来举一个例子就会一目了然:
public class Test {
public static String upcase(String s) {
return s.toUpperCase();//将字符串的每个字母都变成大写
}
public static void main(String[] args) {
String a = "hello";
System.out.println(a);//输出hello
String b = upcase(a);
System.out.println(b);//输出HELLO
System.out.println(a);//输出hello
}
}
String类中每一个看起来会修改String值的方法,其实都是创建了一个全新的String对象,用来包含被修改过的String对象,而最初的String对象则是没有任何变化的。
当我们把a传给upcase()方法时,实际传递的引用的一个拷贝。每当我们把String对象作为方法的参数时,都会进行复制一份引用,则该对象的值始终没有被改变。
3、字符串常量池
在Java中,字符串常量池是一个特殊的内存区域,它用来存储字符串字面量。当你使用字符串字面量来创建字符串时,JVM会检查字符串常量池中是否已经有相同的字符串。如果有,就会复用已有的字符串对象;如果没有,就会创建一个新的字符串对象,并将其放入字符串常量池中。这种方式有助于减少重复字符串的创建,从而节省内存资源。
我们给个例子更加直观的理解:
public class Test {
public static void main(String[] args) {
// 字符串字面量,将复用字符串常量池中的对象
String str1 = "hello";
String str2 = "hello";
// 使用new关键字创建的新对象,不使用字符串常量池
String str3 = new String("hello");
System.out.println(str1 == str2); // true,因为str1和str2引用的是同一个对象
System.out.println(str1 == str3); // false,因为str3是新创建的对象
System.out.println(str1.equals(str3)); // true,因为内容相同
}
}
字符串常量池的影响:
内存效率: 由于字符串常量池的存在,相同的字符串字面量只会在内存中保存一份,这对于频繁创建相同字符串的应用来说是非常有用的。
性能提升: 使用字符串常量池可以避免创建不必要的对象,减少垃圾回收的压力,从而提高程序的性能。
线程安全性: 字符串常量池中的字符串是不可变的,这意味着它们的内容不能被更改,因此可以安全地在多个线程之间共享。
字符串比较: 当比较两个通过字符串字面量创建的字符串时,可以使用 == 操作符来检查它们是否引用同一个对象。这是因为这些字符串都指向字符串常量池中的同一个位置。但是,对于通过new String()创建的字符串,即使它们的内容完全相同,也必须使用equals()方法来比较内容,因为它们可能是不同的对象。
二、字符串常用操作
1、字符串比较
1.1 用“==”比较
我们通常使用“==”来比较是否引用同一对象,同一对象则返回true,否则返回false
例:
public class Test {
public static void main(String[] args) {
//字符串比较
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = s1;
String s5 = s3;
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//true
System.out.println(s3 == s5);//true
}
}
1.2 用equals()方法比较
我们查看JDK1.8文档可以看到,equals()方法是boolean类型的
equals()先判断是否引用的同一对象或参数是否为null,如果为同一对象则直接返回true,为null则返回false,否则继续比较其引用对象的内容是否相等。
equals()用于比较两个字符串的内容,equals()方法是String类中的方法,我们可以直接通过创建的String对象去直接引用;
例:
public class Test {
public static void main(String[] args) {
String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1.equals(s2));//true
}
}
我们还可以使用equalsIgnoreCase()来比较,这个方法可以忽略大小写进行比较,常用于我们的日常使用的验证码当中,例如:
public class Test {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO";
System.out.println(s1.equalsIgnoreCase(s2));//true
}
}
1.3用compareTo()方法进行比较
compareTo()也是String类中的一个可以直接引用的方法,它的返回值为int(整型),我们点进这个方法进一步了解一下
我们可以很清楚的明白,compareTo()是如何进行比较的
compareTo()和compareToIgnorCase()的区别就是,后者不区分大小写进行比较
例如:
public class Test {
public static void main(String[] args) {
String s1 = "aaabbb";
String s2 = "AAABBB";
System.out.println(s1.compareTo(s2));//输出32
System.out.println(s1.compareToIgnoreCase(s2));//输出0
}
}
2、获取字符串长度
我们通过String对象.length就可以获取我们字符串的长度。
例:
public class Test {
public static void main(String[] args) {
//字符串长度
String s1 = "asdfghjklzxcvbnmqwertyuiop";
System.out.println(s1.length());//输出26
}
}
3、字符串查找
为大家列举了一写关于字符串查找的常用方法:
方法 | 功能 |
---|---|
char charAt(int index) | 返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常 |
int indexOf(int ch) | 返回ch第一次出现的位置,没有返回-1 |
int indexOf(int ch, intfromIndex) | 从fromIndex位置开始找ch第一次出现的位置,没有返回-1 |
int indexOf(String str) | 返回str第一次出现的位置,没有返回-1 |
int indexOf(String str, intfromIndex) | 从fromIndex位置开始找str第一次出现的位置,没有返回-1 |
int lastIndexOf(int ch) | 从后往前找,返回ch第一次出现的位置,没有返回-1 |
int lastIndexOf(int ch, intfromIndex) | 从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1 |
int lastIndexOf(String str) | 从后往前找,返回str第一次出现的位置,没有返回-1 |
int lastIndexOf(String str, intfromIndex) | 从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1 |
例:
4、字符串转换
4.1valueOf()数值转换为字符串
我们可以通过String类中的valueOf()方法,对数值进行转换,将数值转换为字符串,valueOf()的参数许多,如下:
我们可以看到它是被static所修饰的所以可以直接调用。
例:
public class Test {
public static void main(String[] args) {
//String.valueOf()方法可以将其他类型的值转换为字符串
String s1 = String.valueOf(1234);
System.out.println(s1);//输出1234
String s2 = String.valueOf(1234.5678);
System.out.println(s2);//输出1234.5678
String s3 = String.valueOf(1234567890123L);
System.out.println(s3);//输出1234567890123
String s4 = String.valueOf(1234.567F);
System.out.println(s4);//输出1234.567
String s5 = String.valueOf('a');
System.out.println(s5);//输出a
String s6 = String.valueOf(true);
System.out.println(s6);//输出true
String s7 = String.valueOf("hello world");
System.out.println(s7);//输出hello world
}
}
4.2字母大小写转换
我们要将字符串中的字母进行大小写的转换,我们需要用到toLowerCase() 和toUpperCase() 方法。
我们直接用String对象去 .toLowerCase() 就可以使其字母变为小写,.toUpperCase() 就可以使其字母变为大写。
例:
public class Test {
public static void main(String[] args) {
//字符串大小写转换
String s1 = "Hello World";
String s2 = "hello world";
System.out.println(s1.toLowerCase());//输出hello world
System.out.println(s2.toUpperCase());//输出HELLO WORLD
}
}
其操作也是非常的快捷。
5、字符串替换
字符串替换在我们生活中也是很常见的,我们在游戏中会经常看到一下“”的字符串,其是把一些敏感字替换成了“”的字符。
主要是有以下两种方法:
例:
public class Test {
public static void main(String[] args) {
//字符串替换
String s1 = "aaabbb";
String s2 = s1.replaceFirst("a", "A");
String s3 = s1.replaceAll("a","A");
System.out.println(s2);//输出Abbbccc
System.out.println(s3);//输出aabbDbbD
}
}
6、字符串拆分
字符串拆分可以将我们一个字符串以指定的分隔符进行拆分,拆成若干个子字符串,也可以按照指定的份数进行拆分,主要分为2种:
例:
public class Test {
public static void main(String[] args) {
String s1 = "hello world";
String[] arr = s1.split(" ");
for (String s : arr) {
System.out.println(s);
}
//字符串拆分,指定分隔符和最大分割次数
String s2 = "hello,world,hello,java,hehe";
arr = s2.split(",",5);
for (String s : arr) {
System.out.println(s);
}
String s3 = "101.111.321.112";
arr = s3.split("\\.",4);
for (String s : arr) {
System.out.println(s);
}
}
}
输出:
注意事项:
- 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
- 而如果是 “” ,那么就得写成 “\\” .
- 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
7、字符串截取
给定字符串我们可以对其截取我们想要的部分,这时候我们就可以使用substring()方法,如下:
public class Test {
public static void main(String[] args) {
//字符串截取
String s1 = "hello world";
System.out.println(s1.substring(5));//输出 world
System.out.println(s1.substring(0, 5));//输出llo
System.out.println(s1.substring(2, s1.length()));//输出llo world
}
}
在日常生活中我们的手机号,在应用上一般都显示为188****1234这样的形式,其实也是把中间的给替换掉了,我们可以结合字符串的替换和截取进行操作,如下:
public class Test {
public static void main(String[] args) {
String s1 = "18899991234";
System.out.println(s1.replaceAll(s1.substring(3, 7), "****"));
}
}
这样我们不难发现这些方法是可以互相调用的,其操作也是相对很好理解的,我们多加进行练习,便可以使用的更加行云流水。
总结
这些是String类的一些较为常用的知识和方法,当然String类方法不止这些,如果还想了解更多的方法我们可以进行查阅JDK1.8的文档进行学习,各位铁子找不到的话可以私信我,我给发一份。
非常感谢大家阅读完这篇博客。希望这篇文章能够为您带来一些有价值的信息和启示。在未来的日子里,我们将继续探索更多关于博客技术的精彩内容,敬请期待。如果您有任何问题或建议,欢迎在评论区留言,我们一起交流学习。