南極變綠了!全球暖化讓藻類大爆發 恐加速融冰

4{icon} {views}

摘錄自2020年5月21日自由時報報導

全球暖化持續對環境造成影響,期刊《自然通訊》(Nature Communications)20日發布的最新一期指出,隨著地球升溫,南極洲部分地區已經開始「變綠」,藻類在融雪的表面上蓬勃生長。研究人員擔心,藻類會讓雪吸收更多陽光和熱量,反而導致冰層加速融化。

綜合外媒報導,英國劍橋大學及英國南極調查局花費六年時間,結合衛星數據和地面觀測技術,共同繪製首張南極半島的大規模藻類地圖,不只紀錄藻類分布,也將作為往後雪地「轉綠」速度的評估基準。

研究團隊指出,南極藻類正和許多微小的真菌及細菌「緊密結合」,可能會形成新的棲息地,成為全新生態系統的開端。團隊認為,由於全球暖化創造出適合環境,未來藻類將持續擴大生長範圍。目前,研究團隊已在當地發現1679叢綠色藻類,它們總共覆蓋1.9平方公里。

海洋
全球變遷
生態保育
氣候變遷
生物多樣性
國際新聞
南極
南極融冰
全球暖化

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※回頭車貨運收費標準

死啃了String源碼之後

6{icon} {views}

Java源碼之String

說在前面:

為什麼看源碼: 最好的學習的方式就是模仿,接下來才是創造。而源碼就是我們最好的模仿對象,因為寫源碼的人都不是一般的人,所以用心學習源碼,也就可能變成牛逼的人。其次,看源碼,是一項修練內功的重要方式,書看百遍其意自現,源碼也是一樣,前提是你不要懼怕源碼,要用心的看,看不懂了,不要懷疑自己的智商,回過頭來多看幾遍,我就是這樣做的,一遍有一遍的感受,等你那天看源碼不由的驚嘆一聲,這個代碼寫得太好了,恭喜你,你已經離優秀不遠了。最後,看源碼,能培養我們的編程思維,當然這個層次有點高了,需要時間積累,畢竟我離這個境界也有點遠。

今天就來談談java的string的源碼實現,後續我也會寫javaSe的源碼系列,歡迎圍觀和交流。

1.繼承關係

繼承三個接口的說明:

Comparable接口:

實現對象之間比較的接口,它的核心方法只有一個:

public int compareTo(T o);

CharSequence接口:

CharSequence是char值的可讀序列。該接口提供對許多不同種類的char序列的統一隻讀訪問。CharSequence是一個接口,它只包括length(), charAt(int index), subSequence(int start, int end)這幾個API接口。除了String實現了CharSequence之外,StringBufferStringBuilder也實現了 CharSequence接口。

那麼String為什麼實現Charsequence這個接口呢。這裏就要涉及一個java的重要特性,也就是多態。看下面的代碼

   public void charSetTest(CharSequence charSequence){
        System.out.println(charSequence+"實現了多態");
    }
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        StringTest strTest = new StringTest();
        strTest.charSetTest(new String("我是String"));
        strTest.charSetTest(new StringBuffer("我是StringBuffer"));
        strTest.charSetTest(new StringBuilder("我是StringBuilder"));
}

執行結果:

我是String實現了多態
我是StringBuffer實現了多態
我是StringBuilder實現了多態

繼承這個接口的原因就很明顯:

因為String對像是不可變的,StringBuffer和StringBuilder這兩個是可變的,所以我們在構造字符串的過程中往往要用到StringBuffer和StringBuilder。如果那些方法定義String作為參數類型,那麼就沒法對它們用那些方法,先得轉化成String才能用。但StringBuffer和StringBuilder轉換為String再轉換過來很化時間的,用它們而不是直接用String的“加法”來構造新String本來就是為了省時間。

Serializable接口:

繼承該接口,就是表明這個類是是可以別序列化的,這裏就標記了string這個類是可以被序列化的,序列化的定義以及使用時機可以移步這裏。

2.常用方法的使用和源碼解析:

2.1構造方法

string總共提供了15種構造方法:

當然,這麼多的構造方法,只需搞明白四個構造方法就可以了,因為其他的構造方法就是這四個構造方法的調用:

在看構造方法之前,先看看String的屬性

 private final char value[];
 private int hash; // Default to 0
 private static final ObjectStreamField[] serialPersistentFields =
        new ObjectStreamField[0];

通過屬性了解到,底層聲明了一個final類型的char數組,這個char數組就是String的構造方法的核心,因為String的本質就是字符char(只針對javaSE8 以前的版本),下面來分析有代表的四個構造方法:

  1. String()和String(String original)

    這兩個構造方法我們平時用的比較經常,源碼如下:

     public String() {   this.value = "".value; }
    
     public String(String original) {
            this.value = original.value;
            this.hash = original.hash;
        }
    

    分析:

    通過源碼可以看到,核心還是和String類聲明的char[]數組value屬性建立聯繫,進而來處理這個屬性的值。

    在String()這個空構造的方法中,就是屬性char數組的值聲明為一個空的字符串賦值給屬性value.

    而在String(String original),也是將方法參數的value的屬性賦值給聲明char[]數組的value屬性,方便String的其他方法對char[]數組處理。

    記住,在java的String操作中,大多數情況下還是對char[]數組的操作,這點很重要。

    一般情況下定義一個新的字符串,有下面的兩種方式:

    String chen = new String("chen");   // 這個我們一般不會使用
    String chen = "chen";
    

    我們一般會選擇第二種,這又是什麼原因呢:

    其實這兩種聲明的方式在JVM看來時等價的。

    劃重點:

    但是String password=”chen”,利用了字符串緩衝池,也就是說如果緩衝池中已經存在了相同的字符串,就不會產生新的對象,而直接返回緩衝池中的字符串對象的引用。

    如:
    String a = "chen";
    String b = "chen";
    String c = new String("chen");
    String d = new String("chen");
    
    System.out.println(a==b);//將輸出"true";因為兩個變量指向同一個對象。利用了字符串的緩衝池
    System.out.println(c==d);//將輸出"flase";因為兩個變量不指向同一個對象。雖然值相同,只有用c.equals(d)才能返回true.
    

    所以實際中,建議用第一種,可以減少系統資源消耗。

  2. String(char[]vlaue,int offest,int count) 與字符相關的構造方法

    源碼如下:

    public String(char value[], int offset, int count) {
            if (offset < 0) {
                throw new StringIndexOutOfBoundsException(offset);
            }
            if (count <= 0) {
                if (count < 0) {
                    throw new StringIndexOutOfBoundsException(count);
                }
                if (offset <= value.length) {
                    this.value = "".value;
                    return;
                }
            }
            // Note: offset or count might be near -1>>>1.
            if (offset > value.length - count) {
                throw new StringIndexOutOfBoundsException(offset + count);
            }
            this.value = Arrays.copyOfRange(value, offset, offset+count);
        }
    

    分析:

    這個構造方法的作用就是傳入指定大小的char[] 數組,指定一個起始位置,然後構造出從起始位置開始計算的指定長度個數的字符串,具體用法:

    public static void main(String[] args) {
            char[] chars = new char[]{'a','b','c','d'};
            
           // 從chars數組的第二位開始,總數為3個字符的字符串 
            String rangeChar=new String(chars,1,3);
            System.out.println(rangeChar);
        }
    
    輸出:
        abc   
    

    這個構造方法的核心在於:

    this.value = Arrays.copyOfRange(value, offset, offset+count);
    
    //而這個方法在追一層,就到了Arrays這個工具類copyOfRange這個方法
        public static char[] copyOfRange(char[] original, int from, int to) {
            int newLength = to - from;
            if (newLength < 0)
                throw new IllegalArgumentException(from + " > " + to);
            char[] copy = new char[newLength];
            System.arraycopy(original, from, copy, 0,
                             Math.min(original.length - from, newLength));
            return copy;
        }
    

    其實看到這裏,他的實現原理就基本清楚了,分析copyOfRange()這個方法的執行步驟:

    首先是獲取原字符數組的orginal[]要構造字符串的長度,也就是這一行代碼:

    int newLength = to - from;
    

    然後異常判斷,並聲明新的數組,來存儲原數組指定長度的值

     if (newLength < 0)
                throw new IllegalArgumentException(from + " > " + to);
            char[] copy = new char[newLength];
    

    將原字符數組指定長度的值拷貝到新數組,返回這個數組:

     System.arraycopy(original, from, copy, 0,
                             Math.min(original.length - from, newLength));
            return copy;
    

    最後再將數組的值賦值給String的屬性value,完成初始化:

     this.value = Arrays.copyOfRange(value, offset, offset+count);
    

    歸根結底還是和String聲明的屬性value建立聯繫,完成相關的操作。

  3. String(byte[] bytes,int offest,int length,Charset charset) 字節相關的構造方法

    這個構造方法的作用就是將指定長度的字節數組,構造成字符串,且還可以指定編碼值:

    涉及的源碼如下:

    public String(byte bytes[], int offset, int length, Charset charset) {
            if (charset == null)
                throw new NullPointerException("charset");
            checkBounds(bytes, offset, length);
            this.value =  StringCoding.decode(charset, bytes, offset, length);
        }
    
    // StringCoding中的方法:
     static char[] decode(Charset cs, byte[] ba, int off, int len) {
             // 1, 構造解碼器
            CharsetDecoder cd = cs.newDecoder();
            int en = scale(len, cd.maxCharsPerByte());
            char[] ca = new char[en];
            if (len == 0)
                return ca;
            boolean isTrusted = false;
            if (System.getSecurityManager() != null) {
                if (!(isTrusted = (cs.getClass().getClassLoader0() == null))) {
                    ba =  Arrays.copyOfRange(ba, off, off + len);
                    off = 0;
                }
            }
            cd.onMalformedInput(CodingErrorAction.REPLACE)
              .onUnmappableCharacter(CodingErrorAction.REPLACE)
              .reset();
            if (cd instanceof ArrayDecoder) {
                int clen = ((ArrayDecoder)cd).decode(ba, off, len, ca);
                return safeTrim(ca, clen, cs, isTrusted);
            } else {
                ByteBuffer bb = ByteBuffer.wrap(ba, off, len);
                CharBuffer cb = CharBuffer.wrap(ca);
                try {
                    CoderResult cr = cd.decode(bb, cb, true);
                    if (!cr.isUnderflow())
                        cr.throwException();
                    cr = cd.flush(cb);
                    if (!cr.isUnderflow())
                        cr.throwException();
                } catch (CharacterCodingException x) {
                    // Substitution is always enabled,
                    // so this shouldn't happen
                    throw new Error(x);
                }
                return safeTrim(ca, cb.position(), cs, isTrusted);
            }
        }
    
     private static char[] safeTrim(char[] ca, int len,
                                       Charset cs, boolean isTrusted) {
            if (len == ca.length && (isTrusted || System.getSecurityManager() == null))
                return ca;
            else
                return Arrays.copyOf(ca, len);
        }
    

    這個方法構造的方法的複雜之處就是在於對於指定編碼的處理,但是我們如果看完這個方法調用的整個流程最終還是落到

    return Arrays.copyOf(ca, len);
    返回一個指定編碼的字符數組,然後和String類的value屬性建立聯繫
    

    字節數組構造方法的基本邏輯:就是將字節數組轉化為字符數組,再和String的value屬性建立聯繫,完成初始化。

  4. String(StringBuilder builder) 和String(StringBuffer buffer)與String擴展類相關的構造方法:

    這個構造方法就是將StringBuilder或者StringBuffer類初始化String類,源碼如下:

    public String(StringBuffer buffer) {
            synchronized(buffer) {
                this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
            }
        }
    
     public String(StringBuilder builder) {
            this.value = Arrays.copyOf(builder.getValue(), builder.length());
        }
    

    分析:

    核心的代碼還是這一句:

      this.value = Arrays.copyOf(builder.getValue(), builder.length());
    

​ 在往下看builder.getValue(),的源碼

   final char[] getValue() {
        return value;
    }
