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


嗯 ,这篇就到这吧。

相关文章
|
4月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
203 2
|
3月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
337 0
|
4月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
117 5
|
4月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
155 5
|
4月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
201 1
|
4月前
|
算法 Java 微服务
2025 年 Java 面试宝典社招春招秋招实操全方位攻略
2025年Java面试宝典涵盖核心技术及最新趋势,分为四大板块:1. Java基础:深入数据类型、多态等特性,结合学生信息管理等实例;2. JVM核心:解析内存模型与GC算法,附多线程转账等场景应用;3. 高并发方案:详解synchronized与线程池配置,提供Web服务器优化案例;4. Spring生态:剖析IoC/AOP原理,演示微服务架构实现。特别新增Java 17+特性实操,包括Record类、密封接口等语法糖,整合Spring Boot 3、响应式编程及云原生技术,通过订单状态机、API网关配置。
269 1
|
4月前
|
缓存 算法 NoSQL
校招 Java 面试高频常见知识点深度解析与实战案例详细分享
《2025校招Java面试核心指南》总结了Java技术栈的最新考点,涵盖基础语法、并发编程和云原生技术三大维度: 现代Java特性:重点解析Java 17密封类、Record类型及响应式Stream API,通过电商案例演示函数式数据处理 并发革命:对比传统线程池与Java 21虚拟线程,详解Reactor模式在秒杀系统中的应用及背压机制 云原生实践:提供Spring Boot容器化部署方案,分析Spring WebFlux响应式编程和Redis Cluster缓存策略。
94 1
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
11月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
11月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!

热门文章

最新文章