几道面试题学习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, CharSequence

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

如何创建一个字符串

一般来说有三种:

  • 通过new关键字通过构造方法去创建

  • 通过双引号“”

  • 通过字符串连接符+和其余字符串进行拼接创建

说说这几种的区别

  1. 当通过new关键字调用无参构造时,仅仅在JVM的堆内存中创建了一个对象

  2. 通过""创建对象的时候,如果字符串常量池存在该字符串,直接返回该字符串对象在字符串常量池的地址,否则创建一个新的字符串对象并存储在字符串常量池。

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

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

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

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

判空

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

// 来自apache下的lang3包中的StringUtilsimport 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);

后面

String虽然简单,但有些细节问题确实很坑,希望本文能对大家有帮助~

推荐阅读早就是优势!阿里最强Java面试题为什么说80%的程序员都缺乏基本功?

编程·思维·职场
欢迎扫码关注

byte数组转为string 去掉转义符_三道简单的 String 面试题干趴下了 n 多大牛!相关推荐

  1. string转成对象_非常简单的string驻留池,你对它真的了解吗

    昨天看群里在讨论C#中的string驻留池,炒的火热,几轮下来理论一堆堆,但是在证据提供上都比较尴尬.虽然这东西很基础,但比较好的回答也不是那么容易,这篇我就以我能力范围之内跟大家分享一下 一:无处不 ...

  2. 将byte数组转为Object

    如果使用下面方法,将会报java.io.StreamCorruptedException: invalid stream header: 31323334异常 public static Object ...

  3. JavaScript将后端获取到的byte数组转为文件

    前言 一般情况下,在我们写项目的时候,都会从后端获取到文件的数据,要么是base64,要么是byte数组,然后我们再通过拿到的数据额外做出来转换为文件的,那么这次教大家如何通过JavaScript将后 ...

  4. Java转义符_运算符

    Java学习第二天 1.转义符 要注意,转义符时反斜杠"\",不要经常弄错了,在java中,特殊符号的引用都用"\"+符号,都是用于字符串输出 上表中,特殊符号 ...

  5. byte数组转为string_String类

    API ----StringBuffer java.lang.Object 继承者 java.lang.String public final class String extends Object ...

  6. python中换行的转义符_详解Python中的各种转义符\n\r\t

    Python中的各种转义符\n\r\t 转义符 描述 \ 续行符(在行尾时) \\ 反斜杠符号 ' 单引号 " 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 ...

  7. python怎么去掉换行符_在Python中,如何去除行末的换行符?

    原标题:在Python中,如何去除行末的换行符? 在python中读取文件时,如何去除行末的换行符?以及在Windows与Linux中的区别? 一.去除换行符 以使用readline进行读取为例: i ...

  8. c语言byte数组转为int,byte转int 0xFF

    参考文档 https://www.cnblogs.com/think-in-java/p/5527389.html "好比我们拿到的文件流转成byte数组,难道我们关心的是byte数组的十进 ...

  9. java string改变的影响_为什么Java的string类要设成immutable(不可变的)

    最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...

  10. java有string这个类型吗_关于java的String类型

    String类型的不可变 众所周知,String类型是不可变的,一旦String对象被创建好了则这个字符串中的序列就不可改变. 为什么String类型是不可变? 根据阅读源码可知,String类是一个 ...

最新文章

  1. 2013年蓝桥杯省赛C/C++A组真题解析
  2. c语言指针和结构体难点,C语言指针和结构体
  3. bzoj2006 NOI2010 数据结构+堆维护区间和最大
  4. (网络编程)URL下载网络资源
  5. [BZOJ] 1084 [SCOI2005]最大子矩阵
  6. Play! Framework 系列(四):DI 模式比较
  7. 【数据结构】——快速排序
  8. 机器学习入门(2)之模型评估与选择
  9. SQLAlchemy orm.query.Query
  10. 【FFMPEG系列】之windows下编译FFMPEG篇----之二(MSYS2)
  11. typescript之nodejs开发
  12. 书籍精品Android篇,拿好赶紧收藏
  13. 配置caffe matlab 中遇到的坑
  14. 如何解决vue项目本地ip地址无法访问项目问题?【亲测有效】
  15. android 实现重力感应,Android重力感应实现方式是怎样实现的?
  16. JSP课程设计——民航售票管理系统
  17. 工程师思维是什么?芯片工程师要有哪些思维习惯?
  18. 低成本快速开发 LoRa 终端:从 0 到 1
  19. 借助Docker hub自己手动制作镜像(以Nginx镜像为例)
  20. matlab实现直方图规定化

热门文章

  1. java web重定向_Javaweb学习之资源重定向与请求转发
  2. 10打印机用户干预怎么办_专业分析:爱普生喷墨打印机为什么是行业标杆?
  3. Introduction to Computer Networking学习笔记(二十九):DHCP
  4. vue强制刷新组件_强制Vue重新渲染组件的方法
  5. linux系统lvs技术,Linux 负载均衡二Lvs技术
  6. mysql workbench uml_Ubuntu 16.04下UML建模PowerDesigner的替代ERMaster和MySQL Workbench
  7. 【问题10】使用Redis SETNX 命令实现分布式锁
  8. iOS中的坑:URL不识别##
  9. Centos yum 命令行 安装KDE Desktop
  10. 总结工作中常用到的linux命令大全_经典