三道简单的 String 面试题干趴下了 n 多大牛

  发布时间:2019-09-24 16:07:48   作者:singwhatiwanna   我要评论
这篇文章主要介绍了三道简单的 String 面试题干趴下了 n 多大牛,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

几道面试题学习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关键字通过构造方法去创建
  • 通过双引号“”
  • 通过字符串连接符+和其余字符串进行拼接创建

说说这几种的区别

  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包中的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);

后面

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

相关文章

  • 程序员面试的几个小技巧

    这篇文章主要介绍了程序员面试的几个小技巧,在平时面试的时候,除了实打实的技能还需要更多的技巧,双管齐下才能赢得更大的胜算,技能方面就不多说了,下面来分享几个面试
    2023-04-23
  • AQS底层原理连环相扣系列锁面试题分析

    面试中,问锁主要是两方面:锁的日常使用场景 + 锁原理,锁的日常使用场景主要考察对锁 API 的使用熟练度,看看你是否真的使用过这些 API,而不是纸上谈兵,锁原理主要就是
    2022-05-19
  • Mybatis常见面试题详细总结

    这篇文章主要介绍了Mybatis常见面试题详细总结,通过总结列举大量的mybatis面试常见题目供给大家参考,希望对大家有所帮助
    2021-08-24
  • 2020Java后端开发面试题总结(春招+秋招+社招)

    这篇文章主要介绍了2020Java后端开发面试题总结(春招+秋招+社招),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-02-18
  • MySQL数据库选择题小结

    这篇文章主要介绍了MySQL数据库选择题小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-02-07
  • 30道有趣的JVM面试题(小结)

    这篇文章主要介绍了30道有趣的JVM面试题(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-11-26
  • Python面试题爬虫篇小结(附答案)

    这篇文章主要介绍了Python面试题爬虫篇小结(附答案),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-10-28
  • 还不理解B树和B+树,那就看看这篇文章吧

    这篇文章主要介绍了还不理解B树和B+树,那就看看这篇文章吧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一
    2020-09-10
  • Java面试通关要点汇总(备战秋招)

    这篇文章主要介绍了Java面试通关要点汇总(备战秋招),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-09-08
  • 10道JVM常见面试题解析(附答案)

    这篇文章主要介绍了10道JVM常见面试题解析(附答案),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学
    2020-09-04

最新评论