1. gzyueqian
      13352868059

      學(xué)習(xí)java哪里好?想學(xué)java那你知道Java 中的 String 類的設(shè)計(jì)嗎

      更新時(shí)間: 2018-10-06 12:00:00來源: 學(xué)習(xí)java瀏覽量:3141

          我們都知道 Java 中的 String 類的設(shè)計(jì)是不可變的,來看下 String 類的源碼。

      public final class String
          implements java.io.Serializable, Comparable<String>, CharSequence {
          /** The value is used for character storage. */
          private final char value[];
          /** Cache the hash code for the string */
          private int hash; // Default to 0
          // ...
      }

          可以看出 String 類是 final 類型的,String 不能被繼承。其值 value 也就是對字符數(shù)組的封裝,即 char[],其值被定義成 private final 的,說明不能通過外界修改,即不可變。
          String 真的 "不可變 " 嗎?
          來看下面這個(gè)例子。

      String str = "Python";
      System.out.println(str); // Python
      str = "Java";
      System.out.println(str); // Java
      str = str.substring(1);
      System.out.println(str); // ava

          你有可能會(huì)問:str 不是由 Python 變成 Java 了嗎?然后通過 substring 方法變成 ava 了嗎?
          這其實(shí)是初學(xué)者的一個(gè)誤區(qū),從上面看 String 的結(jié)構(gòu)可以得知字符串是由字符數(shù)組構(gòu)成的,str 只是一個(gè)引用而已,次引用了 "Python",后面變成了 "Java",而 substring 也是用 Arrays.copyOfRange 方法重新復(fù)制字符數(shù)組構(gòu)造了一個(gè)新的字符串。
          Java中的String真的是不可變嗎?_
          所以說,這里的字符串并不是可變,只是變更了字符串引用。
          關(guān)于 substring 在 JDK 各個(gè)版本的差異可以看這篇文章《注意:字符串substring方法在jkd6,7,8中的差異》,也可以去看 substring 的各個(gè)版本的源碼。
          String 真的真的真的 "不可變 " 嗎?
          上面的例子肯定是不可變的,下面這個(gè)就尷尬了。

      String str = "Hello Python";
      System.out.println(str); // Hello Python
      Field field = String.class.getDeclaredField("value");
      field.setAccessible(true);
      char[] value = (char[])field.get(str);
      value[6] = 'J';
      value[7] = 'a';
      value[8] = 'v';
      value[9] = 'a';
      value[10] = '!';
      value[11] = '!';
      System.out.println(str); // Hello Java!!

          通過反射,我們改變了底層的字符數(shù)組的值,實(shí)現(xiàn)了字符串的 “不可變” 性,這是一種騷操作,不建議這么使用,違反了 Java 對 String 類的不可變設(shè)計(jì)原則,會(huì)造成一些安全問題。

      免費(fèi)預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 婷婷六月综合缴 | 夜夜38亚洲综合网 | 亚洲国产精品一区第二页 | 亚洲精品日韩综合观看成人91 | 在线看日本免费a∨按摩 | 中文字幕亚洲2020在线 |