前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >「Java Grammar」:几道面试题助你玩转String

「Java Grammar」:几道面试题助你玩转String

作者头像
山禾说
发布于 2019-09-02 14:43:11
发布于 2019-09-02 14:43:11
44800
代码可运行
举报
文章被收录于专栏:Vi的技术博客Vi的技术博客
运行总次数:0
代码可运行

字符串介绍

String类是java.lang包中的一个类,是我们日常中使用的非常多的一个类,它不是基础数据类型,底层实现是字符数组来实现的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** The value is used for character storage. */    private final char value[];

String类是由final修饰的,所以是无法被继承的,一旦创建了String对象,我们就无法改变它的值。因此,它是线程安全的,可以安全地用于多线程环境中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public final class String    implements java.io.Serializable, Comparable<String>, CharSequence

下面我们通过几道面试题来学习String

如何创建一个字符串

一般来说有三种:

  • 通过new关键字通过构造方法去创建
  • 通过双引号“”
  • 通过字符串连接符+和其余字符串进行拼接创建

说说这几种的区别

  1. 当通过new关键字调用无参构造时,仅仅在JVM的堆内存中创建了一个对象
  2. 通过""创建对象的时候,如果字符串常量池存在该字符串,直接返回该字符串对象在字符串常量池的地址,否则创建一个新的字符串对象并存储在字符串常量池。

String s = new String("a") 创建了几个对象

当通过new关键字传入双引号字符串参数时,会先去把该双引号的字符串放入字符串常量池,然后遇到new以后会在堆中再次创建一个字符串对象,这里是创建了两个对象。

+ 的实现原理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String s1 = null;String s2 = "abc";System.out.println(s1 + s2);

借这道面试题来聊一下+的原理,这道题的答案是”nullabc“,也许会有些奇怪,但是当你了解了+的原理后也许就不会感到奇怪了,我们使用javap命令去看一下编译器那里把+编译成了什么?

我们在图中被红色框柱的部分可以看出,+的执行的过程其实就是先把 String转换成了StringBuilder后调用append方法完成拼接后再调用toString方法完成字符串的拼接。所以上面的代码也可以转换为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
StringBuilder s1 = new StringBuilder(String.valueOf(null));StringBuilder s2 = new StringBuilder("abc");s1.append(s2).toString();

关于StringBuilder和StringBuffer

StringBufferStringBuilder 二者都继承了 AbstractStringBuilder ,底层都是利用可修改的char数组(JDK 9 以后是 byte数组)。两者的区别是StringBuilder是线程不安全的,而StringBuffer是线程安全的。性能上来说,StringBuilder要高于StringBuffer

在单线程情况下,如有大量的字符串操作情况,不能使用String来拼接而是使用,避免产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。这时就需要用到我们的StringBuilder

而在多线程情况下,应当使用StringBuffer来保证线程的安全~

判空

在日常的开发中,我们经常会遇到判断字符串是否为空的需求,这里安利几个工具类中的写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 来自apache下的lang3包中的StringUtilsimport org.apache.commons.lang3.StringUtils....      //这里是判断是否为null或为空  String s;  StringUtils.isNotEmpty(s);
	//这里是用于判断是否为null或为空,或空格,Tab这样的占用符	StringUtils.isNotBlank(s);

是否相等

关于两个字符串是否相等,我用的最多的是java.util包下的Objects类中的方法 ,实现方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static boolean equals(Object a, Object b) {        return (a == b) || (a != null && a.equals(b));}

