目录
一、String类
1.1 String类概述
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!
1.2 String类的特点
- String是一个final类,代表不可变的字符序列。
- 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
- String对象的字符内容是存储在一个字符数组value[]中的。
1.3 String类的构造方法
常用的构造方法
构造方法
public class StringTest02 {
public static void main(String[] args) {
String s1 = "abc"; //引用abc字符串地址
System.out.println(s1);//abc
String s2 = new String();//创建一个空字符串
System.out.println(s2);//
String s3 = new String("xyz");//引用堆中的xyz字符串地址
System.out.println(s3);//xyz
byte[] bytes1 = {97,98,99,100,101};//byte的取值范围:-128 到 127
String s4 = new String(bytes1);//把字节整数数组按照ASCII码表解析成字符串
System.out.println(s4);//abcde
byte[] bytes2 = {97,98,99,100,101,102};
//bytes - 要解码为字符的 byte,offset - 要解码的第-个 byte 的索引,length -要解码的 byte数
String s5 = new String(bytes2,2,2);//对bytes2数组从索引2开始解析2个长度
System.out.println(s5);//cd
char[] char1={'a','b','c','d','e'};
String s6 = new String(char1);
System.out.println(s6);//abcde
char[] char2={'a','b','c','d','e'};
String s7 = new String(char2);
System.out.println(s7);//abcde
}
}
方法
public class StringTest03 {
public static void main(String[] args) {
//方法调用三步 1.调用方法 对象.方法名(); 2.传入参数 3.接受方法的返回值
String s1 = "abcdef";
char c1 = s1.charAt(2);//获取字符串中指定索引位置的字符
System.out.println(c1);//c
String s2 = s1.concat("xzy");//将指定字符串连接到此字符串的结尾
System.out.println(s2);//abcdefxzy
boolean b1 = s1.contains("x");//当此字符串包含指定的值时,返回 true。
boolean b2 = s2.contains("x");
System.out.println(b1);//false
System.out.println(b2);//true
String s3 = "zhangsan.txt";
boolean b3 = s3.endsWith(".txt");//判断此字符串是否以指定的后缀结束 一般用来做文件名的后缀的判断
System.out.println(b3);//true
byte[] bytes1 = s1.getBytes();//把字符串按照ASCII解析成byte数组 bytes1={97,98,99,100,101,102]
String s4 = "abcdefghijklmnopq";
int i1 = s4.indexOf('d');//返回指定字符在此字符串中第一次出现处的索引
System.out.println(i1);//3
int i2 = s4.indexOf("def");// 返回指定子字符串在此字符串中第一次出现处的索引
System.out.println(i2);//3
int i3 = s4.lastIndexOf("n");//返回指定子字符串在此字符串中最右边出现处的索引
System.out.println(i3);//13
String s5="bad weather fuck the weather";
String s6 = s5.replace( "fuck","***");// 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
System.out.println(s6) ;//bad weather *** the weather
String s7="app/code/java/day19";
String[] split = s7.split( "/");//根据给定正则表达式的匹配拆分此字符串
for (String s : split) {
System.out.println(s); //app
//code
//java
//day19
}
String s8="abcdefgh";//返回一个新字符串,它是此字符串的一个子字符串
String s9 = s8.substring(2,5);//从索引2开始截取不包括5
System.out.println(s9);//cde
String s10 = " 螺蛳粉 ";
String s11 = s10.trim();//返回字符串的副本,忽略前导空白和尾部空白
System.out.println(s11);//螺蛳粉
String s12 = "sccnaJNNCJLjsso";
String s13 = s12.toLowerCase();//使用默认语言环境的规则将此 String 中的所有字符都转换为小写
System.out.println(s13);//sccnajnncjljsso
String s14 = s12.toUpperCase();//使用默认语言环境的规则将此 String 中的所有字符都转换为大写
System.out.println(s14);//SCCNAJNNCJLJSSO
}
}
1.4创建字符串对象两种方式的区别
-
通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同。
-
直接赋值方式创建
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护。
2.5字符串的比较
2.5.1 ==号的作用
-
比较基本数据类型:比较的是具体的值
-
比较引用数据类型:比较的是对象地址值
2.5.2 equals方法的作用
方法介绍
public boolean equals(String s) 比较两个字符串内容是否相同、区分大小写
示例代码:
public static void main(String[] args) {
//构造方法的方式得到对象
char[] chs = {'a', 'b', 'c'};
String s1 = new String(chs);
String s2 = new String(chs);
//直接赋值的方式得到对象
String s3 = "abc";
String s4 = "abc";
//比较字符串对象地址是否相同
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s3 == s4);
System.out.println("--------");
//比较字符串内容是否相同
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s3.equals(s4));
}
运行如下:
二、StringBuffer类
- java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。
- 很多方法与String相同。
- 作为参数传递时,方法内部可以改变值。
- StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:
- StringBuffer():初始容量为16的字符串缓冲区
- StringBuffer(int size):构造指定容量的字符串缓冲区
- StringBuffer(String str):将内容初始化为指定字符串内容
常用方法
StringBuffer append (xxx) :提供了很多的 append() 方法,用于进行字符串拼接StringBuffer delete (int start,int end) :删除指定位置的内容StringBuffer replace (int start, int end, String str) :把 [start,end) 位置替换为 strStringBuffer insert (int offset, xxx) :在指定位置插入 xxxStringBuffer reverse () :把当前字符序列逆转public int indexOf (String str)public String substring (int start,int end)public int length ()public char charAt (int n )public void setCharAt (int n ,char ch)
三、StringBuilder类
- StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且 提供相关功能的方法也一样。
package com.hp.test1;
/**
* String类定义出来的字符串具有不变性 一般不做经常变化字符串的使用,
* StringBuffer 线程安全的可变字符串序列
* StringBuilder 是线程不安全的可变字符序列
*
* StringBuffer和 StringBuilder都是操作的字符串本身
*/
public class StringBuilderTest {
public static void main(String[] args) {
//如下代码会在内存中出现三个字符串,HeLLo、WorLd、HeLLoWorLd
// String类在做字符串值变化的时候,非常浪费内存
String s = "Hello";
s += "World";
System.out.println(s);
StringBuilder sb = new StringBuilder("Hello");
sb.append("world");//对字符串后面进行追加内容
System.out.println(sb);
sb.insert(4,"x");//在字符串指定索引位置插入一个新的字符串
System.out.println(sb);
StringBuilder sb2 = sb.reverse();//字符串的倒叙输出,反转
System.out.println(sb2);
StringBuilder sb4 = new StringBuilder("Helloyiyangqianxi");
StringBuilder sb3 = sb4.delete(0,5);//删除起始位置(含)到结尾位置(不含)之间的字符串
System.out.println(sb3);
sb4.setCharAt(7,'w');//将第 i 个代码单元设置为 c(可以理解为替换)
System.out.println(sb4);
}
}
运行结果如下:
自己可以动动小手把方法都试一下
面试题:
String、StringBuilder、StringBuffer的区别?
相同点:
- 都可以储存和操作字符串
- 都使用 final修饰,不能被继承
- 提供的 API相似
区别:
- String 是只读字符串,String 对象内容是不能被改变的
- StringBuffer 和 StringBuilder 的字符串对象可以对字符串内容进行修改,在修改后的内存地址不会发生改变
- StringBuilder 线程不安全; StringBuffer 线程安全
- 方法体内没有对字符串的并发操作,且存在大量字符串拼接操作,建议使用 StringBuilder,效率较高。