返回一個字符數組

這樣就能很好理解這個構造方法了: 先利用builder.getValue()將指定的類型轉化為字符數組,通過Arrays.copyOf()方法進行拷貝,將返回的數組賦值給String的屬性value,完成初始化。

2.2常用的方法分析

String的方法大概有60多個,這裏只分析幾個常用的方法,了解其他的方法,可以移步javaSE官方文檔:

  1. 字符串轉化為字符的方法:charAt(int index)

     public char charAt(int index) {
             //1. 判斷異常
            if ((index < 0) || (index >= value.length)) {
                throw new StringIndexOutOfBoundsException(index);
            }
            // 2.返回指定位置的字符
            return value[index];
        }
    

    用法示例:

            String StrChar = "chen";
            char getChar = StrChar.charAt(1);
            System.out.println(getChar);
    輸出:
        h
    

    2.字符串轉化為字節數組的方法:getBytes()

    // 源碼
    public byte[] getBytes() {
        return StringCoding.encode(value, 0, value.length);
    }
    
    // encode的源碼
    static byte[] encode(char[] ca, int off, int len) {
            String csn = Charset.defaultCharset().name();
            try {
                // use charset name encode() variant which provides caching.
                return encode(csn, ca, off, len);
            } catch (UnsupportedEncodingException x) {
                warnUnsupportedCharset(csn);
            }
            try {
                return encode("ISO-8859-1", ca, off, len);
            } catch (UnsupportedEncodingException x) {
                // If this code is hit during VM initialization, MessageUtils is
                // the only way we will be able to get any kind of error message.
                MessageUtils.err("ISO-8859-1 charset not available: "
                                 + x.toString());
                // If we can not find ISO-8859-1 (a required encoding) then things
                // are seriously wrong with the installation.
                System.exit(1);
                return null;
            }
        }
    

​ 用法示例:

       String strByte = "chen";
       
       // 將string轉化為字節數組
       byte[] getBytes = strByte.getBytes();
       
       // 遍歷輸出
        for (byte getByte : getBytes) {
            System.out.println(getByte);
        }
 輸出結果:
     99
     104
     101
     110

3.返回字符串中指定字符的下標的方法: indexOf(String str):

這裏的參數為字符串:

這個方法一共涉及了四個方法,源碼如下:

 public int indexOf(String str) {
        return indexOf(str, 0);
    }

 public int indexOf(String str, int fromIndex) {
        return indexOf(value, 0, value.length,
                str.value, 0, str.value.length, fromIndex);
    }

 static int indexOf(char[] source, int sourceOffset, int sourceCount,
            String target, int fromIndex) {
        return indexOf(source, sourceOffset, sourceCount,
                       target.value, 0, target.value.length,
                       fromIndex);
    }

static int indexOf(char[] source, int sourceOffset, int sourceCount,
            char[] target, int targetOffset, int targetCount,
            int fromIndex) {
    
        // 1. 判斷範圍
        if (fromIndex >= sourceCount) {
            return (targetCount == 0 ? sourceCount : -1);
        }
        if (fromIndex < 0) {
            fromIndex = 0;
        }
        if (targetCount == 0) {
            return fromIndex;
        }
       
        // 2,判斷目標字符串是否時原子符串的子序列,並返回目標序列的第一個字符在原字符序列的索引。
        char first = target[targetOffset];
        int max = sourceOffset + (sourceCount - targetCount);

        for (int i = sourceOffset + fromIndex; i <= max; i++) {
            /* Look for first character. */
            if (source[i] != first) {
                while (++i <= max && source[i] != first);
            }

            /* Found first character, now look at the rest of v2 */
            if (i <= max) {
                int j = i + 1;
                int end = j + targetCount - 1;
                for (int k = targetOffset + 1; j < end && source[j]
                        == target[k]; j++, k++);

                if (j == end) {
                    /* Found whole string. */
                    return i - sourceOffset;
                }
            }
        }
        return -1;
    }

具體執行過程已在方法的註釋中進行了說明:

用法示例:

 String strIndex = "chen";
         int getIndex = strIndex.indexOf("he");
        System.out.println(getIndex);
輸出:
    1

注意:也就是輸出字符串中的第一個字符在原子符串中的索引,前提是傳入的參數必須是原子符串的子序列,以上面的列子為例,傳入的字符串序列必須是chen這個字符串的子序列,才能輸出正確的索引,比如傳入的序列不是chen的子序列,輸出為-1

 String strIndex = "chen";
         int getIndex = strIndex.indexOf("hew");
        System.out.println(getIndex);
輸出:
    -1        

使用這個方法時,這點非常注意。

4.將字符串中的某個字符進行替換:replace(char oldChar, char newChar)

參數就是被替換的字符和新的字符,源碼如下:

public String replace(char oldChar, char newChar) {
    
    if (oldChar != newChar) {
        int len = value.length;
        int i = -1;
        char[] val = value; /* avoid getfield opcode */
        
        // 1.遍歷字符數組,找到原子符的位置
        while (++i < len) {
            if (val[i] == oldChar) {
                break;
            }
        }
        //2. 聲明一個臨時的字符數組,用來存儲替換后的字符串,
        if (i < len) {
            char buf[] = new char[len];
            for (int j = 0; j < i; j++) {
                // 3. 將原字符數組拷貝到新的字符數組中去
                buf[j] = val[j];
            }
            while (i < len) {
                char c = val[i];
                // 4.
                buf[i] = (c == oldChar) ? newChar : c;
                i++;
            }
            // 3. 初始化一個新的字符串
            return new String(buf, true);
        }
    }
    return this;
}

具體的執行邏輯就是註釋的語句。

用法示例:

 String strIndex = "chee";
        String afterReplace = strIndex.replace('e','n');
        System.out.println(afterReplace);
輸出:
    chnn

注意:這裏的替換是字符串中的所有與舊字符的相同的字符,比如上面的這個例子,就是將原子符中的e全部替換為n。

5.字符串的分隔:split(String regex) :

