Java 面试,创建了几个String 对象? 我让问!让你问!让你问!(二)

简介: Java 面试,创建了几个String 对象? 我让问!让你问!让你问!(二)

这时候玩一下池化 intrern():


image.png


加上实例看看 == 看看内存地址是不是一样:


String name1 = "JC";
String name = "JCccc";
String nameNew = new String(name1 + "ccc");
nameNew = nameNew.intern();
System.out.println(name == nameNew);


结果是 true (因为池化,nameNew 放弃了 堆的照顾,指向了字符串常量池)


image.png


这里又有个好玩的点,


就是 池化方法  intern() 的玩法,不是说调了 intern()  就 会把原先指向堆的直接指到字符串常量池。


是调了 intern()  而且 再去接收 intern() 返回的对象引用,这时候才真的会让 nameNew改变引用。


结合代码玩玩:


String name1 = "JC";
String name = "JCccc";
String nameNew = new String(name1 + "ccc");
nameNew.intern();
System.out.println(name == nameNew);
nameNew = nameNew.intern();
System.out.println(name == nameNew);


运行结果:


可以看到池化方法调用但是没有接收的时候,依然是 false ;


在池化方法调用 并接收返回,这时候nameNew才真正改变引用指向字符串常量池里的“JCccc”.


image.png


最后再放个代码例子:


//字符串常量池中的对象
String a = "JC";
//字符串常量池中的对象
String b = "ccc";
//字符串常量池中的对象
String str1 = "JC" + "ccc";
//在堆上创建的新的对象
String str2 = a + b;
//常量池中的对象
String str3 = "JCccc";
System.out.println(str1 == str2);//false    字符串常量池 的 跟 堆的 比较
System.out.println(str1 == str3);//true     字符串常量池 的 跟 字符串常量池 比较
System.out.println(str2 == str3);//false    字符串常量池 的 跟 堆的 比较
str2.intern();
System.out.println(str1 == str2);//false    str2池化不接收
System.out.println(str2 == str3);//false    str2池化不接收
str2=str2.intern();
System.out.println(str1 == str2);//true    str2池化且接收
System.out.println(str2 == str3);//true     str2池化且接收


认真看完上面我啰嗦的这些内容,


后面这些常见的  ‘这里一共创建了几个String对象 ’ 题 ,  随手拿捏。


开始整一些好玩的,也就是经常被问到的面试题:



例题1 :


这里创建了几个对象?


String name = "JCccc";
System.out.println(name);


答:


String对象一个


char[]数据一个


所以是 1个 。


咱们debug,眼看为实:


image.png


例题2:


这里创建了几个对象?


String s1 = new String("JCccc");
System.out.println();


答:


1个是字面量创建的对象,丢到了字符串常量池里面了;


1个是new String 在堆里面创建的对象。


所以是 2个。


image.png


例题3:


这里创建了几个对象?


String s = "JCccc";
String s1 = new String("JCccc");
System.out.println();


答:


也是 2个 。


1个是字面量创建的对象,丢到了字符串常量池里面了;


1个是new String 在堆里面创建的对象。


image.png


同样,debug眼见为实:


image.png


再往下走一行,看到  String s1 = new String("JCccc"); 被执行了,只加了个 String对象 :

image.png


加大难度


例题4:


这里创建了几个对象?


String s = "JCccc";
String a="JC";
String s1 = new String(a+"ccc");
System.out.println();


答:

5个


image.png


3个


image.png


再加上 new  String  和 触发StringBuilder创建  这两个  


3+2 =5


也许,很多人有疑惑,就是说即使看了了编译出来的字节码, 还是不相信 因为 + 符合 触发的 StringBuilder导致 会创建一个 String 对象。


那么我们还是眼见为实,一探到底,看一下StringBuilder的toString 源码,里面还是new了一哈:


image.png

image.png


嗯 ,这篇就到这吧。

相关文章
|
2月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
326 5
|
3月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
3月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
4月前
|
存储 SQL 缓存
Java字符串处理:String、StringBuilder与StringBuffer
本文深入解析Java中String、StringBuilder和StringBuffer的核心区别与使用场景。涵盖字符串不可变性、常量池、intern方法、可变字符串构建器的扩容机制及线程安全实现。通过性能测试对比三者差异,并提供最佳实践与高频面试问题解析,助你掌握Java字符串处理精髓。
|
5月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
272 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
5月前
|
缓存 Java 关系型数据库
Java 面试经验总结与最新 BAT 面试资料整理含核心考点的 Java 面试经验及最新 BAT 面试资料
本文汇总了Java面试经验与BAT等大厂常见面试考点,涵盖心态准备、简历优化、面试技巧及Java基础、多线程、JVM、数据库、框架等核心技术点,并附实际代码示例,助力高效备战Java面试。
216 0
|
5月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
308 0
|
算法 Java
Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(一)
本文内容总结自周志明先生所编著的《深入理解Java虚拟机-JVM高级特性与最佳实践》此书的经典不必多说。本节内容是对象的创建.、分配的内容。 对象的创建 java对象的创建有几种方式呢(这里所说的java对象仅限于普通java对象不包含数据和Class对象)?大致有以下四种方式: new关键字。这应该是我们最常见和最常用最简单的创建对象的方式。 使用newInstance方法
1958 0
|
存储 Java
Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(二)
本文内容总结自周志明先生所编著的《深入理解Java虚拟机-JVM高级特性与最佳实践》此书的经典不必多说。本节内容是对象的内存布局。 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头、实例数据、对齐填充(Padding)。在32位虚拟机中对象头的大小是8个字节,在64位虚拟机中对象头的大小是16个字节, 如果开启压缩的话,对象头的大小是12个字节。对象头包含两部分的
1817 0