1. String类概述
1.1 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
1.2 任何的字符串常量都是String对象,String的常量一旦声明不可改变(String类被final修饰,不能被继承,它的成员方法也默认为final方法),如果改变对象内容,会生成新的对象,改变的是其引用的指向而已。
1.3 如果需要修改字符串的值,可以使用StringBuffer类和StringBuilder类
2. 创建字符串
创建String类对象有两种方法,分别为直接赋值和通过构造方法创建对象
2.1 直接赋值
String str = "hello word" ;
2.2 通过构造方法创建对象
String str = new String("hello word") ;
2.3 两种实例化方式的区别
分析直接赋值过程前,首先提出字符串常量池的概念:在JVM底层实际上会自动维护一个对象池(字符串对象池),如果现在采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存到这个对象池之中。如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用;如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用
接下来分析通过构造方法创建对象的过程:
String str = new String("hello word") ;
首先产生匿名对象“hello word”,会开辟一块堆内存空间,然后当我们使用new 关键字产生一个新的对象时,会再次开辟一块堆内存空间,str指向该字符串,之前的匿名对象就会变为垃圾。与此同时,String类提供intern()方法实现手工入池的操作,实现字符串共享。
String str1 = new String("hello").intern() ;
String str2 = "hello" ;
System.out.println(str1 == str2); // true
结论如下:
直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用
intern()方法手工入池。
因此,我们一般使用直接赋值的方式
3. String类常用方法
3.1 字符串比较
方法名称 | 方法描述 |
---|---|
boolean equals(Object anObject) | 将此字符串与指定的对象比较,考虑大小写 |
boolean equalsIgnoreCase(String anotherString) | 将此 String 与另一个 String 比较,不考虑大小写 |
int compareTo(Object o) | 比较两个字符串大小关系 |
3.1.1 equals方法与“==”的区别
”==”:如果是数值,比较的是大小是否相等,如果是字符串对象,比较的是对象的内存地址数值。
“equals()”:可以进行字符串内容的比较,该方法覆写了Object类中的equals方法
3.1.2 compareTo方法
String类中的compareTo方法按照ASCII码进行比较,返回一个整数,只要发现不相等的内容,算出差值直接返回,不会继续向后查找比较
System.out.println("A".compareTo("a")); // -32
System.out.println("a".compareTo("A")); // 32
System.out.println("A".compareTo("A")); // 0
System.out.println("AB".compareTo("AC")); // -1
3.2 字符串查找
方法名称 | 方法描述 |
---|---|
boolean contains(CharSequence s) | 当且仅当此字符串包含指定的 char 值序列时,返回 true |
int indexOf(int ch, int fromIndex) | 返回第一次出现指定字符处的索引,从指定的索引开始搜索 |
boolean startsWith(String prefix, int toffset) | 测试此字符串从指定索引开始的子字符串是否以指定前缀开始 |
boolean endsWith(String suffix) | 测试此字符串是否以指定的后缀结束 |
例子:
String str = "helloworld" ;
System.out.println(str.indexOf("l")); // 2
System.out.println(str.indexOf("l",5)); //8
3.3 字符串替换
方法名称 | 方法描述 |
---|---|
String replaceAll(String regex, String replacement) | 使用给定的值替换此字符串所有匹配的子字符串 |
String replaceFirst(String regex, String replacement) | 使用给定的 值替换此字符串匹配的第一个子字符串 |
例子:
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "*"));
System.out.println(str.replaceFirst("l", "*");
3.4 字符串拆分
方法名称 | 方法描述 |
---|---|
String[] split(String regex) | 根据给定正则表达式的匹配拆分此字符串 |
String[] split(String regex, int limit) | 根据匹配给定的正则表达式来拆分此字符串。 |
例子:
String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格全部拆分
String[] result = str.split(" ",2)//部分拆分
3.5 字符串截取
方法名称 | 方法描述 |
---|---|
String substring(int beginIndex) | 从指定位置截取到结尾 |
String substring(int beginIndex, int endIndex) ) | 截取部分内容 |
例子:
String str = "hello world;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5);//截取范围 [0,5)
3.6 其他操作方法
方法名称 | 方法描述 |
---|---|
String trim() | 去掉字符串左右空格,保留中间空格 |
String toUpperCase(Locale locale) | 字符串转大写 |
String toLowerCase(Locale locale) | 字符串转小写 |
boolean isEmpty() | 当且仅当 length() 为 0 时返回 true,不是判断null |
String concat(String str) | 将指定字符串连接到此字符串的结尾 |
例子:
String str = " hello word" ;
System.out.println(str.length());//数组长度使用数组名称.length属性
//而String中使用的是length()方法
注意:String类没有提供首字母大写的方法,需要自己实现
public static void main(String[] args) {
System.out.println(fistUpper("yuisama"));
System.out.println(fistUpper(""));
System.out.println(fistUpper("a"));
}
public static String fistUpper(String str) {
if (" ".equals(str)||str==null)
{
return str ;
}
if (str.length()>1) {
return str.substring(0, 1).toUpperCase()+str.substring(1) ;
}
return str.toUpperCase() ;
4. 字符与字符串
字符串是字符的集合
字符串就是一个字符数组,在String类里面支持有字符数组与字符串相互转换的操作方法
方法名称 | 方法描述 |
---|---|
String(char[] value) | 将字符数组中所有内容变为字符串 |
char charAt(int index) | 取得指定位置的字符,从0开始 |
char[] toCharArray() | 将字符串变为字符数组返回 |
例子:
String str = "helloworld";//
char[] data = str.toCharArray() ;// 将字符串变为字符数组
for (int i = 0; i < data.length; i++)
{data[i] -= 32 ;
System.out.print(data[i]+"、");
}// 字符数组转为字符串
System.out.println(new String(data)); // 将字符串数组全部转换字符串
System.out.println(new String(data,5,5)); // 部分转换
//输出结果:H、E、L、L、O、W、O、R、L、D、HELLOWORLD
5. 字节与字符串
字节常用于数据传输以及编码转换的处理之中,在String中提供字节数组与字符串相互转换方法
方法名称 | 方法描述 |
---|---|
String(byte[] bytes) | 将字节数组中所有内容变为字符串 |
byte[] getBytes(String charsetName) | 将字符串以字节数组的形式返回 |
例子:
String str = "helloworld";
byte[] data = str.getBytes() ;
for (int i = 0; i < data.length; i++) {
data[i] -= 32 ;
System.out.print(data[i]+"、");
}
System.out.println(new String(data));//将字节数组全部转换称字符串
//输出结果:72、69、76、76、79、87、79、82、76、68、HELLOWORLD