Java面试题2:Java字符串篇

简介: String属于引用数据类型,由于被final修饰,所以String是不可变的,JVM使用字符串池来存储所有的字符串对象。

String字符串的介绍:

String属于引用数据类型,由于被final修饰,所以String是不可变的,JVM使用字符串池来存储所有的字符串对象。


1、字节和字符的区别?


答:

字节是存储容量的基本单位;

字符是数字、字⺟、汉字以及其他语⾔的各种符号;

1 字节 = 8 个⼆进制单位,⼀个字符由⼀个字节或多个字节的⼆进制单位组成。


——————————————————————————————————


2、java中String为什么要设计为不可变类?

答:

C++中string是可变类,可以对string进行一些增删改查的操作,但是在 Java 中将 String 设计成不可变的是综合考虑到各种因素的结果。主要的原因主要有以下三点:

(1)字符串常量池的需要:字符串常量池是 Java 堆内存中⼀个特殊的存储区域, 当创建⼀个 String 对象时,假如

此字符串值已经存在于常量池中,则不会创建⼀个新的对象,⽽是引⽤已经存在的对象;

(2)允许 String 对象缓存 HashCode:Java 中 String 对象的哈希码被频繁地使⽤, ⽐如在 HashMap 等容器中。

字符串不变性保证了 hash 码的唯⼀性,因此可以放⼼地进⾏缓存。这也是⼀种性能优化⼿段,意味着不必每次都

去计算新的哈希码;

(3)String 被许多的 Java 类(库)⽤来当做参数,例如:⽹络连接地址 URL、⽂件路径 path、还有反射机制所需要

的 String 参数等, 假若 String 不是固定不变的,将会引起各种安全隐患。

———————————————————————————————————

3、String、StringBuilder、StringBuffer 的区别?

答:

String:⽤于字符串操作,属于不可变类;【补充:String 不是基本数据类型,是引⽤类型,底层⽤ char 数组实现

的】

StringBuilder:与 StringBuffer 类似,都是字符串缓冲区,但线程不安全;

StringBuffer:也⽤于字符串操作,不同之处是 StringBuffer 属于可变类,对⽅法加了同步锁,线程安全。

————————————————————————————————————

4、String字符串修改实现的原理?

答:

当⽤ String 类型来对字符串进⾏修改时,其实现⽅法是⾸先创建⼀个 StringBuffer,其次调⽤ StringBuffer 的

append() ⽅法,最后调⽤ StringBuffer 的 toString() ⽅法把结果返回。apend()是添加方法。

——————————————————————————————————————

5、String str = “i” 与 String str = new String(“i”) ⼀样吗?

答:

不⼀样,因为内存的分配⽅式不⼀样。String str = “i” 的⽅式,Java 虚拟机会将其分配到常量池中;⽽ String str =

new String(“i”) 则会被分到堆内存中。

7c967e82cdfa2da129b452b1f536b3f2_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_14,color_FFFFFF,t_70,g_se,x_16.png

在执⾏ String str1 = “abc” 的时候,JVM 会⾸先检查字符串常量池中是否已经存在该字符串对象,如果已经存在,

那么就不会再创建了,直接返回该字符串在字符串常量池中的内存地址;如果该字符串还不存在字符串常量池中,

那么就会在字符串常量池中创建该字符串对象,然后再返回。所以在执⾏ String str2 = “abc” 的时候,因为字符串

常量池中已经存在“abc”字符串对象了,就不会在字符串常量池中再次创建了,所以栈内存中 str1 和 str2 的内存地

址都是指向 “abc” 在字符串常量池中的位置,所以 str1 = str2 的运⾏结果为 true。

⽽在执⾏ String str3 = new String(“abc”) 的时候,JVM 会⾸先检查字符串常量池中是否已经存在“abc”字符串,如

果已经存在,则不会在字符串常量池中再创建了;如果不存在,则就会在字符串常量池中创建 “abc” 字符串对象,

然后再到堆内存中再创建⼀份字符串对象,把字符串常量池中的 “abc” 字符串内容拷⻉到内存中的字符串对象中,

然后返回堆内存中该字符串的内存地址,即栈内存中存储的地址是堆内存中对象的内存地址。String str4 = new

String(“abc”) 是在堆内存中⼜创建了⼀个对象,所以 str 3 == str4 运⾏的结果是 false。str1、str2、str3、str4 在

内存中的存储状况如下图所示:

fb4e3b448a03a89f52a5fec970811c25_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_12,color_FFFFFF,t_70,g_se,x_16.png

——————————————————————————————————————

6、String类常用的方法都有哪些?

答:

