A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天在观看java基础视频中关于String类的几个面试题的时候,发现虽然只有短短的几行代码,却隐藏了很多知识点,所以自己在看完视频后简单的整理了一下,其中不乏存在疏漏,不足之处还请个位指出!

  1. public class Test_String {

  2.         public static void main(String[] args) {
  3. //                test1();
  4. //                test2();
  5. //                test3();
  6. //                test4();
  7.                 test5();
  8.         }

  9.         private static void test5() {
  10.                 /*
  11.                  * str2指向的是常量池中“abc”的地址值
  12.                  * str1指向的是常量池中“ab”的地址值
  13.                  * String中通过 “+” 来使字符串串联,而字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的
  14.                  * 系统会先创建一个StringBuilder对象获得值“abc”,由于无法将StringBuilder对象传给String对象,所以需要调用toString方法来创建一个String对象
  15.                  * str3指向的实际是堆内存中利用toString方法创建的String对象,所以和指向常量池中“abc”的str2地址是不同的,结果为false
  16.                  *
  17.                  * String中重写了equals方法,比较的是内容,结果为true
  18.                  */
  19.                 String str1 = "ab";
  20.                 String str2 = "abc";
  21.                 String str3 = str1 + "c";
  22.                 System.out.println(str2 == str3);      
  23.                 System.out.println(str2.equals(str3));
  24.         }

  25.         private static void test4() {
  26.                 /*
  27.                  * true   java中存在常量优化机制,"a"+"b"+"c"系统会默认变成“abc”来存放,str1在创建的时候就已经在常量池中创建了abc,所以str2会直接使用
  28.                  * true   比较的是内容,同为abc,所以肯定是为true
  29.                  */
  30.                 String str1 = "a"+"b"+"c";
  31.                 String str2 = "abc";
  32.                 System.out.println(str2 == str1);      
  33.                 System.out.println(str1.equals(str2));
  34.         }

  35.         private static void test3() {
  36.                 /*
  37.                  * flase
  38.                  * true
  39.                  *
  40.                  * new String("abc")中存放的是常量池中“abc”的副本,地址值是在堆内存中分配的
  41.                  * str1指向的是常量池中“abc”
  42.                  * 所以这里str和str1的地址肯定不相同,但是String类中重写了equals方法这里比较的是str和str1的值,都是abc所以相等
  43.                  */
  44.                 String str = new String("abc");
  45.                 String str1 = "abc";
  46.                 System.out.println(str == str1);
  47.                 System.out.println(str1.equals(str1));
  48.         }

  49.         private static void test2() {
  50.                 /*
  51.                  * 创建了几个对象?
  52.                  *
  53.                  * public String(String original)
  54.                  * 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
  55.                  * 由于 String 是不可变的,所以无需使用此构造方法,除非需要 original 的显式副本。
  56.                  *
  57.                  * 1、首先在常量池中创建一个abc字符串
  58.                  * 2、在堆内存中创建一个String对象
  59.                  * 3、将常量池中abc的副本传给堆中的String对象
  60.                  * 4、String对象将地址值返回给引用
  61.                  *
  62.                  * 所以这里一共创建了两个对象,常量池中的“abc”和堆内存中“abc”的副本String对象
  63.                  */
  64.                 String str = new String("abc");
  65.         }

  66.         private static void test1() {
  67.                 /*
  68.                  * String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
  69.                  * 字符串是常量;它们的值在创建之后不能更改,存放在常量池
  70.                  *
  71.                  * String类型属于引用数据类型  String str1 = "abc",实际上是类似于Student stu = new Student();
  72.                  * 简而言之就是说这里的“abc”实际上是String类的实现,并且是final修饰的,所以系统会在常量池中分配一个地址值
  73.                  * 接下来的String str2 ="abc",这个语句实际上是把abc的地址传给str2,所以这里str1和str2指向的是同一个对象
  74.                  * 既然是同一个对象,那么地址值肯定是一样的,所以使用==来比较肯定是true
  75.                  * 而String类中是有重写equals方法的,当内容相同的时候比较结果是true
  76.                  */
  77.                
  78.                 String str1 = "abc";
  79.                 String str2 = "abc";
  80.                 System.out.println(str1 == str2);
  81.                 System.out.println(str1.equals(str2));
  82.                 // System.out.println(str1.hashCode());
  83.                 // System.out.println(str2.hashCode());
  84.         }
  85. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马