1. String类的概述

java.lang.Object ==> java.lang.String

只要是java.lang包下面的类,都不用导包,直接就可以使用。

 

类代码定义

public final class String 
extends Object 
implements Serializable, Comparable<String>, CharSequence

 

 

String 类代表字符串。

Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 

package com.heima.string;

public class Demo1_String {

    /**
     * 字符串字面值“ABC”也可以看成是一个字符串对象。
     * 字符串是常量,一旦被赋值,就不能被改变。
     * 
     */
    public static void main(String[] args) {
        String str = "abc"; // "abc"可以看成一个字符串对象
        str = "def"; // 当把"def"赋值给str,原来的"abc"就变成了垃圾
        System.out.println(str);
        System.out.println(str.toString()); // String类重写了toString方法,返回的是该对象本身。
        
    }

}

 

字符串是常量;

它们的值在创建之后不能更改。

字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

 

2. String类的构造方法

  •  常见构造方法:
    • public String()   空构造
    • public String(byte[] bytes)  把字节数组转换成字符串
    • public String(byte[] bytes, int index, int length)  把字节数组的一部分转成字符串
    • public String(char[] value)   把字符数组转成字符串
    • public String(char[] value, int index, int count)  把字符数组的一部分转成字符串
    • public String(String original)   把字符串常量值转换成字符串
  • 案例演示:
    • package com.heima.string;
      
      public class Demo2_String {
      
          /**
          public String()   空构造 
                                       初始化一个新创建的 String 对象,使其表示一个空字符序列。
          public String(byte[] bytes)  把字节数组转换成字符串   
                                                通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
          public String(byte[] bytes, int index, int length)  把字节数组的一部分转成字符串
          public String(char[] value)   把字符数组转成字符串
          public String(char[] value, int index, int count)  把字符数组的一部分转成字符串
          public String(String original)   把字符串常量值转换成字符串
           */
          public static void main(String[] args) {
              String s1 = new String();
              System.out.println(s1);
              
              byte[] arr1 = {97,98,99};
              String s2 = new String(arr1);
              System.out.println(s2); // 输出abc
              // 使用项目默认码表中(包含ascii码表)97对应的是a
              
              byte[] arr2 = {97,98,99,100,101,102};
              String s3 = new String(arr2,2,3);
              System.out.println(s3);  //输出cde
              
              char[] arr3 = {'a','b','c','d','e'};
              String s4 = new String(arr3);
              System.out.println(s4);  // 输出 abcde
              
              String s5 = new String(arr3,2,3);
              System.out.println(s5);  // 输出cde
              
              String s6 = new String("heima");
              System.out.println(s6);  // 输出heima
      
          }
      
      }

       

 3. String类的常见面试题

 1.判断定义为String类型的s1和s2是否相等

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

 

输出结果:true,true。

结果分析:

  • ==号和equals方法的区别
    • ==是一个比较运算符号
      • 既可以比较基本数据类型 ==> 基本数据类型比较的是值
      • 也可以比较引用数据类型 ==> 引用数据类型比较的是地址值
    • equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,如果没有重写Object类中的equals方法,equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是对象中的属性
  • String类重写equals方法:
    • public boolean equals(Object anObject)
      • 将此字符串与指定的对象比较。
      • 当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
      • 覆盖:
        • 类 Object 中的 equals
      • 参数:
        • anObject - 与此 String 进行比较的对象。
      • 返回:
        • 如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false。
      • 另请参见:
        • compareTo(String), equalsIgnoreCase(String)
  • 注意:str类型是引用数据类型,所有继承Object类的对象都是引用数据类型。
  • 所以,s1.equals(s2),只要s1和s2的字符序列相同,即相等。
  • 而s1 == s2,则需要参考下图中
    • 如果常量池中,没有该常量,则创建一个新的常量,并指向s1;
    • 如果常量池中,已经有了该常量,则将常量地址指向s2
    • 由于s1和s2指向同一个常量,同一个地址,故相等。
    • 【JAVA基础】12 String类

 2.下面这句话在内存中创建了几个对象? 

String s1 = new String("abc");

 

答案:两个对象,一个对象在堆内存中,一个在方法区的常量池中。

【JAVA基础】12 String类

 

 

答案解析:

  • 在常量池中,如果没有该常量对象,则会创建一个常量对象。
  • new String() 表示在堆内存中创建一个对象,将常量池中常量移动到对象中。
  • 常量对象和new String() 对象的地址是不同的,故两个是在不同的内存位置的两个对象。

 

3.判断定义为String类型的s1和s2是否相等

String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

 

解答:false 和 true

答案解析:

  • String s1 = new String("abc"); 记录的是堆内存对象的地址值
  • String s2 = "abc"; 记录的是常量池中的地址值

 

4.判断定义为String类型的s1和s2是否相等

String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

 

解答:true 和 true

答案解析:

  • java中有常量优化机制,会将"a" + "b" + "c"编译时直接作为"abc"的常量放在常量池中
  • 比如:byte b = 3 + 4;  在编译时就会变成了7,将7赋值给b。

 

5.判断定义为String类型的s1和s2是否相等

String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2);
System.out.println(s3.equals(s2));

 

解答:false 和 true

答案解析:

  • Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。

 【JAVA基础】12 String类

 

 4. String类的判断功能

  • boolean equals(Object obj):  比较字符串的内容是否相同,区分大小写
    • package com.heima.string;
      
      public class Demo4_StringMethod {
      
          /**
          boolean equals(Object obj):  比较字符串的内容是否相同,区分大小写
           */
          public static void main(String[] args) {
              String s1 = "heima";
              String s2 = "heima";
              String s3 = "heiMa";
              
              System.out.println(s1.equals(s2)); // 输出true
              System.out.println(s2.equals(s3));  //  输出false
          }
      
      }
      View Code

相关文章: