认识String类

// 方式一
String str = "Hello Bit";
// 方式二
String str2 = new String("Hello Bit");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 = new String(array)

String 使用 == 比较并不是在比较字符串内容, 而是比较两个引用是否是指向同一个对象.
1)String类被final关键字修饰,意味着String类不能被继承,并且它的成员方法都默认为final方法;字符串一旦创建就不能再修改。
2)String类实现了Serializable、CharSequence、 Comparable接口。
3)String实例的值是通过字符数组实现字符串存储的。

字符串常量池

将一个字符串添加到字符串常量池中有两种方式:一是直接定义一个类似于"abc"形式的字符串字面量,编译器在编译期就会在class字节码中创建静态常量池,并将这些常量放进去。在虚拟机加载该字节码的时候,如果运行时字符串常量池(动态常量池)中不存在该字符串,就在堆中创建该字符串对象,并将该对象的引用放到池中(JDK1.6及以前是直接在池中创建对象),如果已存在于池中,则直接返回该对象的引用。二是通过调用对象本身的intern()函数,JDK1.7中该操作将对象引用放到常量池中并返回该引用,JDK1.6及以前则是在常量池中创建新的对象,并返回新对象的引用。

a) 直接赋值
String str = new String("Hello");
// 方式一
System.out.println(str.equals("Hello"));
// 方式二
System.out.println("Hello".equals(str));
String str = null;
// 方式一
System.out.println(str.equals("Hello"));  // 执行结果 抛出 java.lang.NullPointerException 异// 方式二
System.out.println("Hello".equals(str));  // 执行结果 false
String str1 = "hello" ;
String str2 = "hello" ;
String str3 = "hello" ;
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // true
System.out.println(str2 == str3);

面试题:请解释String类中两种对象实例化的区别

  1. 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
  2. 构造方法:会开辟两块堆内存空间,不会自动保存在对象池中,可以使用intern()方法手工入池。
  3. 字符串不可变

  4. 字符串是一种不可变对象. 它的内容不可改变.
    String 类的内部实现也是基于 char[] 来实现的, 但是 String 类并没有提供 set 方法之类的来修改内部的字符数组.
    感受下形如这样的代码:
    形如 += 这样的操作, 表面上好像是修改了字符串, 其实不是. 内存变化如下:
String str = "hello" ;
str = str + " world" ;
str += "!!!" ;
System.out.println(str);
// 执行结果
hello world!!!
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页