nacos源碼引起的字符串常量池與String對象的intern()方法

推薦公衆號

彩蛋哦!!!(或者公衆號內點擊網賺獲取彩蛋)
程序員探索之路

前言

在看nacos源碼時發現有一個方法com.alibaba.nacos.api.common.Constants.NamingUtils.getGroupedName,拼接字符串採用的是+方式,頓時感覺可以改造一下

正文

個人意見修復

nacos源碼

package com.alibaba.nacos.api.naming.utils;

import com.alibaba.nacos.api.common.Constants;

/**
 * @author nkorange
 * @since 1.0.0
 */
public class NamingUtils {

    public static String getGroupedName(String serviceName, String groupName) {
        return groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
    }

改造後

public static String getGroupedName(String serviceName, String groupName) {
        StringBuilder resultGroupedName = new StringBuilder()
            .append(groupName)
            .append(Constants.SERVICE_INFO_SPLITER)
            .append(serviceName);
        return resultGroupedName.toString().intern();
    }

如果有不同意見歡迎留言指正

字符串常量池與String對象的intern()方法

jdk1.8常量池在堆內存中,常量池存放的是對象的地址
String對象的intern()方法作用,如果String對象在常量池中,返回地址;如果不存在將對象加入常量池中,返回地址。
下面幾個有趣的例子

String str1 = "你好";
        System.out.println(String.format("str1==str1.intern;%s",str1==str1.intern()));
        //從結果看出String str1 = "你好";直接將你好加入到了常量池
        String a1 = "你好";
        String a2 = new String("你好");
        System.out.println(String.format("a1==a2;%s",a1==a2));
        System.out.println(String.format("a2==a2.intern;%s",a2==a2.intern()));
        //從結果看出String a2 = new String("你好");這種方式a2 不等於 a2.intern()  因爲a2是new 創建的對象
        String b1 = new StringBuilder().append("你").append("好").toString();
        System.out.println(String.format("b1==b1.intern;%s",b1==b1.intern()));
        //從結果看StringBuilder.toString()不會將你好加入常量池中  b1.intern()之後加入到常量池中 此時b1.intern()和b1是同一對象
面試問題:
         (1)String str = new String(“abc”);創建了幾個對象,
         如果之前常量池中有"abd"則只創建了一個,如果沒有創建了2個
         (2)String str=“abc”;創建了幾個對象;
         如果之前常量池中有"abd"則沒有創建,如果沒有創建了一個
         (3new String(“abc”).intern();創建了幾個對象
         如果之前常量池中有"abd"則只創建了一個,如果沒有則2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章