文章目录
一.String类
1.提供判断功能的方法
1.equals
这个方法在String类中被重写过了.作用是比较两个字符串的内容是否相等.
2.equalsIgnoreCase
这个方法也是用来比较的.与equals方法不同的是:此方法不区分大小写.
3.contains
判断是否包含指定的子串,(连续的)
4.isEmpty
判断该字符串是不是空串
5.startsWith
判断该字符串是不是我们以输入的字符串开头.
6.endsWith
判断该字符串是不是我们以输入的字符串结尾.
public class StringDemo1 {
public static void main(String[] args) {
String s = "abc";
String s1 = "ABC";
System.out.println(s.equals(s1));//false
System.out.println(s.equalsIgnoreCase(s1));//不区分大小写判断,true
System.out.println(s.contains("ab"));//是否包含指定的子串,true
System.out.println(s.isEmpty());//false,判断s字符串是不是空串
/*
注意String s=null;与String s = "";两个不一样
前者是空指针,后者是空字符串
*/
System.out.println(s.startsWith("ab"));//判断s是否以ab开头,true
System.out.println(s.endsWith("bc"));//判断s是否以bc结束,true
}
}
2.提供获取功能的方法
1.length
返回字符串长度.
2.charAt
返回指定位置字符
3.indexOf
**从前往后找,**返回某个字符在字符串中第一次出现的位置,如果没有就是-1
4.lastIndexOf
与上面查询方向相反,这个是从后往前找
5.substring
从指定位置截取新的子串
public class StringDemo2 {
public static void main(String[] args) {
String s = "adcdefg";
System.out.println(s.length());//返回字符串长度
System.out.println(s.charAt(3));//相当于通过索引找字符,返回指定位置字符
System.out.println(s.indexOf("d"));//返回'd'在字符串第一次出现的索引(位置),从前往后找,1
//即使有两个d,返回的也是第一次的d
System.out.println(s.indexOf("d",2));//3
System.out.println(s.indexOf("d", 4));//-1
//要想找完所有的"d",可以循环s.indexOf("d",s.indexOf("d")+1)
System.out.println(s.lastIndexOf("d"));//从后往前找,3
System.out.println(s.substring(2));//从指定位置截取新的子串到结尾,cdefg
System.out.println(s.substring(2, 4));//包含开头不包含结尾的截取新的子串,cd
}
}
3.提供转换功能的方法(内含两个构造方法)
String类中依然具有转换功能的方法
这里一般转换的是数组,分别是byte[ ],以及char[ ],在实际的生活中,字符串使用很多,但是对一个字符串操作往往比较复杂,这个时候我们把一个字符串转换为一个数组,不论是字节型还是字符型都可以使用Arrays这个类中的方法,对这个字符串操作就变得简单了.
1.getBytes()
将字符串转换为一个byte数组
2.toCharArray()
将字符串转换为字符数组.
我们用几个代码进行解释说明:
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class ZhuanHuan {
public static void main(String[] args) {
/*
String类中具有转换功能的方法
*/
String s = "cad";
byte[] bytes = s.getBytes();//转码,转换成byte数组,默认选择平台字符集
//在传输的时候是一个字节流
System.out.println(Arrays.toString(bytes));//[99, 97, 100],可以叫他编码
String s1 = new String(bytes);//将byte数组中的内容转换成为字符串
System.out.println(s1);//cad
//以上用的都是平台默认的字符编码,这里用的是Unicode
}
}
通过上面这段代码我们可以发现,我们可以使用**对象调用getBytes()这个方法.**把一个字符串转变为一个byte数组.然后又可以使用String类的另外一个构造方法.把byte数组传进去这样再把数组转换为一个字符串.
那么这个时候问题又来了,转码的规则是什么?转码的结果是不是确定的,能不能只接受一段编码呢?
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class ZhuanHuan {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "嘿嘿";
byte[] bytes = s.getBytes("gbk");//这里需要加入thows声明,要是不支持这个字符集会发生错误
System.out.println(Arrays.toString(bytes));//[-27, -104, -65, -27, -104, -65]
String s1 = new String(bytes,"gbk");//转码和解码时需要统一字符集
System.out.println(s1);
}
}
上面这段代码在编译的时候就回答了这个问题.我们如果没有进行任何的声明,使用的是java默认的字符集进行转码译码的操作,也就是Unicode编码.
上面这段代码就展示了如何使用其他字符集进行转码以及译码的操作.但要注意的是,这里会报错,我们需要加入一个声明.具体为什么以及其他的解决方法我们后面讲.
那么问题又来了.有些时候编码很长,我知道这个人的习惯,因此只想接受一段译码,这个时候我们应该怎么做呢.
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class ZhuanHuan {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "嘿嘿";
byte[] bytes = s.getBytes("gbk");//这里需要加入thows声明,要是不支持这个字符集会发生错误
System.out.println(Arrays.toString(bytes));//[-27, -104, -65, -27, -104, -65]
//四个参数的构造方法
String s1 = new String(bytes,0,2,"gbk");//utf-8需要三个字节长度表示一个汉字
System.out.println(s1);
}
}
如上就展示了如何只转换一段编码,注意此时构造方法中的参数已经有了四位.
那么接下来我们看另一个转换方法:
import java.util.Arrays;
public class StringDemo {
public static void main(String[] args) {
String s = "1243";
char[] chars = s.toCharArray();
System.out.println(Arrays.toString(chars));//[1, 2,4, 3]
//转成数组可以使用数组中的方法
Arrays.sort(chars);
String s1 = new String(chars);//字符数组转字符串
System.out.println(s1);//1234
}
}
那这种方法就很容易懂了,把字符串转换为char数组,然后我们就可以对其进行一系列"数组"般的操作.
另外还有一个分割字符串的方法split().
import java.util.Arrays;
public class ZhuanHuan2 {
public static void main(String[] args) {
String s = "张三:28岁;李四:26岁;";
String[] strings = s.split(";");
System.out.println(Arrays.toString(strings));//[张三:28岁, 李四:26岁]
}
}
一定要注意的是,使用split方法返回的是一个字符串数组.
4.提供替换功能的方法
1.replace()
替换字符串中的某个字符或者字符串.(全部替换)
2.repalceAll()
按照正则表达式,替换一整个符合正则表达式的某类字符
3.replaceFirst()
按照正则表达式,替换第一个出现的符合正则表达式的字符.
4.trim()
去掉字符串两端的空格
注意:
因为String类变量都被final修饰,因此以上方法返回的都是一个新的字符串.
public class TIHuan {
public static void main(String[] args) {
String s1 = "abcd3aefg6";
//将a替换为A,同时返回新的字符串,s1指向改变
System.out.println(s1.replace("a", "A"));//Abcd3Aefg6
System.out.println(s1.replace("ae","**"));//abcd3**fg6
//按照正则表达式,替换一整个类型的字符,仍然返回的是一个新的字符串
System.out.println(s1.replaceAll("\\d", ""));//abcdaefg
//按照正则表达式,替换第一次出现的某类字符,,返回新的字符串
System.out.println(s1.replaceFirst("\\d", ""));//abcdaefg6
//去掉字符串两端的空格,返回新字符串
String s2 = " 1a2 s3d ";
System.out.println(s2.trim());//1a2 s3d
/*
如果想要替换掉中间的空格,可以使用replaceAll()或者 replace(),这样就可以换掉所有的空格
System.out.println(s2.replace(" ", ""));//1a2s3d
System.out.println(s2.replaceAll(" ", ""));//1a2s3d
*/
}
}
5.正则表达式
上面我们提到了正则表达式,那么什么是正则表达式,
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
在后面我们会说到正则表达式中有哪些符号,如何使用正则表达式制定简单的规则.
二.StringBuffer类
这是一个可变带缓冲区字符串,如果需要大量字符串拼接,建议使用此类.
1.构造方法
StringBuffer类必须使用构造方法来创建对象.
StringBuffer s = new StringBuffer("ABC");
2.方法
1.append()
在StringBuffer类型变量之后连接指定的字符串
2.insert()
在StringBuffer类型变量指定位置插入指定的字符串
public class SBufferDemo1 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("ABC");
//底层是一个3+16长度的char数组,并且没有被final修饰
s.append("defg");
System.out.println(s);//ABCdefg
/*
由上面两行代码我们看到,使用append方法连接两个字符串,并未创建新的StringBuffer对象
但是还有一种可能就是创建不下了,即就是超过了底层char数组原有长度(3+16)
这个时候会创建一个新的数组,赋给StringBuffer对象中的value[],这个过程中并没有创建新对象
也就是说变的是底层的数组,并不是StringBuffer变量s
在上面所说的过程中,创建了两个数组,但是只有一个StringBuffer对象
*/
s.insert(2, "123");//在第二个位置插入"123"
System.out.println(s);//AB123Cdefg
}
}
三.StringBuilder
StringBuilder类与StringBuffer类底层实现是一样的,都是一个char数组,并且都未被final修饰.之后利用这两个类对字符串进行增加或者删除操作,都是直接对底层的数组进行操作.
StringBuffer类是多线程安全的.方法都被synchronized关键字修饰.
StringBuilder类是**多线程不安全的.**单线程建议使用这个.