目录
1.String类
1.1构造方法
1.1.1使用常量字符串构造
1.1.2.创建对象,在带参的构造方法中传入一个字符串构造
1.1.3.通过字符数组进行构造
1.2字符串的比较
1.3字符串的查找操作
1.3.1charAt()方法
1.3.2indexOf()方法
1.4字符串转换操作
1.4.1字符串转数值
1.4.2数值转字符串
1.5字符串的替换
1.5.1replaceAll(String regex, String replacement)
1.5.2replaceFirst(String regex, String replacement)
1.6字符串拆分
1.7字符串截取
1.8字符串修剪方法
1.9大小写转换方法
1.10字符串常量池
1.10.1常量池的简介
1.10.2intern方法
1.11字符串的不可变性
2.StringBuilder 和 StringBuffer
在JAVA中String是字符串类,String是相当的重要的
String有很多构造方法,我们简单介绍一些:
public class Main {
public static void main(String[] args) {
String str = "abcdef";
System.out.println(str);
}
}
public class Main {
public static void main(String[] args) {
String str = new String("abcdef");
System.out.println(str);
}
}
public class Main {
public static void main(String[] args) {
char[] arr = new char[]{'a', 'b', 'c', 'd', 'e', 'f'};
String str = new String(arr);
System.out.println(str);
}
}
这里需要注意,我们是给构造方法传了一个字符数组,然后String类帮我们把数组构造成字符串
通过源码,我们可以看到,String构造方法是把字符数组拷贝了一份 给到str的value里面
再去看看String中的字段,可以发现String中的value其实还是一个char类型的数组
注意:其实我们上面的第一种写法是第二种的简化,并没有孰优孰劣
我们都知道,String类是引用变量,是无法进行比较内容的,所以我们String类中重写了Object中的equals方法,进行字符串比较
先看如果是用== 进行比较的结果
这里我们用两个内容相同的字符串用等号比较,但是结果却不是我们预期的那样,因为这个其实是在比较地址,两个字符串,创建了两个对象,所指向的地址当然不同了,所以结果是false
但是我们如果用equals方法来比较的话,再看结果
可以看到,这个结果是我们想要得到的,为什么呢?其实我们前面提过,因为String类重写了equals方法,我们可以去源码里面看一眼
在JAVA中,还提供了一些字符串的查找函数,我这里就不一一演示,调几个比较重要的演示一下,感兴趣的可以去试一下
charAt在我们的刷题和工作中都是特别常用的方法,非常重要
这个方法的作用是获取到字符串的第n个字符,因为我们前面看到java的String内部value其实是一个数组,所以下标也是从0开始的,看下面的代码
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 += "abcdef";
String str2 = new String();
str2 += "abcdef";
System.out.println(str1.charAt(0));
System.out.println(str1.charAt(1));
System.out.println(str1.charAt(2));
}
}
这里可以看到我们得到的结果就是字符串对应的下标
indexOf()方法其实是有重载方法的 :
1.indexOf(char ch)这个是去寻找字符串中ch第一次出现的位置,如果没有就返回-1,这个是从头开始的
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 += "abcdef";
String str2 = new String();
str2 += "abcdef";
System.out.println(str1.indexOf('c'));
}
}
我们可以看到,c确实是在2号位置
这里有个有意思的事情,就是我们虽然传的是字符类型,但是我们看源码
可以发现,这里是用int类型来接收的,从而也就证明了我们刚开始学C的时候的一句话:字符类型也属于整形家族
2.indexOf(char ch,int fromIndex)
这个重载是从fromIndex下标开始找ch第一次出现的位置
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 += "abcdefc";
System.out.println(str1.indexOf('c',5));
}
}
可以看到,我们的c出现了两次,分别是2号位和6号位,但是我们使用这个重载方法要求从5号位开始找,所以得到的结果是6
3. indexOf(String s)
这个就有意思了,我们这个方法不仅能够找字符,还能找字符串,所以,是很方便的方法,使用方法和上面一样
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 += "abcdefc";
System.out.println(str1.indexOf("def"));
}
}
这个代码返回的值就是3,很好理解把
4.indexOf(String s,int fromIndex)
这个和上面的类似,就不再演示了
1.3.lastIndexOf()方法
lastIndexOf方法和上面的其实是一样的,只不过是从后面开始找,找到那个符合条件的位置
我们这里直接演示四种重载方法
注意:这里后面的int类型的数据是从后往前第几个开始
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 += "abcdefbc";
System.out.println(str1.lastIndexOf('c'));
System.out.println(str1.lastIndexOf('c',5));
System.out.println(str1.lastIndexOf("bc"));
System.out.println(str1.lastIndexOf("bc",5));
}
}
字符串转数值是通过就是把字符串转换成int,double等数值类型
常用的方法是parse**具体看代码
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 += "123";
System.out.println((Integer.parseInt(str1) + 1));
System.out.println((Double.parseDouble(str1) + 1));
}
}
我们可以看到,这里的字符串转成数值类型之后是可以计算的
数值也可以反过来转成字符串,通常使用String中的静态方法valuOf(),具体看代码实现
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 = "hello";
str1 += String.valueOf(123);
System.out.println(str1);
}
}
这里就是把value中的数值转成了字符串,运行结果是
不仅如此,还可以把自定义的对象变成字符串类型的
class Student{
public int age;
public Student(int age){
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
String str1 = new String();
Student student = new Student(10);
str1 += String.valueOf(student);
System.out.println(str1);
}
}
你肯定会说,这有啥用啊,啥有用的数据都没有,但是别急,如果我们给自定义的对象添加一个toString方法之后会怎么样呢?
/**
*
*/
class Student{
public int age;
public Student(int age){
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
'}';
}
}
public class Main {
public static void main(String[] args) {
String str1 = new String();
Student student = new Student(10);
str1 += String.valueOf(student);
System.out.println(str1);
}
}
可以看到,数据变得有用了,我们可以通过toString来设置自己想要的输出
在java中字符串的替换也封装成了方法
这个方法是把字符串中的没一个regex都替换成replacement,具体看代码实现
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 = "abcdecccc";
System.out.println(str1.replaceAll("c","z"));
}
}
我们可以看到运行结果中的c全部变成了z,这里需要注意,替换是重新开了一个字符串来替换,并不是替换原来的字符串中的内容
这个方法是把字符串中第一次出现的regex给替换成replaceme,具体看代码实现
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 = "abcdecccc";
System.out.println(str1.replaceFirst("c","z"));
}
}
可以看到,这里只有第一个c被替换成z了,其他的都没用替换
不仅如此,我们传入的参数还可以是字符串,可以进行字符串的替换,具体看代码实现
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 = "abcdecccc";
System.out.println(str1.replaceAll("abc","c"));
}
}
可以看到这里的abc都被替换成了 c
在Java中,有字符串拆分方法,即把字符串按照某个字符进行拆分,使用的是split方法具体看代码实现
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 = "ab c de cc cc";
System.out.println(Arrays.toString(str1.split(" ")));
}
}
注意,这里返回的是一个字符串数组,我们想要打印数组中的内容,需要用Arrays的toString方法或者使用循环或迭代器
这个方法还可以在后面再传一个数值参数,表示最多分成几组,具体看代码实现
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 = "ab c de cc cc";
System.out.println(Arrays.toString(str1.split(" ",3)));
}
}
我们可以通过','看出了,数组中存了三个数值,分别是ab,c,de cc cc,正好三组
注意:这里的拆分涉及到转义字符
在JAVA中提供了字符串截取方法substring 注意这里的sub和string都是小写字母开头的,这个方法是把传进来一个数值,从数值位截取到结尾,或者另一个数值位,具体看代码实现
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 = "abcdefghijklmn";
System.out.println(str1.substring(5));
System.out.println(str1.substring(5,10));
}
}
可以看到,当我们输入两个数值的时候,他就会从第一个数值截取到第二个数值位置
注意:这里的10是不会截取的,因为Java中大多数都是左闭右开区间的
在java中是可以对字符串进行修建的,比如我们一个字符串,前面有很多空格,后面也有很多空格,我们就可以用trim()方法对其进行修剪,具体看代码实现
public class Main {
public static void main(String[] args) {
String str1 = new String();
str1 = " abcdefghijklmn ";
System.out.println("未修剪" + str1);
System.out.println("修剪后 " + str1.trim());
}
}
这个方法也是一个特别常用的方法,我们使用一些方法对其进行修改
大写转小写是:toLowerCase()
小写转大写是:toUpperCase()
具体看代码实现
public class Main {
public static void main(String[] args) {
String str1 = "123456abcdefghijklmn";
String str2 = "123456ABCDEFascasc";
System.out.println(str1.toUpperCase());
System.out.println(str2.toLowerCase());
}
}
可见这个方法只会对字母进行处理,不会处理其他类型的字符
所以当我们用复制创建字符串的时候,对其进行比较,会发现结果是true,因为他俩引用的是同一块地址
我们来看一个图
这个图里面详细的解释了字符串的常量池
inter方法是我们主动将一些字符串添加到常量池中,这个是人为的添加进去,具体用法如下
这里没办法去验证,所以我们只是实现一下就好了
public class Main {
public static void main(String[] args) {
String str = new String();
str += "123456";
str.intern();
}
}
在Java中字符串是不可变的,原因的话,我们直接去看源码,即可知道
public class Main {
public static void main(String[] args) {
String s = new String();
s = " 123 ";
StringBuffer str1 = new StringBuffer();
str1.append(s);
str1.append("asdasdasd");
System.out.println(str1.toString());
}
}
可以看到,这里我们使用append方法来进行拼接,但是打印的时候因为是StringBuffer类无法打印,所以要用toString方法来转化成字符串打印
这里列举一些方法,需要的可以看一下
感谢阅读!!!