Java基础之String深入解析

Java基础之String深入解析


以下是本文目录大纲

  1. 生成地方和地址指向,intern()方法
  2. String可否被继承?

1. 生成地方和地址指向,intern()方法


先看代码

		String s1 = new String("abc");
        String s2 = "abc";
        String s3 = new String("abc");

        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s2 == s3);

问题:

  1. s1,s2,s3分别在哪?生成了几个对象?
  2. 结果是什么?

先看程序运行的结果

false
false
false

解析:

  • String s1 = new String("abc");
    "abc" 会在字符串常量池里面生成一个字符串abc
    new String("abc"); 会在堆里面生成 abc的对象
  • String s2 = "abc";
    由于"abc"在字符串常量池里,所以可以直接引用
  • String s3 = new String("abc");
    “abc” 先在常量池里找,找到了就不在常量池里生成了,但是
    new String("abc");会在堆里面再生成一个对象abc

画图如下:
在这里插入图片描述

结论:
1. 生成3个abc对象,一个在字符串常量池里,两个在堆里
2. 结果如上


扩展加强

先看代码

 String s1 = new String("abc");
        String s2 = "abc";
        String s3 = new String("abc");

        System.out.println(s1 == s1.intern());
        System.out.println(s2 == s2.intern());
        System.out.println(s1.intern() ==s2.intern());

备注:当使用intern()方法时,查询字符串常量池是否存在当前字符串,若不存在则将当前字符串复制到字符串常量池中,并返回字符串常量池中的引用。


问题:

  1. 结果是分别是什么?

解析:

  • s1.intern()返回常量池里中abc对象,s1是堆对象abc,所以false
  • 同理,s2,s2.intern()都指向字符串常量池中的对象abc,所以true
  • s1.intern()s2.intern()都指向字符串常量池中的对象abc,所以true

画图如下:
在这里插入图片描述


结论:

false
true
true


2. String可否被继承?


先看代码

		String s4 = "java";
        String s5 = "ja";
        String s6 = "va";
        System.out.println(s4 == "java");
        System.out.println(s4 == (s5 + s6));
        System.out.println(s4 == "ja" + s6);
        System.out.println((s5+s6)== "ja" + s6);

解析:

  • s4 == "java",都是常量池里的对象,返回true
  • (s5+s6)会在堆里面生成 “java”,所以s4 == (s5 + s6)返回false
  • 同理"ja" + s6也会在堆里面生成 “java”,所以(s5+s6)== "ja" + s6返回false
  • (s5+s6) == "ja" + s6 等号两边引用的对象虽然相同,但是生成的对象是不一样的,所以返回false

画图如下:
在这里插入图片描述

目录 目 录 第1章 基本概念 1 话题1 开门见山——测试你的Java水平 1 话题2 世外隐者——隐居深山的“关键字” 2 话题3 疑团满腹——标识符更深层的思考 6 话题4 鞭长莫及——我的特殊字符,你不能用! 10 话题5 移星换斗——从byte b = 1谈类型转换的神秘 16 话题6 扑朔迷离——浮点类型的种种悬疑 22 话题7 水落石出——浮点结构的最终解密 31 话题8 龙虎争霸——基本for循环与加强型for 循环的对比 45 第2章 运算符与表达式 52 话题9 莫衷一是——i+++j该如何计算? 52 话题10 千差万别——++i与i++仅是“先加”与“后加”的差别吗? 56 话题11 强大相径庭——相除与求余在Java中的具体表现 61 话题12 移形换位——移位运算的真实剖析 75 话题13 鞭辟近里——条件运算符(?:)的类型深入 81 话题14 井然有序——运算顺序的详细挖掘 86 话题15 异曲同工——交换变量的3种方式 90 话题16 择木而栖——开关选择表达式switch的类型内幕 95 第3章 String类 103 话题17 来龙去脉——“+”是怎样连接字符串的? 103 话题18 一成不变——不可修改的String对象 107 话题19 钩深索隐——String字符最大长度的探索 111 话题20 追本溯源——追寻String字面常量的“极限” 116 话题21 旧调重弹——再论equals方法与“==”的 区别 122 话题22 顺藤摸瓜——从字面常量到String常量池 136 第4章 方法、构造器与变量 143 话题23 相差无几——main方法很“特殊”吗? 143 话题24 一词多义——方法重载的详细说明 150 话题25 踵事增华——方法重写的真正条件 166 话题26 一叶障目——方法与成员变量的隐藏 177 话题27 发轫之始——执行初始化的构造器 182 话题28 殊途同归——成员变量不同的初始化方式 193 话题29 按部就班——初始化顺序与向前引用 206 第5章 类与接口 220 话题30 相辅相成——基本数据类型与包装类 220 话题31 分门别类——数组的阐述 232 话题32 规矩方圆——定义规范的接口类型 242 话题33 彻里至外——嵌套类型 248 话题34 不胜枚举——枚举的神秘 258 话题35 按部就班——加载、链接与初始化 265 话题36 择优录取——类型及其成员的选择 283 内容简介 本书分为5章,分别为“基本概念”,“运算符与表达式”,“String类”,“方法,构造器与变量”,“类与接口”。 通过以上方面介绍那些常见、常用却少为人知的Java知识。虽然内容相对基本,但都不是容易解答的。目前更多的开发人员(不乏多年开发经验者),也仅仅停留在Java表面的层次,而本书,将更深入一层地去讨论Java的话题,令读者耳目一新,知其然,更知其所以然。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值