1.String 源码分析
//String类被final 修饰所以不能被继承
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
//private 修饰说明value只能在String类内部使用,而且又没有提供get方法,所以外部无法获取value数 组,就无法改变数组中元素的值
//final修饰说明value是常量,一旦创建,就不能被改变,value一旦被初始化成某个数组,将永远指向这个数组,不可能再指向其它的数组了
String类特点:
(1)一切都是对象,字符串事物 "" 也是对象,类是描述事物,String类,描述字符串对象的类, 所有的 "" 都是String类的对象
(2)字符串是一个常量,一旦创建,不能改变,其实就是说一旦这个字符串确定了,那么就会在内存区域中就生成了这个字符串。字符串本身不能改变,但str变量中记录的地址值是可以改变的。
* String:
* 字符串的类
* 本质: 就是一个字符数组(字符串成的串)
* 特点: String是一个不可改变的字符序列, 一旦被赋值, 就不能被更改!
* 注意: String s = "abc"; // 实际上是创建了一个对象.
2.String类创建方式和比较
* A: String类创建方式和比较
* a: 创建对象的数量比较
* String s3 = "abc";
* 在内存中只有一个对象。这个对象在字符串常量池中
* String s4 = new String("abc");
* 在内存中有两个对象。一个new的对象在堆中,一个字符串本身对象,在字符串常量池中
* b: 案例代码
public class StringDemo2 {
public static void main(String[] args) {
//字符串定义方式2个, 直接= 使用String类的构造方法
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1);
System.out.println(str2);
System.out.println(str1==str2);//引用数据类型,比较对象的地址 false
System.out.println(str1.equals(str2));//true
}
}
3.String 面试题
1、判断定义为String类型的s1和s2是否相等
* String s1 = "abc";
* String s2 = "abc";
* System.out.println(s1 == s2); // true 字符串常量池问题
* System.out.println(s1.equals(s2)); // true 比较的是字符序列
2、判断定义为String类型的s1和s2是否相等
* String s1 = new String("abc");
* String s2 = "abc";
* System.out.println(s1 == s2); // false s2指向的是常量池的地址值, s1指向的是堆内存的地址值.
* System.out.println(s1.equals(s2));
3、判断定义为String类型的s1和s2是否相等
* String s1 = "a" + "b" + "c";
* String s2 = "abc";
* System.out.println(s1 == s2); // true, 因为java有常量优化机制."a" + "b" + "c"是常量在拼接
* System.out.println(s1.equals(s2));
4、判断定义为String类型的s1和s2是否相等
* String s1 = "ab";
* String s2 = "abc";
* String s3 = s1 + "c";
* System.out.println(s3 == s2); //false s3记录的是堆内存中String对象的地址值
* System.out.println(s3.equals(s2));