推薦公衆號
有彩蛋哦!!!(或者公衆號內點擊網賺獲取彩蛋)
前言
在看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"則沒有創建,如果沒有創建了一個
(3)new String(“abc”).intern();創建了幾個對象
如果之前常量池中有"abd"則只創建了一個,如果沒有則2個