常用类--String类概述及其构造方法
String类概述及其构造方法
程序示例
/*
字符串:
简单理解:
就是由多个字符组成的数据,叫做字符串
也可以看作是一个字符数组。
观察API发现:
1、String代表的是字符串,属于java.lang下面的,所以使用的时候不需要导包
2、String类代表字符串。
Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例(对象)。
3、字符串不变; 它们的值在创建后不能被更改
字符串是常量,一旦被赋值,就不能改变
4、String是final修饰的类,是不可变的,所以是线程安全的。
构造方法:
public String()
public String(byte[] bytes)
public String(byte[] bytes,int offset,int length)
public String(char[] value)
public String(char[] value,int offset,int count)
public String(String original)
注意事项:
1、String类重写了toString()方法
*/
public class StringDemo {
public static void main(String[] args) {
//public String()
//初始化新创建的String对象,以使其表示空字符序列。
String s = new String();
//输出:s:而不是地址值,说明String类重写了toString()方法
System.out.println("s: " + s);
//查看字符串的长度
//public int length()返回此字符串的长度。
//输出:字符串s的长度为:0 ,因为我创建的是一个空的字符串
System.out.println("字符串s的长度为:" + s.length());
System.out.println("***************************************");
//public String(byte[] bytes) 将一个字节数组转成一个字符串
//该方法会将输入的字节数组中的每个元素,通过ASCII码表
//转换为对应的字符
byte[] b = {97,98,99,100,101};
String s2 = new String(b);
//输出:s2:abcde
System.out.println("s2: " + s2);
//查看字符串的长度
//public int length()返回此字符串的长度。
//输出:字符串s2的长度为:5
System.out.println("字符串s2的长度为:" + s2.length());
System.out.println("***************************************");
//public String(byte[] bytes,int index,int length)
//将字节数组中的一部分截取出来变成一个字符串
//将数组b传入,从下标1开始截取,截取3位
String s3 = new String(b, 1, 3);
System.out.println("s3: " + s3);//输出:bcd
//查看字符串的长度
//public int length()返回此字符串的长度。
System.out.println("字符串s3的长度为:" + s3.length());//输出:3
// //那么问题来了,我想截取十位或者我想从下标为10开始截取了,这样会发生什么呢?
// //StringIndexOutOfBoundsException--字符串索引越界异常
// String s4 = new String(b, 1, 5);
// System.out.println("s4: " + s4);
// //查看字符串的长度
// //public int length()返回此字符串的长度。
// System.out.println("字符串s4的长度为:" + s4.length());
System.out.println("***************************************");
//public String(char[] value) 将一个字符数组转成一个字符串
char[] c = {'a','b','c','d','我','爱','冯','提','莫'};
String s5 = new String(c);
System.out.println("s5: " + s5);//输出:abcde我爱冯提莫
//查看字符串的长度
//public int length()返回此字符串的长度。
System.out.println("字符串s5的长度为:" + s5.length());//输出:9
System.out.println("***************************************");
//public String(char[] value,int offset,int count)
//将字符数组中一部分截取出来变成一个字符串
//输入字符数组c,从下标为4开始截取,截取5个
String s6 = new String(c, 4, 5);
System.out.println("s6: " + s6);//输出:我爱冯提莫
//查看字符串的长度
//public int length()返回此字符串的长度。
System.out.println("字符串s6的长度为:" + s6.length());//输出:5
System.out.println("***************************************");
//public String(String original)
//我创建了一个字符串常量s7,我没有new它所以它不在堆里,在常量池中
String s7 = "你好";
//我现在将s7传入该构造方法并new了一下,就相当与在堆内存中多了一个空间来引用
//常量池中的“你好”,这样是没必要的。
String s8 = new String(s7);
System.out.println("s8: " + s8);//输出:你好
//查看字符串的长度
//public int length()返回此字符串的长度。
System.out.println("字符串s8的长度为:" + s8.length());//输出:2
}
}
public String(String original)原理图
String类的特点及面试题
/*
面试题:
字符串是常量,它的值在创建之后不能更改
String s = “hello”;
s += “world”;
问s的结果是多少?
*/
public class StringDemo2 {
public static void main(String[] args) {
String s = "hello";
s += "world";
System.out.println(s);//输出:helloworld
//那么问题来了,不是常量池中的常量是不可改变的吗?
//为什么结果输出的值为helloworld,而不是报错呢?
}
}
常量值的拼接图解
/*
面试题:
String s = new String(“hello”)和String s = “hello”;的区别?
字符串比较之看程序写结果
字符串拼接之看程序写结果
1、==比较引用数据类型的时候,比较的是地址值
2、String s1 = new String("hello");会在堆内存中创建对象
3、String类中重写了Object的equals方法
4、equals方法默认比较的是地址值,但是由于重写了,所以比较的是内容
*/
public class StringDemo3 {
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = "hello";
System.out.println(s1==s2); //false
System.out.println(s1.equals(s2)); //true
}
}
/*
1、字符串如果是变量相加,是先开辟空间,然后再拼接
2、字符串如果是常量相加,是先相加,然后去常量池中找,如果找到了,就返回
如果找不到就创建。
*/
public class StringDemo5 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = "hello"+"world";
System.out.println(s3==s4); //true
String s5 = s1+s2;
System.out.println(s3==s1+s2); //false
System.out.println(s3.equals(s1+s2)); //true
//System类中
//public static int identityHashCode(Object x)方法
//返回给定对象的地址值,空引用哈希码值为0
System.out.println(System.identityHashCode(s3));//1163157884
System.out.println(System.identityHashCode(s4));//1163157884
System.out.println(System.identityHashCode(s5));//1956725890
}
}