源碼如下:

   public String[] split(String regex) {
        return split(regex, 0);
    }

  public String[] split(String regex, int limit) {
        /* fastpath if the regex is a
         (1)one-char String and this character is not one of the
            RegEx's meta characters ".$|()[{^?*+\\", or
         (2)two-char String and the first char is the backslash and
            the second is not the ascii digit or ascii letter.
         */
        char ch = 0;
        if (((regex.value.length == 1 &&
             ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||
             (regex.length() == 2 &&
              regex.charAt(0) == '\\' &&
              (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
              ((ch-'a')|('z'-ch)) < 0 &&
              ((ch-'A')|('Z'-ch)) < 0)) &&
            (ch < Character.MIN_HIGH_SURROGATE ||
             ch > Character.MAX_LOW_SURROGATE))
        {
            int off = 0;
            int next = 0;
            boolean limited = limit > 0;
            ArrayList<String> list = new ArrayList<>();
            while ((next = indexOf(ch, off)) != -1) {
                if (!limited || list.size() < limit - 1) {
                    list.add(substring(off, next));
                    off = next + 1;
                } else {    // last one
                    //assert (list.size() == limit - 1);
                    list.add(substring(off, value.length));
                    off = value.length;
                    break;
                }
            }
            // If no match was found, return this
            if (off == 0)
                return new String[]{this};

            // Add remaining segment
            if (!limited || list.size() < limit)
                list.add(substring(off, value.length));

            // Construct result
            int resultSize = list.size();
            if (limit == 0) {
                while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {
                    resultSize--;
                }
            }
            String[] result = new String[resultSize];
            return list.subList(0, resultSize).toArray(result);
        }
        return Pattern.compile(regex).split(this, limit);
    }

用法示例:

// 將一句話使用空格進行分隔 
String sentence = "People who hear thumb up can get rich";
        
       // 使用空格進行分隔
       String[] subSequence = sentence.split("\\s");
        for (String s : subSequence) {
            System.out.println(s);
    }

輸出:
    People
    who
    hear
    thumb
    up
    can
    get
    rich

注意:使用這個方法,對正則表達式有所了解,才能實現更強大的功能,正則表達式的學習,可以移步菜鳥教程

6.實現字符串的指定範圍的切割substring(int beginIndex, int endIndex):

源碼如下:

 public String substring(int beginIndex, int endIndex) {
     
        // 1.判斷異常
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        // 2,確定切割的長度
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        // 3.使用構造方法,返回切割后字符串
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);
    }

具體的執行邏輯如註釋所示,這個方法的邏輯總體比較簡單:

具體用法:

     String sentence = "hhchennn";
       String subSequence = sentence.substring(2,6);
        System.out.println(subSequence);
輸出:
    chen

注意:從源碼了解到,這個方法的在切割的時候,一般將第一個參數包含,包含第二個參數,也就是說上面的例子中在切割後的字符串中包含2這個字符,但是不包含6這個字符。

7.當然處理這些還有一些常用的方法,比如:

// 1.去除字符串前後空格的方法
trim()
    
//2.大小寫轉換的方法
 toLowerCase()
 toUpperCase()
    
//3. 將字符串轉化為數組
 toCharArray()
    
// 4.將基本類型轉化字符串    
 valueOf(boolean b)
    
// 5.返回對象本身的字符串形式   
 toString()

這些方法使用起來都比較簡單,強烈建議看看java官方文檔。

3.面試常問

3.1. 為什麼是不可變的

1、什麼是不可變?

從java角度來講就是說成final的。參考Effective Java中第15條使可變性最小化中對不可變類的解釋:

不可變類只是其實例不能被修改的類。每個實例中包含的所有信息都必須在創建該實例的時候就提供,並且在對象的整個生命周期內固定不變。為了使類不可變,要遵循下面五條規則:

1. 不要提供任何會修改對象狀態的方法。

2. 保證類不會被擴展。 一般的做法是讓這個類稱為 `final` 的,防止子類化,破壞該類的不可變行為。

3. 使所有的域都是 final 的。

4. 使所有的域都成為私有的。 防止客戶端獲得訪問被域引用的可變對象的權限,並防止客戶端直接修改這些對象。

5. 確保對於任何可變性組件的互斥訪問。 如果類具有指向可變對象的域,則必須確保該類的客戶端無法獲得指向這些對象的引用。

當然在Java平台類庫中,包含許多不可變類,例如String ,基本類型的包裝類,BigInteger, BigDecimal等等。綜上所述,不可變類具有一些顯著的通用特徵:類本身是final修飾的;所有的域幾乎都是私有final的;不會對外暴露可以修改對象屬性的方法。通過查閱String的源碼,可以清晰的看到這些特徵。

2.為什麼不可變

String real = "chen"
 real = "Wei";

下圖就很好解釋了代碼的執行過程:

執行第一行代碼時,在堆上新建一個對象實例chen,real是一個指向該實例的引用,引用包含的僅僅只是實例在堆上的內存地址而已。執行第二行代碼時,僅僅只是改變了real這個引用的地址,指向了另一個實例wei所以,正如前面所說過的,不可變類只是其實例不能被修改的類。real重新賦值僅僅只是改變了它的引用而已,並不會真正去改變它本來的內存地址上的值。這樣的好處也是顯而易見的,最簡單的當存在多個String的引用指向同一個內存地址時,改變其中一個引用的值並不會對其他引用的值造成影響。

那麼,String是如何保持不可變性的呢?結合Effective Java中總結的五條原則,閱讀它的源碼之後就一清二楚了。

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

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;

    private static final ObjectStreamField[] serialPersistentFields =
        new ObjectStreamField[0];

String類是final修飾的,滿足第二條原則:保證類不會被擴展。分析一下它的幾個域:

  • private final char value[] :可以看到Java還是使用字節數組來實現字符串的,並且用final修飾,保證其不可變性。這就是為什麼String實例不可變的原因。
  • private int hash : String的哈希值緩存
  • private static final long serialVersionUID = -6849794470754667710L : String對象的 serialVersionUID
  • private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0] : 序列化時使用

