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


嗯 ,这篇就到这吧。

相关文章
|
19天前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
190 0
|
1月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
205 5
|
3月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
3月前
|
存储 SQL 缓存
Java字符串处理:String、StringBuilder与StringBuffer
本文深入解析Java中String、StringBuilder和StringBuffer的核心区别与使用场景。涵盖字符串不可变性、常量池、intern方法、可变字符串构建器的扩容机制及线程安全实现。通过性能测试对比三者差异,并提供最佳实践与高频面试问题解析,助你掌握Java字符串处理精髓。
|
4月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
292 14
|
3月前
|
存储 人工智能 JavaScript
Java从作用域到对象高级应用​
本内容详细讲解了JavaScript中的作用域类型(函数作用域、块作用域、全局作用域)、作用域链、垃圾回收机制、闭包、变量提升、函数参数、数组方法、内置构造函数、对象高级知识、原型链、对象赋值、深浅拷贝、递归、异常处理及this指向等内容,全面覆盖JS核心概念与编程技巧。
40 0
|
4月前
|
存储 Java
Java对象的内存布局
在HotSpot虚拟机中,Java对象的内存布局分为三部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含Mark Word、Class对象指针及数组长度;实例数据存储对象的实际字段内容;对齐填充用于确保对象大小为8字节的整数倍。
|
5月前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
202 1
|
5月前
|
前端开发 Java 数据库连接
java bo 对象详解_全面解析 java 中 PO,VO,DAO,BO,POJO 及 DTO 等几种对象类型
Java开发中常见的六大对象模型(PO、VO、DAO、BO、POJO、DTO)各有侧重,共同构建企业级应用架构。PO对应数据库表结构,VO专为前端展示设计,DAO封装数据访问逻辑,BO处理业务逻辑,POJO是简单的Java对象,DTO用于层间数据传输。它们在三层架构中协作:表现层使用VO,业务层通过BO调用DAO处理PO,DTO作为数据传输媒介。通过在线商城的用户管理模块示例,展示了各对象的具体应用。最佳实践包括保持分层清晰、使用工具类转换对象,并避免过度设计带来的类膨胀。理解这些对象模型的区别与联系。
354 1
|
12月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?