String类的两种实例化方法
A:直接赋值
public class StringDemo01{
public static void main(String args[]){
String name = "liuxun" ; // 实例化String对象
System.out.println("姓名:" + name) ;
}
};
B:通过关键字new
public class StringDemo02{
public static void main(String args[]){
String name = new String("liuxun") ; // 实例化String对象
System.out.println("姓名:" + name) ;
}
};
String类的内容比较
以往基本数据类型才用 == 进行比较。如果直接比较字符串呢? 如下所示:
public class StringDemo04{
public static void main(String args[]){
String str1 = "hello" ; // 直接赋值
String str2 = new String("hello") ; // 通过new赋值
String str3 = str2 ; // 传递引用
System.out.println("str1 == str2 --> " + (str1==str2)) ; // false
System.out.println("str1 == str3 --> " + (str1==str3)) ; // false
System.out.println("str2 == str3 --> " + (str2==str3)) ; // true
}
};
内存分析如下:
现在使用的判断相等,是判断地址空间是否相等,判断的是地址值。如果要想判断其内容是否相等,则必须使用String类中提供的equals()方法完成,该方法的使用如下:
public class StringDemo05{
public static void main(String args[]){
String str1 = "hello" ; // 直接赋值
String str2 = new String("hello") ; // 通过new赋值
String str3 = str2 ; // 传递引用
System.out.println("str1 equals str2 --> " + (str1.equals(str2))) ; // true
System.out.println("str1 equals str3 --> " + (str1.equals(str3))) ; // true
System.out.println("str2 equals str3 --> " + (str2.equals(str3))) ; // true
}
};
结论:String有两种比较方式。
一种是使用 == 完成,比较的是地址值
另一种使用equals 方法完成,比较的具体内容,开发中比较常用。
String类两种实例化方式的区别
public class StringDemo07{
public static void main(String args[]){
String str1 = "hello" ; // 直接赋值
String str2 = "hello" ; // 直接赋值
String str3 = "hello3" ; // 直接赋值
System.out.println("str1 == str2 --> " + (str1==str2)+" "+str1) ; // true
System.out.println("str1 == str3 --> " + (str1==str3)+" "+str2) ; // true
System.out.println("str2 == str3 --> " + (str2==str3)+" "+str3) ; // true
}
};
会发现使用直接赋值的方式声明字符串时,如果该字符串的内容和别的字符串的内容相同时,则直接把具有内容相同的字符串的指向给赋值过来。如果没有发现与新声明字符串内容相同的字符串,才会开辟新的堆内存。
而使用 new String()的方式创建字符串的话,就会先开辟一个字符串的堆空间存放字符串的内容,然后通过new 再开辟一个堆空间,将第一个堆空间里的内容给复制一份拷过来,将new出来的堆空间地址赋给一个栈内存,而第一个堆空间等待GC的回收。
一般只要不是特殊情况,则使用第一种直接赋值的方式即可。
字符串的内容不可改变
这是字符串的一个重要特征。
public class StringDemo09{
public static void main(String args[]){
String str = "hello" ; // 声明字符串
str = str + " world!!!" ; // 修改字符串
System.out.println("str = " + str) ;
}
};
实际上字符串内容的改变,改变的是内存地址的引用关系。 所以在开发中避免如下操作
public class StringDemo10{
public static void main(String args[]){
String str1 = "liuxun" ; // 声明字符串对象
for(int i=0;i<100;i++){ // 循环修改内容
str1 += i ; // 字符串的引用不断改变
}
System.out.println(str1) ;
}
};
这样的操作,要断开连接100次才可以完成。这样的操作性能很低,应该避免使用,而如果非要使用这种操作,JAVA专门提供了StringBuffer类 专门完成这样的功能。
String类的常用方法
最主要方法是查询文档
Split()和replaceAll()方法是需要正则匹配的。
1字符数组与字符串
一个字符串可以变为一个字符数组,同样,也可以把一个字符数组,变为一个字符串。在String类中提供了如下操作方法。
将字符串变为字符数组: public char toCharArray()
将字符数组变为字符串: public String(char[] value)
public String(char[] value,int offset, int count)
public class StringAPIDemo01{
public static void main(String args[]){
String str1 = "hello" ; // 定义字符串
char c[] = str1.toCharArray() ; // 将一个字符串变为字符数组
for(int i=0;i<c.length;i++){ // 循环输出
System.out.print(c[i] + "、") ;
}
System.out.println("") ; // 换行
String str2 = new String(c) ; // 将全部的字符数组变为String
String str3 = new String(c,0,3) ; // 将部分字符数组变为String
System.out.println(str2) ; // 输出字符串
System.out.println(str3) ; // 输出字符串
}
};
2从字符串中取出指定位置的字符
如果想使用此操作,则肯定返回一个char类型 public char charAt(int index)
public class StringAPIDemo02{
public static void main(String args[]){
String str1 = "hello" ; // 定义String对象
System.out.println(str1.charAt(3)) ; // 取出字符串中第四个字符
}
};
3字符串与byte数组的转换
byte数组(字节数组),在一般的IO操作中会经常使用到。
在String类中提供了以下的方法可以进行字符串与字节数组之间的转换。
字符串变为字节数组:public byte[] getBytes()
将一个字节数组变为字符串:
将全部字节数组变为String: public String(byte[] bytes)
将部分字节数组变为String: public String(byte[] bytes, int offset, int length)
public class StringAPIDemo03{
public static void main(String args[]){
String str1 = "hello" ; // 定义字符串
byte b[] = str1.getBytes() ; // 将字符串变为byte数组
System.out.println(new String(b)) ; // 将全部的byte数组变为字符串
System.out.println(new String(b,1,3)) ; // 将部分的byte数组变为字符串
}
};
4取得一个字符串的长度
要想取得字符串的长度: public int length()
切记:数组的长度为length不带括号。而String是个类 ,length是个方法必须要有括号。
public class StringAPIDemo04{
public static void main(String args[]){
String str1 = "hello liuxun" ; // 定义字符串变量
System.out.println("\""+str1+"\"的长度为:"+str1.length()) ;
}
};
5查找指定的字符串是否存在
在实际的操作中,经常会使用到判断一个字符串中是否存在某些内容,此时就可以使用以下的方法。
从头开始查找:public int indexOf(String str)
从指定的位置开始查找:public int indexOf(String str, int fromIndex)
查找的时候方法的返回值是一个int类型的数据,此数据表示的是一个字符串的具体位置,如果没有查找到此字符串则返回 -1.
public class StringAPIDemo05{
public static void main(String args[]){
String str1 = "abcdefgcgh" ; // 声明字符串
System.out.println(str1.indexOf("c")) ; // 查到返回位置
System.out.println(str1.indexOf("c",3)) ; // 查到返回位置,从第4个位置开始查找
System.out.println(str1.indexOf("x")) ; // 没有查到返回-1
}
};
6、去掉空格
如果假设是由用户输入的话,则就可能出现多余的空格,在这种操作中就可以使用trim()方法去掉字符串左右的空格,但是字符串中间的空格是不可能去掉的。
public class StringAPIDemo06{
public static void main(String args[]){
String str1 = " hello " ; // 定义字符串
System.out.println(str1.trim()) ; // 去掉左右空格后输出
}
};
7 字符串的截取
从一个指定的字符串中取出里面的部分内容,使用的方法。
从指定的位置一直截取到结束位置:public String subString(int beginIndex)
截取指定范围的字符串:public String subString(int beginIndex, int endIndex)
public class StringAPIDemo07{
public static void main(String args[]){
String str1 = "hello world" ; // 定义字符串
System.out.println(str1.substring(6)) ; // 从第7个位置开始截取
System.out.println(str1.substring(0,5)) ; // 截取0~5个位置的内容
}
};
8 拆分字符串
如果现在需要按指定的字符串去拆分一个字符串的话,则使用:public String[] split(String regex) 返回的是截取后的字符串数组。
public class StringAPIDemo08{
public static void main(String args[]){
String str1 = "hello world" ; // 定义字符串
String s[] = str1.split(" ") ; // 按空格进行字符串的拆分
for(int i=0;i<s.length;i++){ // 循环输出
System.out.println(s[i]) ;
}
}
};
9 大小写转换
此功能在一般的开发语言中都会存在,将一个大写的字符串中的全部字母全部转为小写或者将一个字符串中的全部小写字母转为大写。
小写变大写:public String toUpperCase()
大写变小写:public String toLowerCase()
public class StringAPIDemo09{
public static void main(String args[]){
System.out.println("将\"hello world\"转成大写:" + "hello world".toUpperCase()) ;
System.out.println("将\"HELLO WORLD\"转成小写:" + "HELLO WORLD".toLowerCase()) ;
}
};
10 判断是否以指定的字符串开头或结尾
在String中可以使用以下的两个方法完成:
判断是否以指定的字符串开头:public boolean startsWith(String prefix)
判断是否以指定的字符串结尾:public boolean endsWith(String suffix)
public class StringAPIDemo10{
public static void main(String args[]){
String str1 = "**HELLO" ; // 定义字符串
String str2 = "HELLO**" ; // 定义字符串
if(str1.startsWith("**")){ // 判断是否以“**”开头
System.out.println("(**HELLO)以**开头") ;
}
if(str2.endsWith("**")){ // 判断是否以“**”结尾
System.out.println("(HELLO**)以**结尾") ;
}
}
};
11 不区分大小写的比较
在String类中equals()方法是可以用来进行字符串的比较的,但是此种比较方法只能针对于大小写完全一样的字符串进行比较,如果现在要是想进行不区分大小写的比较,则可以使用以下方法:
public boolean equalsIgnoreCase(String anotherString)
public class StringAPIDemo11{
public static void main(String args[]){
String str1 = "HELLO" ; // 定义字符串
String str2 = "hello" ; // 定义字符串
System.out.println("\"HELLO\" equals \"hello\" " + str1.equals(str2)) ;
System.out.println("\"HELLO\" equalsIgnoreCase \"hello\" "
+ str1.equalsIgnoreCase(str2)) ; // 不区分大小写的比较
}
};
12 字符串的替换功能
在String类中提供了以下的方法用于字符串的替换操作。
public String replaceAll(String regex, String replacement)
public class StringAPIDemo12{
public static void main(String args[]){
String str = "hello" ; // 定义字符串
String newStr = str.replaceAll("l","x") ; // 现在将所有的l替换成x
System.out.println("替换之后的结果:" + newStr) ;
}
};