关于string.intern()的一个问题

黑山白水 2017-03-10 04:12:35

String s1 = new StringBuilder("floa").append("t").toString();
System.out.println(s2.intern() == s2);
String s2 = new StringBuilder("go").append("od").toString();
System.out.println(s1.intern() == s1);


上面代码在JAVA8下的输出是flase true,为什么会出现这样的情况呢,发现把float换成其它7个基本类型对应的字符串、main、java也是false。
intern()的基本用法知道,就想知道为什么有些字符串例如int这类返回的结果是false?
...全文
350 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zs808 2017-03-17
  • 打赏
  • 举报
回复
以下摘自Float类:

    /**
     * The {@code Class} instance representing the primitive type
     * {@code float}.
     *
     * @since JDK1.1
     */
    @SuppressWarnings("unchecked")
    public static final Class<Float> TYPE = (Class<Float>) Class.getPrimitiveClass("float");
看到了没,"float"。 ===== 再给你看看Integer的:

    /**
     * The {@code Class} instance representing the primitive type
     * {@code int}.
     *
     * @since   JDK1.1
     */
    @SuppressWarnings("unchecked")
    public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
====== 其它的例子我就不举了。
ps45221 2017-03-15
  • 打赏
  • 举报
回复
个人觉得有两种可能: 第一种,就像3楼说的那样,预先装进去 第二种,在执行java程序中,难免会有字符串产生,像"charsetName", "lr","az"这些, 只是这些不是自己写的,而是java源码中就有的,你调用了这个,自然会存在了
GQB1226 2017-03-15
  • 打赏
  • 举报
回复
和我问的问题一样,应该是常量池里预先有的,就和Byte,Short,Integer,Long,Character,Boolean这些封装类默认在常量池创建-128-127一样
黑山白水 2017-03-14
  • 打赏
  • 举报
回复
引用 1 楼 pany1209 的回复:
怎么s2跑到上面了???
额, 复制错了
李德胜1995 2017-03-10
  • 打赏
  • 举报
回复
怎么s2跑到上面了???

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