fa92acf93e59a8e4fe58be8b8e330b62_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_10,color_FFFFFF,t_70,g_se,x_16.png

——————————————————————————————————

7、如何将String转换为char?反过来呢?

答:

String是一系列字符,在java中是不可变的类型,但是其底层原理仍然是用了char字符。所以我们无法转换成单一的char但是可以调用toCharArray()方法将字符串转换成字符数组。

1dfccc2e7f3b2ab2f5c61d86b65bb2f1_0eb9c750153f4fdca1bfc6465bc4b27a.png

——————————————————————————————————————

8、写一个方法用来判断一个String字符串是否是回文串?

答:

6876e520ed5e45815fad807177734bd8_b0100e93a9434c9fabf3348e807fae26.png

6bdef96644859eeae1cd3ce6a6c76361_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_14,color_FFFFFF,t_70,g_se,x_16.png

——

——————————————————————————————————

9、什么是字符串池?

答:

字符串常量池就是用来存储字符串的,它存在于java对内存中。

下图解释了字符串池在java堆空间中如何存在以及当我们使用不用方式创建字符串时情况。

fcc5af0494fc26b1ab9dbb1c3c3e43dd_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_10,color_FFFFFF,t_70,g_se,x_16.png

——————————————————————————————————————

10、String是线程安全的吗?

答:

String是不可变量,一旦创建了String对象,我们就无法改变他的值,因此,它的线程是安全的,可以安全的用于多线程环境中。

————————————————————————————————————————

11、为什么我们在使用HashMap的时候总是用String做key?

答:

因为字符串是不可变的,当创建字符串的时候,他的hashcode被缓存下来,不需要再次计算。因为HashMap内部实现是通过key的hashcode来确定value的存储位置,所以相比于其他对象更快。这也就是为什么我们平时使用String作为HashMatp对象。

—————————————————————————————————————————

12、

2fcf2e47b8fc493c1ae55f7772812140_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png

————————————————————————————————————

13、了解String.intern()方法吗?

答:

String.intern()查找常量池中是否有相同的unicode字符串常量,如果有则返回其引用,如果没有,则在常量池中增加一个unicode等于str的字符串并返回它的引用。因此在用String进行字符串拼接时,会产生很多临时变量。建议多使StringBuffer/StringBuilder。

————————————————————————————————————

14、、String/StringBuffer/StringBuilder都分别存放在什么地方?

答:

String是存放在常量池中,在编译期间已经被确定了。new String()不是字符串常量,他有自己的地址空间,放在堆空间,而其他两个都存放在堆空间中。

————————————————————————————————————————

15、new String(“abc”)和string str="abc"的区别

答:

new出来的对象是先在常量池看是否有这个字符串内容,如果有直接在堆里面创建一个对象,存储这个字符串在常量池的地址,如果没有要先在常量池创建一个内存,存储这个字符串,然后再将这个地址存在内存中

——————————————————————————————————————————

16、String str = new String(“Cat”);这句话创建了几个对象?

答:

一个或者两个

原因:先判断字符串常量池里面有没有Cat字符串对象,如果有,就不会在常量池里面创建Cat对象,但是会在堆内存里面创建一个Cat对象,并将对象地址返回给str变量,这种情况创建一个对象;

如果常量字符串没有,就会现在常量池里面创建Cat字符串,然后再在堆内存里面创建Cat字符串对象,这种情况会创建两个对象

——————————————————————————————————————————

17、 说一下以下代码输出结果

答:

012c9041f9d95e1ae5b7ecbc6bfaf03a_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png

d99ffcceff186917617b4d0679641a86_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png

相关文章
|
3月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
165 1
|
2月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
310 0
|
2月前
|
SQL JSON Java
告别拼接噩梦:Java文本块让多行字符串更优雅
告别拼接噩梦:Java文本块让多行字符串更优雅
351 82
|
2月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
190 14
|
3月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
95 5
|
3月前
|
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容器化部署。
123 5
|
3月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
165 6
|
3月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
153 1
|
3月前
|
算法 Java 微服务
2025 年 Java 面试宝典社招春招秋招实操全方位攻略
2025年Java面试宝典涵盖核心技术及最新趋势,分为四大板块:1. Java基础:深入数据类型、多态等特性,结合学生信息管理等实例;2. JVM核心:解析内存模型与GC算法,附多线程转账等场景应用;3. 高并发方案:详解synchronized与线程池配置,提供Web服务器优化案例;4. Spring生态:剖析IoC/AOP原理,演示微服务架构实现。特别新增Java 17+特性实操,包括Record类、密封接口等语法糖,整合Spring Boot 3、响应式编程及云原生技术,通过订单状态机、API网关配置。
218 1