其中最主要的域就是value,代表了String對象的值。由於使用了private final修飾,正常情況下外界沒有辦法去修改它的值的。正如第三條使所有的域都是final的。和第四條使所有的域都成為私有的所描述的。難道這樣一個private加上final就可以保證萬無一失了嗎?看下面代碼示例:

    final char[] value = {'a', 'b', 'c'};
    value[2] = 'd';

這時候的value對像在內存中已經是a b d了。其實final修飾的僅僅只是value這個引用,你無法再將value指向其他內存地址,例如下面這段代碼就是無法通過編譯的:

    final char[] value = {'a', 'b', 'c'};
    value = {'a', 'b', 'c', 'd'};

所以僅僅通過一個final是無法保證其值不變的,如果類本身提供方法修改實例值,那就沒有辦法保證不變性了。Effective Java中的第一條原則不要提供任何會修改對象狀態的方法String類也很好的做到了這一點。String中有許多對字符串進行操作的函數,例如substring concat replace replaceAll等等,這些函數是否會修改類中的value域呢?我們看一下concat()函數的內部實現:

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

注意其中的每一步實現都不會對value產生任何影響。首先使用Arrays.copyOf()方法來獲得value的拷貝,最後重新new一個String對像作為返回值。其他的方法和contact一樣,都採取類似的方法來保證不會對value造成變化。的的確確,String類中並沒有提供任何可以改變其值的方法。相比final而言,這更能保障String不可變。

3.不可變類的好處:

Effective Java 中總結了不可變類的特點。

  • 不可變類比較簡單。
  • 不可變對象本質上是線程安全的,它們不要求同步。不可變對象可以被自由地共享。
  • 不僅可以共享不可變對象,甚至可以共享它們的內部信息。
  • 不可變對象為其他對象提供了大量的構建。
  • 不可變類真正唯一的缺點是,對於每個不同的值都需要一個單獨的對象。

3.2. 使用什麼方式可以改變String類的不可變性

當然使用反射,java的反射機制可以做到我們平常做不到的很多事情:

        String str = "chen";
        System.out.println(str);
        Field field = String.class.getDeclaredField("value");
        field.setAccessible(true);
        char[] value = (char[]) field.get(str);
        value[1] = 'a';
        System.out.println(str);

執行結果:
  chen
  caen  

3.3. String和stringBuffer和StringBuilder的區別

從以下三個方面來考慮他們之間的異同點:

1.可變和不可變性:

String: 字符串常量,在修改時,不會改變自身的值,若修改,就會重新生成新的字符串對象。

StringBuffer: 在修改時會改變對象本身,不會生成新的對象,使用場景:對字符經常改變的情況下,主要方法: append(),insert() 等。

2.線程是否安全

String: 定義之後不可改變,線程安全

String Buffer: 是線程安全的,但是執行效率比較低,適用於多線程下操作字符串緩衝區的大量數據。

StringBuilder: 線程不安全的,適用於單線程下操作字符串緩衝區的大量數據

3.共同點

StringBuilder和StringBuffer有共有的父類AbstractStringBuilder(抽象類)。

StringBuilder,StringBuffer的方法都會調用AbstractStringBuilder中的公共方法,如: super().append()…

只是StringBuffer會在方法上加上synchronized關鍵字,進行同步。

4.優秀的工具包推薦

4.1guava

Guava工程包含了若干被Google的Java項目廣泛依賴的核心庫,例如:集合[collections] 、緩存[caching] 、原生類型支持[primitives support] 、併發庫[concurrency libraries] 、通用註解[common annotations] 、字符串處理[string processing] 、I/O 等等。所有這些工具每天都在被Google的工程師應用在產品服務中。具體的中文參考文檔,Guava中文參考文檔。

4.2 Hutool

Hutool是一個Java工具包,也只是一個工具包,它幫助我們簡化每一行代碼,減少每一個方法,讓Java語言也可以“甜甜的”。Hutool最初是我項目中“util”包的一個整理,後來慢慢積累並加入更多非業務相關功能,並廣泛學習其它開源項目精髓,經過自己整理修改,最終形成豐富的開源工具集。Hutool參考文檔

追本溯源,方能闊步前行

參考資料:

參考博客:

​ https://juejin.im/post/59cef72b518825276f49fe40

​ https://www.cnblogs.com/ChrisMurphy/p/4760197.html

參考書籍: java官方文檔《深入理解JVM虛擬機》

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※回頭車貨運收費標準

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※推薦評價好的iphone維修中心

※教你寫出一流的銷售文案?

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

因疫公園無人修剪 蜜蜂獲得喘息機會

6{icon} {views}

摘錄自2020年5月26日公視報導

因為疫情的關係,公園綠地的花草都缺乏人力修剪,結果植物長得更好更茂盛,讓蜜蜂有了更多的食物來源,今年的蜂蜜收成也可望提升。

倫敦公園裡的花草,因缺乏人力修剪,反而長得更為茂盛茁壯,正好為蜜蜂提供採集食物的絕佳機會。事實上,隨著都市開發,野生花草大量消失,全球目前有35%的授粉昆蟲正瀕臨滅絕,都市裡寸土寸金的公園綠地,就成了牠們主要的食物補給站。

研究指出,每四週修剪一次,將可使花朵和花蜜的生長保持在最佳狀態。 這次疫情因為居家令的關係,導致公園綠地疏於修剪花草叢生,竟意外讓蜜蜂獲得喘息機會,人類也等於間接受益。

生活環境
國際新聞
英國
疫情
武漢肺炎
蜜蜂
動物與大環境變遷

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※推薦台中搬家公司優質服務,可到府估價

殺戮12頭跳羚羊 南非逮捕盜獵者及32條獵犬

7{icon} {views}

摘錄自2020年5月26日中央社報導

南非東開普省24日一處農場傳出12頭跳羚羊被殺戮,警方逮捕16名盜獵者及參與助攻的32隻獵犬。涉案者今天出庭受審,32隻獵犬送往愛護動物協會看管。

