Java 基础(四):从面试题看String
2020/3/18 17:24:12
本文主要是介绍Java 基础(四):从面试题看String,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
字符串介绍
String
类是java.lang
包中的一个类,是我们日常中使用的非常多的一个类,它不是基础数据类型,底层实现是字符数组来实现的:
/** The value is used for character storage. */ private final char value[]; 复制代码
String
类是由final
修饰的,所以是无法被继承的,一旦创建了String
对象,我们就无法改变它的值。因此,它是线程安全的,可以安全地用于多线程环境中。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence 复制代码
下面我们通过几道面试题来学习String
类
如何创建一个字符串
一般来说有三种:
- 通过
new
关键字通过构造方法去创建 - 通过双引号
“”
- 通过字符串连接符
+
和其余字符串进行拼接创建
说说这几种的区别
-
当通过
new
关键字调用无参构造时,仅仅在JVM的堆内存中创建了一个对象 -
通过
""
创建对象的时候,如果字符串常量池存在该字符串,直接返回该字符串对象在字符串常量池的地址,否则创建一个新的字符串对象并存储在字符串常量池。
String s = new String("a") 创建了几个对象
当通过new
关键字传入双引号字符串参数时,会先去把该双引号的字符串放入字符串常量池,然后遇到new以后会在堆中再次创建一个字符串对象,这里是创建了两个对象。
+ 的实现原理
String s1 = null; String s2 = "abc"; System.out.println(s1 + s2); 复制代码
借这道面试题来聊一下+的原理,这道题的答案是”nullabc“,也许会有些奇怪,但是当你了解了+
的原理后也许就不会感到奇怪了,我们使用javap
命令去看一下编译器那里把+
编译成了什么?
我们在图中被红色框柱的部分可以看出,+
的执行的过程其实就是先把 String
转换成了StringBuilder
后调用append
方法完成拼接后再调用toString
方法完成字符串的拼接。所以上面的代码也可以转换为
StringBuilder s1 = new StringBuilder(String.valueOf(null)); StringBuilder s2 = new StringBuilder("abc"); s1.append(s2).toString(); 复制代码
关于StringBuilder和StringBuffer
StringBuffer
和 StringBuilder
二者都继承了 AbstractStringBuilder
,底层都是利用可修改的char数组(JDK 9 以后是 byte数组)。两者的区别是StringBuilder
是线程不安全的,而StringBuffer
是线程安全的。性能上来说,StringBuilder
要高于StringBuffer
。
在单线程情况下,如有大量的字符串操作情况,不能使用String
来拼接而是使用,避免产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。这时就需要用到我们的StringBuilder
。
而在多线程情况下,应当使用StringBuffer
来保证线程的安全~
判空
在日常的开发中,我们经常会遇到判断字符串是否为空的需求,这里安利几个工具类中的写法:
// 来自apache下的lang3包中的StringUtils import org.apache.commons.lang3.StringUtils .... //这里是判断是否为null或为空 String s; StringUtils.isNotEmpty(s); //这里是用于判断是否为null或为空,或空格,Tab这样的占用符 StringUtils.isNotBlank(s); 复制代码
是否相等
关于两个字符串是否相等,我用的最多的是java.util
包下的Objects
类中的方法 ,实现方法如下:
public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } 复制代码
用法也很简单:
Objects.equals(a,b); 复制代码
公众号
这篇关于Java 基础(四):从面试题看String的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南