String构造方法:
public String():创建一个空白字符串对象,不含任何内容
public String(char[] chs):根据字符数组的内容,来创建字符串对象
public String(byte[] bys):根据字节组内容,来创建字符串对象
(通过以上三种方式:使用new创建字符串对象,每次都会申请一个内存空间,虽然内容相同,但是地址不同)
String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc
(以“”方式给出的字符串,只要字符串序列相同(顺序和大小写),无论在程序中出现几次,JVM都只会创建一个String对象,并在常量池中维护)
虽然介绍了四种String对象的构造方法,但是推荐使用最后一种,其他的只做了解。
public class Stringbuild {
public static void main(String[] args) {
// TODO Auto-generated method stub
// public String():创建一个空白字符串对象,不含任何内容
String s1=new String();
System.out.println("s1:"+s1);
//public String(char[] chs):根据字符数组的内容,来创建字符串对象
char[] chs= {'a','b','c'};
String s2=new String(chs);
System.out.println("s2:"+s2);
//public String(byte[] bys):根据字节组内容,来创建字符串对象
byte[] bys= {97, 98, 99}; //byte类型取值范围是-128~127
String s3 =new String(bys);
System.out.println("s3:"+s3);
// String s = "abc"; 直接赋值的方式创建字符串对象,内容就是abc
String s4="abc";
System.out.println("s4:"+s4); //推荐使用这个方法
}
}
上述代码请试着自己敲一遍,第三个输出的结果是什么呢?
使用“==”作比较:
基本类型:比较的是数据值是否相同
引用类型:比较的是地址值是否相同
字符串是对象,他比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals();
public boolean equals(Object anObject):将此字符串与指定对象进行比较。由于我们比较的的是字符串对象
所以参数直接传递一个字符串。
public class StringCompare {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] chs= {'a','b','c'};
String s1=new String(chs);
String s2=new String(chs);
//比较字符串地址是否相同
System.out.println(s1==s2);//之前有说字符串的效果上相当于char[],所以名字即是地址
//比较字符串的内容是否相同
System.out.println(s1.equals(s2));
String s3="abc";
String s4="abc";
System.out.println(s3==s4);
System.out.println(s3.equals(s4));
}
}
结果:
false
true
true
true
使用new创建字符串对象,每次都会申请一个内存空间,虽然内容相同,但是地址不同
以""方式给出的字符串,只要字符串序列相同(顺序和大小写),无论在程序中出现几次,JVM都只会创建一个String对象,
并在字符串池中维护
StringBuilder
上面说到String类创建对象时候会在常量池(堆内存)中存放
如下:
String s1="hello";
String s+="world";
System.out.println(s);
这样创建对象的时候会在常量池中建立三个String对象,但是我们只使用"hello world"这一个对象,如此便造成了空间的浪费。
为了避免这种浪费,java提供了StringBuilder类:
StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变是指StringBuilder对象中的内容是可变的。
String和StringBuilder的区别
String的内容是不可变的,StringBuilder的内容是可变的。
StringBuilder构造方法:
public StringBuilder():构造一个空白可变字符串对象,不含任何内容
public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象
public class StringBuildDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder str1=new StringBuilder();
System.out.println("str1:"+str1);
System.out.println(str1.length());
StringBuilder str2=new StringBuilder("hello");
System.out.println("str2:"+str2);
System.out.println(str2.length());
}
}
StringBuilder的添加和反转方法:
public StringBuilder append(任意类型),添加数据,并返回本身
public StringBuilder reverse():返回相反的字符序列
这里有一段有趣的code
//链式编程
s.append("hello").append("world").append("!");
String和StringBuilder的相互转化
为什么要转化呢?
上面提到StringBuilder中的append和reverse函数,这两个函数在String类里面是没办法使用的,所以我们要把String类转化成StringBuilder类后使用这两个函数,然后再转化回去。
1、StringBuilder转换为String
public String toString():通过toString()函数就可以实现把StringBuilder转换为String
2、String转换为StringBuilder
public StringBuilder(String s):通过构造方法可以实现把String转换为StringBuilder
StringBuilder s=new StringBuilder();
s.append("hello");
String s2=s.toString();
StringBuilder s3=new StringBuilder(s2);