東開普省(Eastern Cape Province)警方發言人索西(Sibongile Soci)表示,介於23歲至48歲的16名盜獵者,涉嫌24日在32隻獵犬的助陣下,於一處私人農場內非法捕殺12頭跳羚羊( Springbok),並且準備販賣牟取暴利。

跳羚羊主要分布在非洲南部與西南部,雙腿細長,一躍而起高逾2公尺,體重約27至42公斤,奔跑速度極快,一般而言,必需倚賴獵犬助攻,否則難以追捕。

遏阻武漢肺炎(COVID-19)疫情擴大,南非自3月26日午夜起全國封鎖至今,各處盜獵行為大為減少。

生態保育
生物多樣性
國際新聞
南非
羚羊
盜獵

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

網頁設計最專業,超強功能平台可客製化

澳洲野火煙霧恐導致400多人死亡 4000多人住院

7{icon} {views}

摘錄自2020年5月26日中央社報導

澳洲環境衛生專家今(26日)告訴政府公共調查機構,澳洲最近野火季致命野火產生的煙霧,與近幾個月445人的死亡及逾4000人的住院治療有關。

澳洲皇家委員會(Royal Commission)是政府特設的公共調查機構,負責尋找改善因應自然災害的方法,必須在下次野火季來臨前,於8月31日報告結果。

澳洲塔斯馬尼亞大學(Universityof Tasmania)孟席斯醫學研究所(Menzies Institute for Medical Research)副教授強斯敦(Fay Johnston)指出,研究所的模型發現,有445人的死亡、3340人的住院及1373人的急診就醫可歸咎於野火。

強斯敦表示,80%的澳洲人(大約2000萬人)受到大火產生的煙霧影響,逾1000萬公頃的土地遭到焚燒。

生態保育
生物多樣性
國際新聞
澳洲
森林野火
森林

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計最專業,超強功能平台可客製化

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※回頭車貨運收費標準

※推薦評價好的iphone維修中心

※教你寫出一流的銷售文案?

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家公司費用怎麼算?

左打病毒右殺蝗蟲 印度和巴基斯坦面臨雙重危機

2{icon} {views}

摘錄自2020年5月26日聯合報報導

正當全球各國疲於對抗新冠病毒之際,印度和巴基斯坦還多了一個頭痛問題:蝗災。成群蝗蟲侵襲印度20多個行政區,災區超過5萬公項,以拉賈斯坦、中央和古吉拉特三個邦最嚴重。

在巴基斯坦,這波蝗災是近20多年來最嚴重,巴國於2月宣布全國緊急狀態,俾路支省、信德省和旁遮普省有38%面積淪為蝗蟲繁殖的溫床。

向來敵對的印度和巴基斯坦,為了解決蝗害破天荒合作,自4月以來已開過九次視訊會議,亦有阿富汗和伊朗的專家加入。

生活環境
永續發展
土地利用
國際新聞
印度
巴基斯坦
蝗蟲
糧食

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※回頭車貨運收費標準

※推薦評價好的iphone維修中心

※超省錢租車方案

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

※推薦台中搬家公司優質服務,可到府估價

老鼠斷糧生死鬥:美國疫情封鎖引爆的「鼠患警報」

4{icon} {views}

摘錄自2020年5月26日聯合報報導

美國疾病管制中心(CDC)上星期對全美發出了「鼠患警報」,指在連續多月的防疫封鎖下,全國各地——特別是都會區的城中地段——紛紛出現了鼠患通報數量異常增加的情況。因為都會鼠群倚賴的餐飲業垃圾與商業區廚餘系統,已因防疫歇業而「斷糧多時」,因此除了鼠群大舉遷移、大膽深入民宅區外,部分鼠群更因生存壓力而出現互食、噬崽、以及鼠群格鬥的「暴力傾向」。

長期以來,以紐約為首的大型城市,都一直苦於城市鼠患的問題。但在2020年初,武漢肺炎疫情的封鎖之下,全國各地的衛生單位、防治機關,都紛紛接到了「大量新增」的居民鼠患通報。相關狀態,自3月中旬陸續爆發,但到了5月下旬,美國疾管中心才終於發出了「鼠患警報」,提醒美國民眾應該注意居家衛生與糧食囤積的安全,以避免養鼠為患、或遭遇那批從都心防疫區裡竄出求生的「侵略性鼠群」。

CDC表示,在近期的鼠患通報中,各級單位不僅發現了「鼠群侵門踏戶」不畏人類的機率大增;治鼠專家們也紛紛觀察到,都會區鼠群出現了「鼠吃鼠」、「鼠群相殺」與「嗜食幼鼠」的極端狀況。種種跡象皆顯示,被人類防疫行為嚴重影響的都會區老鼠,正因生存壓力而在劇烈地轉變集體行為。

生活環境
國際新聞
美國
老鼠
動物與大環境變遷

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※回頭車貨運收費標準

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※推薦評價好的iphone維修中心

※教你寫出一流的銷售文案?

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

李子峰生日安利橫店美食 網友:燕小乙果然是吃貨!

1{icon} {views}

     12月6日,是人氣演員李子峰的生日,作為粉絲福利,生日當天中午李子峰在某直播平台進行了吃播,與粉絲親密互動。直播中,李子峰一身家居服素顏出鏡,劉海垂在額前,五官深邃,和粉絲一起度過了自己的生日。

  直播中,李子峰透露自己正在橫店拍戲,並熱心的向粉絲推薦了橫店美食:鐵鍋燉大鵝、酸菜魚、油潑面等等,惹得粉絲紛紛評論:“組團去橫店找峰哥吃好吃的”“原來燕小乙是本色出演,戲里戲外都是吃貨!”

  據悉,模特出身的李子峰有着優越的外形條件,這幾年在影視劇中,他也展現出了優秀的演技。不論是剛剛結束的《沉默不語的顧小姐》中呆萌憨憨“溫墨林”,還是《慶余年》中冷麵殺手“燕小乙”,《招搖》中出塵絕艷 “琴千弦”…都給觀眾留下了深刻的印象,由李子峰主演的《玫瑰行者》也即將播出,期待他的新作品早日與大家見面。

   網站內容來源:中國娛樂網訊www.yule.com.cn

