Java特殊类之String类详解

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

猜你喜欢

转载自blog.csdn.net/Racheil/article/details/88419438