String类时lang包的内置类,使用时不需要引用。
一、构造器
String():通过new方法创建字符串
String(byte[] byte):把字节数字转换为字符串
异同比较:
String str="abc";
String str1=new String("abc");
str 与str1有什么异同。
首先,str==str1,是否成立。不成立。
其次,str.equals(str1),是否成立。成立。
为什么?
因为String类的equals()方法比较的是值是否相等,很明显,str与str1的值相等。
为什么str==str1不成立呢。因为String str="abc" 与 String str1=new String("abc")两种创建String类对象的底层方法是不同的。先说String str="abc" 这种创建String类对象的方法。此种方法创建对象,首先在常量池中搜索是否有“abc”字符串,如果有,则把该字符串的地址返回给栈。如果没有则创建一个"abc"字符串,然后把地址返回给栈引用。
而new String()方法,首先在堆中创建一个对象,然后再去搜索常量池中是否有“abc”字符串,如果有,则把该字符串的地址返回给堆中的对象。如果没有则创建一个"abc"字符串,然后把地址返回给堆中的对象。此时栈保存的堆中对象的地址。
很明显,new String()方法创建的对象地址是堆中的地址,而另一种方法对象的地址是常量池中地址。很明显,两个地址是不同的。
另外,String str="abc"创建一个对象,而String str1=new String("abc")有可能创建了两个对象(在堆中创建了一个对象,如果常量池中没有“abc”字符串,还需要在常量池中创建一个对象)。
二、常用方法
int length():活动字符串的长度,注意与获得数组长度的区别,获得数组长度不需要括号
char charAt(int index):获得指定索引的字符
int codePointAt(int index):获得指定索引的字符的ASCII码
int compareTo(String anotherstring):与另外一个字符串比较,如果<0,说明在被比较字符串之前;=0,则相等;>0,说明在被比较字符串之后。
int compareToIgnoreCase(String anotherstring):比较时不区分大小写
boolean startsWith():是否以某个子字符串开始
boolean endtsWith():是否以某个子字符串介绍
s.trim():去掉s字符串前后的空格,并返回一个新字符串
boolean s.equals():比较两个字符串的值是否相等;
int indexOf(int ch):返回指定字符的第一个索引。需要注意的是,可以用字符,也可以同字符的ASCII码
eg.
String str="hello world";
int int1=str.indexOf("h");
//int int2=str.indexOf(0);这两种写法是等价的
int indexOf(int ch,int fromindex):从某个索引开始检索,然后返回指定字符的索引。注意包含fromindex索引。
int indexOf(String str):返回指定子字符串的第一个索引。
int indexOf(String str,int fromindex):从某个索引开始检索,然后返回指定子字符串的索引。
String substring(int beginindex,int endindex):返回从beginindex(含)到endindex(不含)的子字符串。
String replace(char oldchar ,char newchar):把字符串中的所有oldchar换成newchar并返回一个新字符串
String replace(charsequnce target,charsequence replacement):将字符串中的所有target换成replacement并返回一个新字符串
static String valueOf(boolean a):将一个布尔值转化为字符串形式,静态方法。由于是静态方法,使用该方法是需要类调用。如:String .valueOf(b)
static String valueOf(char a):返回字符a的字符串形式