【精選推薦文章】

※你應該要知道的電子煙懶人包!

※男人為什麼總愛舒壓按摩台北外送茶交流呢?

※老司機曝包養內幕

※那些年被包養的回憶實錄

《神奇公司在哪裡》助推商場復工,神奇員工暖心合唱《愛的奉獻》

4{icon} {views}

     上周五(12月4日),東方衛視聚焦實景廣告創意營銷的全新生活服務類綜藝節目《神奇公司在哪裡》播出第五期,薛之謙、喬杉、楊迪、楊超越、R1SE翟瀟聞、王耀慶六位神奇員工在正大廣場打造了一場“神奇綜藝”,以腦洞大開的創意形式重溫《正大綜藝》的經典環節,喚醒人們對“正大”的美好回憶,助力商場客流回暖、消費復蘇。

  薛之謙楊超越同款腦洞添石錘 翟瀟聞展示“豬食”屢被破梗

  節目中,神奇員工通過充滿創意的策劃再現《正大綜藝》,現場神還原“名歌金曲”“快速搶答”“世界真奇妙”三個經典環節。楊迪和楊超越帶來的“名歌金曲”令人“眼界大開”,兩人改編《粉紅色的回憶》介紹正大廣場,楊超越還挑戰改詞讓大家一起來猜。沒想到被懲罰貼了痣的薛之謙卻來了“痣”慧,快速捕捉到關鍵信息,猜到了楊超越寫的詞為“消費”,令楊迪驚呼“你們倆的腦洞是一樣的!”

  歷史總是驚人的相似,薛之謙和楊超越兩人同款腦洞再添“石錘”。到了薛之謙和翟瀟聞策劃的“快速搶答”環節,兄弟二人腦洞大開的拍攝了很多創意視頻。其中一個視頻,他們看似在點奶茶實際上在“點點頭”,如此難猜的答案卻被楊超越說中了,連薛之謙都不敢相信,感嘆道:“好厲害,竟然可以答出來!”接下來,薛之謙和翟瀟聞又慘遭“破梗”,只見小翟拿出手中的小豬奶粉,剛要進行展示就被楊迪猜中了是豬食,連夜想出的“大招”就這麼破功,令二人在現場目瞪口呆。不過翟瀟聞很快調整狀態,在破梗中不斷建立信念感,憑藉演員的自我修養完成了展示任務,還和薛之謙上演交杯乾豬食。

  王耀慶喬杉深情演繹《一剪梅》 楊迪成功晉陞商務總監

  另一邊,“職場中年組”王耀慶和喬杉強強聯手,一同策劃“世界真奇妙”環節,兩人雖是第一次搭檔“主持”卻默契十足,在執行任務的過程中也擦出不少火花。“不看不知道,世界真奇妙!”當王耀慶和喬杉說出這句開場語時,《正大綜藝》的那個味道立馬就出來了。輪到他們出題時,兩人將題目藏到了一段視頻短片中,並且很用心地演繹了《一剪梅》MV,举手投足間滿滿都是戲,爆笑再現90年代復古風格。令人意想不到的是,這段MV里竟暗藏玄機,兩人出題時偷偷替換答案,引一眾小夥伴集體“抗議”,直呼被他們欺騙了感情。六位神奇員工的搞笑互動,令現場所有人都沉浸在一片歡樂的海洋中。

  而這次活動的最大贏家要數楊迪和喬杉了,兩人順利完成隱藏任務,實力上演“神奇員工升職記”。喬杉憑藉充滿創意的提案,成功獲得這次“神奇綜藝”的主導權並晉陞創意總監。而努力帶貨的楊迪則成為新晉商務總監,給他的“前任”薛之謙“打”了個措手不及,不服輸的薛之謙現場撂狠話:“下期我會把位置搶回來的!”

  最後,這場活動在神奇員工合唱《愛是正大無私的奉獻》的歌聲中落下帷幕。六位神奇員工打造的這場“神奇綜藝”也得到了委託人羅董事長的高度認可:“非常滿意,感謝你們這两天花這麼多時間介紹正大廣場!”相信通過這次為商場復蘇助力,會有更多的人走進正大商場娛樂和消費,恢復這裏往日的熱鬧與活力。下一期節目,神奇公司將設立“神奇”新崗位,擁有統管其他五人權力的副董事長一職到底花落誰家?答案就在本周五晚21點檔東方衛視《神奇公司在哪裡》第六期!

   網站內容來源:中國娛樂網訊www.yule.com.cn

【精選推薦文章】

電子煙有爭議?真相解密

桃園外送茶莊、喝茶吃宵夜首選

※老司機曝包養內幕

※那些年被包養的回憶實錄

《追光吧!哥哥》首播 三代哥哥關係“破冰”友情初養成

