Java中的字符串

在Java中,字符串被作为String类型的对象处理,String类位于java.lang包中,默认情况下,该包被自动到入所有的程序

创建String对象的方法

String str1 = "hello world"; //创建一个字符串对象hello world,名为str1
String str2 = new String();  //创建一个空字符串对象,名为str2
String str3 = new String("hello world");  //创建一个字符串对象hello world,名为str3

字符串的不变性

String对象创建后则不能被修改,是不可变的,所谓的修改其实就是创建了新的对象,所指向的内存空间不同,先来运行一段代码:

String str1 = "hello world";
String str2 = "hello world";
String str3 = new String("hello world");
String str4 = new String("hello world");

System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str3 == str4);
str1 = "xiaoming:" + str1;
System.out.println(str1);

//打印输出如下:
true
false
false
xiaoming hello world

通过String str1 = “hello world”;声明了一个字符串对象,str1存放到了字符串对象的引用,在内存中的存放引用关系如下:

这里写图片描述

然后str1 = “xiaoming” + str1;改变了字符串str1,其实是创建了新的字符串对象,变量str1指向了新创建的字符串对象,如下:

这里写图片描述

一旦字符串在内存中创建,则这个字符串不改变,如果需要一个可变的字符串,可以使用StringBuffer或者StringBuilder

每次new一个字符串都会产生一个新的对象,几遍两个字符串的内容相同,使用”==”比较时也为”false”,如果只需要比较内容是否相同,应使用”equals()”方法.

String类的常用方法

String类提供了许多用来处理字符串的方法,可以获取字符串的长度,截取字符串,大小写转换,字符串分割…

//定义一个字符串
String str = "hello world";
//打印字符串长度
System.out.println(str.length());
//查找'w'的位置
char c = 'w';
System.out.println("字符 w 的位置:" + str.indexOf(c));
//查找子串 world的位置,如果找不到返回-1
System.out.println("子字符串 world 的位置:" + str.indexOf("world"));
//按空格把字符串分成一个数组,然后输出数组元素
String[] array = str.split(" ");
System.out.println("按空格分成数组:" + Arrays.toString(array));
System.out.println("获取索引[3,7)之间的子串:" + str.substring(3, 7));
//将字符串转换为byte[],并输出打印
byte[] b = str.getBytes();
System.out.println("转换为字节数组: ");
for (int i = 0;i < b.length; i ++) {
    System.out.println(b[i] + " ");
}
//打印输出如下:
11
字符 w 的位置:6
子字符串 world 的位置:6
按空格分成数组:[hello, world]
获取索引[3,7)之间的子串:lo w
104 
101 
108 
108 
111 
32 
119 
111 
114 
108 
100 

更多方法

int length()                                //返回当前字符串的长度
int indexOf(int ch)                         //查找ch在该字符串中第一次出现的位置    
int indexOf(String str)                     //查找str子字符串在该字符串中第一次出现的位置
int lastIndexOf(int ch)                     //查找ch子字符在该字符串中最后一次出现的次数
int lastIndexOf(String str)                 //查找str子字符串在该字符串中最后一次出现的位置
String substring(int beginIndex)            //获取从beginIndex位置开始到结束的子字符串
String substring(int beginIndex, int endIndex)//获取从beginIndex到endinIndex的子字符串
String trim()                               //返回去除了前后空格的字符串
booleam equals(Object obj)                  //返回该字符串与指定对象相比,返回true或者false
String toLowerCase()                        //将字符串转换为小写
String toUpperCase()                        //将字符串转换为大写
char charAt(int index)                      //获取字符串中指定位置的字符
String split(String regex,int limit)        //将字符串分割为子字符串,返回字符串数组
byte getBytes()                             //将该字符串转换Wiebyte数组

提示:

字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1

使用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引;如果没有匹配结果,返回 -1

使用 substring(beginIndex , endIndex) 进行字符串截取时,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符

“==” 和 equals() 的区别

==: 判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象

equals(): 比较存储在两个字符串对象中的内容是否一致

PS:字节是计算机存储信息的基本单位,1 个字节等于 8 位, gbk 编码中 1 个汉字字符存储需要 2 个字节,1 个英文字符存储需要 1 个字节。所以我们看到上面的程序运行结果中,每个汉字对应两个字节值,如“学”对应 “-47 -89” ,而英文字母 “J” 对应 “74” 。同时,汉字对应的字节值为负数,原因在于每个字节是 8 位,最大值不能超过 127,而汉字转换为字节后超过 127,如果超过就会溢出,以负数的形式显示。

Java中的StringBuilder

String类具有不可变性,但是当频繁操作字符串时,就会额外产生很多临时变量。使用 StringBuilder 或 StringBuffer 就可以避免这个问题。至于 StringBuilder 和StringBuffer ,它们基本相似,不同之处,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此一般情况下,如果需要创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。

定义StringBuilider对象

StringBuilder str1 = new StringBuilder();  //创建一个空的StringBuilder对象
StringBuilder str2 = new StringBuilder("hello world");  //创建一个字符串"hello world"

StringBuilder类的常用方法

//创建StringBuilder对象,存储字符串
StringBuilder str = new StringBuilder("hello");
//追加字符串
str.append("world");
str.append(520);
System.out.println("字符串长度: " + str.length());
System.out.println("插入前: " + str);  
//在指定位置插入内容
str.insert(11, "!");
//转换为String对象
String str2 = str.toString();
System.out.println("插入后: " + str2);

//输出打印如下:
字符串长度: 13
插入前: helloworld520
插入后: helloworld5!20