用法也很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Objects.equals(a,b);

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Vi的技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM之StringTable
Java语言规范里要求完全相同的字符串字面量,应该包含同样的Unicode字符序列(包含同一份码点序列的常量),并且必须是指向同一个String类实例。
Java微观世界
2025/01/20
840
JVM之StringTable
Java - String源码解析及常见面试问题
这里需要提一下的是: 以 StringBuffer 和 StringBuilder 为参数的构造函数容易被忽略,因为String 、 StringBuffer、StringBuilder 这三种数据类型, 通常都是单独使用的哇。 知道就行,反正平常也不这么写
小小工匠
2021/08/17
2070
Java String:重要到别人只能当老二的字符串类
字符串,是Java中最重要的类。这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性。
沉默王二
2019/01/28
5250
Java String:重要到别人只能当老二的字符串类
夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
程序员黄小斜
2019/09/25
7060
面试常备,字符串三剑客 String、StringBuffer、StringBuilder
字符串操作毫无疑问是计算机程序设计中最常见的行为之一,在 Java 大展拳脚的 Web 系统中更是如此。
飞天小牛肉
2021/02/26
4471
面试常备,字符串三剑客 String、StringBuffer、StringBuilder
《JavaSE-第十二章》之String
String是Java中的引用类型,位于java.lang下,该类所定义的变量可用于指向字符串对象,然后来操作该字符串。
用户10517932
2023/10/07
1670
《JavaSE-第十二章》之String
String常见面试题
捞月亮的小北
2024/02/22
980
《面试季》经典面试题(七)
  类文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。
IT学习日记
2022/09/13
2520
Java程序员面试之---String类型
相信大家在平时的JAVA面试中经常遇见String类型是什么?String类型是基础类型吗?今天就给大家分享下JAVA中String类型常见的面试题!
Rookie
2020/12/18
4800
「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过
什么是字符串?如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列。为了更好的理解以上的理论,我们先来解释下字符序列,字符序列:把多个字符按照一定的顺序排列起来;而字符序列就是作为字符串的内容而存在的。所以可以把字符串理解为:把多个字符按照一定的顺序排列起来而构成的排列组合。
老夫编程说
2020/04/27
5940
「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过
深入理解String类
在Java中String类的使用的频率可谓相当高。它是Java语言中的核心类,在java.lang包下,主要用于字符串的比较、查找、拼接等等操作。如果要深入理解一个类,最好的方法就是看看源码:
java技术爱好者
2021/05/07
3590
jvm之StringTable解读
The current implementation of the String class stores characters in a char array, using two bytes (sixteen bits) for each character. Data gathered from many different applications indicates that strings are a major component of heap usage and, moreover, that most String objects contain only Latin-1 characters. Such characters require only one byte of storage, hence half of the space in the internal char arrays of such String objects is going unused.
一个风轻云淡
2023/10/15
2830
jvm之StringTable解读
Java漫谈-String上
String对象是不可变的。每次修改都是创建了一个全新的String对象,以包含修改后的字符串内容,最初的String对象在原处丝毫未动。
WindCoder
2020/01/21
6340
【005期】JavaSE面试题(五):String类
大家好,我是Java面试题库的提裤姐,本篇文章是面试系列文章的第五篇,主要介绍了JavaSE中String相关的面试题,在之后会顺着开篇的思维导图一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。
java进阶架构师
2020/07/09
4560
这次让我们从字节码文件来重新认识String,文末有两个小小面试题,一起来试一试
String 实现了Serializable和Comparable接口:即字符串是支持序列化和比较大小的。
宁在春
2022/10/31
3340
这次让我们从字节码文件来重新认识String,文末有两个小小面试题,一起来试一试
Java基础教程(4)-Java中的操作符
字符串类型 String 是引用类型,Java将字符串作为String类型对象来处理,用双引号 "…" 表示字符串。理论上一个字符串可以存储0个到任意个字符;
JQ实验室
2024/04/22
1490
深入理解Java中的String
想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码:
lyb-geek
2019/01/08
6460
Java基础系列2:深入理解String类
String是Java中最为常用的数据类型之一,也是面试中比较常被问到的基础知识点,本篇就聊聊Java中的String。主要包括如下的五个内容:
王金龙
2020/02/14
6610
stringbuffer和stringbuilder是什么_Java编程
String底层是一个final类型的字符数组,所以String的值是不可变的,每次对String的操作都会生成新的String对象,造成内存浪费 而StringBuffer和StringBuilder就不一样了,他们两都继承了AbstractStringBuilder抽象类,从AbstractStringBuilder抽象类中我们可以看到
全栈程序员站长
2022/09/29
2940
stringbuffer和stringbuilder是什么_Java编程
浅谈Java中字符串的初始化及字符串操作类
当你知道字符串的初始化细节后, 再去写 Strings="hello"或 Strings=newString("hello")等代码时, 就能做到心中有数。
Java识堂
2019/08/02
5860
浅谈Java中字符串的初始化及字符串操作类
相关推荐
JVM之StringTable
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验