1{icon} {views}

     國內首檔混齡男性藝人競演綜藝《追光吧!哥哥》首期節目已於12月5日20:30在優酷、東方衛視、BesTVApp、酷喵同步播出,21位哥哥的首次亮相十分驚艷,不僅個個狀態在線,各自隱藏的才藝技能也是給觀眾太多驚喜。

  節目首播即收穫CSM59城正片收視2.20,初舞台收視2.52;CSM35城正片收視2.27,初舞台收視2.66;全國網城域初舞台收視0.9,收視排名三網第一;CSM59城/35城雙網收視創2020年周六季播綜藝收視新高,與此同時00后份額破11,90后、80后份額破13。在優酷站內,節目熱度最高值9676,播出即斬獲綜藝熱度榜第一,綜藝上新榜第一,真人秀熱榜第一三個第一。同時,節目全網熱議不斷,貢獻了“追光吧哥哥營業”、“21個男人一台戲”“金星鄭爽太敢說了”等多個熱搜話題,口碑炸裂。

  從進入“追光學院”報道互相熟悉,到挑宿舍入住、參加晚宴進一步了解,再到接受“追光教導主任”金星、“追光觀察員”鄭爽的犀利問話和評價,到參加初舞台挑戰自我,環環相扣的過程中,讓哥哥們的個人魅力和團隊融合關係漸漸清晰。儘管面臨各種各樣的狀況,但哥哥們還是展現出樂觀與大度,男人間的友情也在悄無聲息地養成。每個哥哥對於初舞台的態度,都很好地詮釋了“追光而上,寸步不讓”的節目理念。哥哥們從細節處體現出的自信、勇氣和愛,讓人對這檔節目有了更多的期待。

  關係破冰:三代哥哥打破年齡壁壘,詮釋男人間最簡單的快樂

  21位不同年齡、不同領域的傑出男性藝人聚在一起,3人同宿朝夕相處,為了理想而拼搏,男人間的話題令人期待。事實上,觀眾從第一期就看出來,哥哥們雖然彼此之間並不那麼熟悉,但經過短暫地相處,關係迅速“破冰”,友情已經在初養成。

  性格外向的哥哥們,很快打成一片。明道和印小天兩位哥哥雖是初次見面,卻互相在短視頻上仰慕已久。他們一見面就組成“明天組合”,自拍土味視頻,展現“靈魂舞者”風采。

  相對內斂的哥哥們,逐漸打開心扉。李澤鋒和於朦朧剛到達追光學院的時候,兩人並不熟悉,在一樓大廳沙發等待時,相對無言,沒話找話,氣氛一度十分尷尬。但隨着另一位哥哥燒餅的插科打諢,兩人很快熟悉起來。在初舞台之前的選出場順序環節,李澤鋒主動和於朦朧交換,在看到於朦朧票數稍低時,又主動摟肩安慰,讓於朦朧感覺“很暖心”。還有丁澤仁追星汪東城成功,汪東城又追星陳曉東成功,20+、30+、40+三代哥哥成為室友。汪東城“放下身段”為小弟弟丁澤仁做頭髮造型,暖意濃濃,網友大呼丁澤仁追星成功太勵志!

  在網友們看來,這種漸入式的關係滲透,不僅凸顯了每個哥哥獨有的個性標籤,而且在個體色彩鮮明的同時,又把男人間的社交關係、互動模式勾勒了出來。而且陳志朋從天亮等到天黑的孤獨感,讓許多網友心生感慨,不少人產生深深的共情,將這種社交的孤獨感投射到自己的社交日常中。“很能理解陳志朋哥哥的孤獨。其實每個人在社交過程中都會遭遇到類似的尷尬場景。《追光吧!哥哥》把這種現實投射出來,哥哥們的關係處理,給每個人帶來新的思考。”

  舞台突破:初舞台表現燃炸哥哥們的拼勁征服觀眾

  從首期反饋來看,很多網友都表示舞台“很特別”、“太驚艷了”!在初舞台競演部分,《追光吧!哥哥》製作精良卻不令人目眩,整體的舞颱風格簡潔大氣,鮮明有力的燈光設計、硬朗的舞美線條也適於男性氣質的表達。     哥哥們都很拼,出道已經33年、早已功成名就的陳志朋,在初舞台選擇了《青蘋果樂園》和《卡路里》的混編曲表演唱跳,表達初心鬥志,現場觀眾也給予了最大的鼓勵,可是“追光教導主任”金星還是直翻白眼,直接說出“你該減肥了”的話語。陳志朋也毫不介意,一笑置之,大度自嘲。網友們心疼的同時,也為陳志朋的拼勁和樂觀點贊。

  於朦朧在初舞台上展示大提琴才藝,溫柔唱起《逆光》;明道“霸總”上身,一段魔性螃蟹舞大玩顛覆;蘇醒的初舞台也炸翻天……哥哥們的表現帶給觀眾一波又一波的驚喜。

  許多網友表示,《追光吧!哥哥》的舞台,處處充滿驚喜。正如金星說的那樣,到這個舞台,不是讓大家展示自己最為擅長的內容,而是要在這個舞台上實現自我的突破與挑戰。陳志朋是對年齡壁壘的一次突破,明道是對固有形象的一次掙脫……“哥哥們放下固有的輝煌,在舞台上尋找新的起點,突破自我的樣子,真的太勵志了。”許多網友如是說。

  賽制破圈:女性視角+刺激賽制 哥哥追光之路充滿挑戰

  當節目關切男性群體,女性視角的審視也同樣應當在席。《追光吧!哥哥》通過不同年齡層女性觀察團、女性觀眾的設置,深度挖掘男性敘事的“隱秘的角落”,在不同的聲音中再現當代男性的真實狀態。     首期節目中,金星和鄭爽的犀利發聲的確讓網友大呼過癮。鄭爽在節目中語出驚人,一會兒說伍嘉成是來湊數的哥哥,一會兒說明道是來“變青蛙的”。在晚餐中,金星犀利逼問最年輕的哥哥丁澤仁公司讓不讓戀愛,丁澤仁支支吾吾汗出如漿。女性觀點的融入,讓《追光吧!哥哥》有了多維的碰撞與呈現,是當下男女關係在綜藝節目中的一次全新嘗試。

  而且刺激的賽制,也使得哥哥們的追光之路充滿挑戰。21位哥哥,將遭遇“史無前例”的嚴苛賽制!初舞台測評+三場公演考核,哥哥們每天將接受超過12小時的訓練,要不停考試,不停打磨!哥哥們在初舞台表演前經歷了一次內投,排名后七位直接進入待定席位,而待定區,隨時可以對台上正在表演的哥哥按下battle 鍵。而且競演現場更有300位80后、90后、00后女性觀眾與哥哥們深入互動。許多觀眾表示,這樣的賽制新穎,而且有了更精準的人群劃分,更有利於哥哥們尋找到自己的市場地位。“這樣的賽制,這樣犀利的金星和鄭爽,只能說節目很會。”

  在後續的日子里,哥哥們能否頂住壓力,追光而上呢?12月5日起,每周六20:30在優酷、東方衛視、BesTVApp、酷喵同步播出,敬請期待!

   網站內容來源:中國娛樂網訊www.yule.com.cn

【精選推薦文章】

※全台最大電子煙交易平台?

新竹外送茶交流平台

※老司機曝包養內幕

※那些年被包養的回憶實錄