×

java中String类详解(java.lang.String)

前端技术网 前端技术网 发表于2024-01-04 05:49:19 浏览195 评论0

抢沙发发表评论

一、java String字符串问题

一,测试步骤

1写个测试类StringTest.java

java中String类详解(java.lang.String)

public class StringTest{

public static void main(String[] args){

String s= new String("a"+"b")+"c"+"d";

}

}

2javacStringTest.java编译生成class

java中String类详解(java.lang.String)

3javap-vStringTest.java>log

二,说明

打开生成的log文件,截取部分如下

Constant pool:

...

#4= Class#23// java/lang/String

#5= String#24// ab

#6= Methodref#4.#25// java/lang/String."<init>":(Ljava/lang/String;)V

#7= Methodref#2.#26// java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

#8= String#27// c

#9= String#28// d

...

#24= Utf8 ab

#25= NameAndType#13:#32//"<init>":(Ljava/lang/String;)V

#26= NameAndType#33:#34// append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

#27= Utf8 c

#28= Utf8 d

...

上面是捆绑在这个类的常量池的列表

常量池中出现了#24,#27,#28三个字符串常量,分别是ab, c和d

再看一下`Strings`的初始化过程

0: new#2// class java/lang/StringBuilder

3: dup

4: invokespecial#3// Method java/lang/StringBuilder."<init>":()V

7: new#4// class java/lang/String

10: dup

11: ldc#5// String ab

13: invokespecial#6// Method java/lang/String."<init>":(Ljava/lang/String;)V

16: invokevirtual#7// Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

19: ldc#8// String c

21: invokevirtual#7// Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

24: ldc#9// String d

26: invokevirtual#7// Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

29: invokevirtual#10// Method java/lang/StringBuilder.toString:()Ljava/lang/String;

32: astore_1

33: return

如上所示,先初始化了StringBuilder,是java内部默认拼接String的类。

Strings的初始化是在Line7,在Line11将#5压栈,#5是常量#24即“ab”的引用。

接着,Line13使用“ab”初始化了String对象,Line16把这个对象append到StringBuilder

下面依次将"c"和"d"的引用压栈,并append到StringBuilder。

真正的Strings的赋值是在Line29调用StringBuilder.toString(),将拼接后的字符串返回。

综上,

生成了3个常量对象,ab,c和d,存放在常量池中(一般虚拟机的常量池都在方法区中)。

生成了2个对象,ab的包装对象,StringBuilder返回的拼接后对象,对象都存在堆中。

注:以上是在oracle的hotspot1.7虚拟机下执行结果,其他版本虚拟机可能会有不同。

二、java.lang.String的常用的方法

public boolean equals(Object obj)

判断当前字符串与obj的内容是否相同

public boolean equalsIgnoreCase(String str)

判断当前字符串与str的内容是否相同,这个方法不会区分大小写字母的区别

public int length()

返回字符串的长度,即字符的总个数

public String trim()

去掉字符串两端的空白,包括“空格,\t,\n,\r等控制符”

public String substring(int start,int end)

根据开始和结束的位置,返回当前String的子字符串

public String substring(int start)

从开始位置开始到字符串结束,返回子字符串

public char charAt(int index)

返回指定位置的字符

public int indexOf(String str)

返回子字符串在当前字符串的位置,如果当前字符串不包含子字符串就返回-1

public String concat(String str)

返回一个字符串,内容是当前字符串与str连接而成的。

字符串连接可以简化写为String str= str1+ str2;结果与concat方法相同

public boolean startsWith(String str)

判断当前字符串,是否以str开头

public boolean endsWith(String str)

判断当前字符串,是否以str结尾

========================================================

String str= I am+ Lingo!;

这样可以获得一个内容为I am Lingo!的字符串,在java里可以通过这种简单的方式实现字符串的连接

。这里需要注意的是,这个过程实际上生成了三个String对象,I am和Lingo!先被生成,然后用他

们再创建一个String对象str,str的内容是两者的总和。所以,使用+进行字符串连接的时候会很耗费资

源,这个时候就需要使用另一个类StringBuffer,它的内容是可以修改的,实际上jvm内部编译之后,“

用+进行字符串连接”也是用StringBuffer实现的。

String str= I am+ Lingo!;

String str= new StringBuffer(I am).append(Lingo!).toString();

上边两个是等价的。

StringBuffer类还提供了许多便利的方法,对字符串进行操作

public void reverse()

反转字符串

public void append(...)

在字符串最后添加信息

public void insert(int start,...)

在索引位置插入信息

public void delete(int start,int end)

删除指定范围的内容

split与replaceAll方法

public String[] split(String regex)

根据分隔符,把字符串切割成字符串数组

public String replace(String regex,String str)

把字符串中所有与regex匹配的部分都替换成str

regex代表“正则表达式”,如果你并不清楚它的原理,很可能会出现问题。

1,3,4.split(,)返回的结果是{1,3,4}这三个字符串组成的数组

1|3|4.split(|)返回的结果却是{1,|,3,|,4}五个字符串组成的数组

这个问题的原因是由于在“正则表达式”中,“|”是一个有特殊含义的字符,表示“或”,直接使用

split(|)就会把每个字符分开了。如果希望使用|作为分隔符,就需要使用转义字符。

1|3|4.split(\\|)返回的结果就是{1,3,4}三个字符串组成的数组了

“\|”是正则表达式中代表|的专一字符,但因为在String中“\”不能单独出现,还需要进行一次转义

,就变成了“\\|”这种形式。

replaceAll(String regex,String str)也是这种情况

三、java 不可比较的类型: boolean 和 java.lang.String.

/**

*这是一个可运行例子:有问题留言 lxq

*

*说明:

*

*问题关键点:

* 1.知道java的两种比较方法:值比较,地址比较.

*

*==一般用户比较数字int,double,boolean,字符串的比较都是比较字符是否相等

*

*所以一般都是 String中的方法 equals();

*

* 2.在程序中同时的符号是&&--翻译成并且的意思.

*

*如果有 3命题 a,b,c

*

*如果3个命题都正确才是正确的话,那么我们表示为

*

* a&& b&& c

*

*当然a,b,c可以是一个复杂的表达式.

*

*/

import java.util.Scanner;

import javax.swing.JOptionPane;

public class Today1{

public static void main(String[] args){

String[][] marks= new String[3][3];

marks[0][0]="X";

marks[1][1]="X";

marks[2][2]="X";

/*if(marks[0][0]== marks[1][1]== marks[2][2]) System.out.println(true);

else System.out.println(false);*/

//---------------修改为:

// marks[0][0].equals(marks[1][1])相当于命题a

// marks[0][0].equals(marks[2][2])相当于命题b

//marks[2][2].equals(marks[1][1])相当于命题c

if( marks[0][0].equals(marks[1][1])&& marks[0][0].equals(marks[2][2])&& marks[2][2].equals(marks[1][1])){

System.out.println(true);

}else{

System.out.println(false);

}

}

}

好了,文章到此结束,希望可以帮助到大家。