• 必须要会回答的Java面试题(字符串篇)


    最近很多学习java的小白问我字串相关的问题,觉得很有必要整理下,以方便初学者理解字符串以及应对今后面试中考官的提问。

    如果你是有几年Java开发经验,可以根据目录选择性的阅读以下内容,并欢迎留言补充。

    问题列表如下:

    0.String是最基本的数据类型吗
    1.String是否可以被继承
    2.Java中的String a = "abc"和String a = new String(“abc”)的区别?
    3.为什么字符串是不可变的?
    4.什么是String常量池?
    5.使用字符串初始化代码:String a = new String(“abc”);创建多少个对象?
    6.String类中intern()的作用?
    7.使用equals()和’=='进行字符串比较的差异?
    8.String StringBuffer StringBuilder 三者各自线程安全性如何?
    9.String,StringBuffer以及StringBuilder之间的区别?
    10.如何连接多个字符串。
    11.如何分割一个String?
    12.如何判断两个String是否相等?
    13.String类中,字符串长度是否有限制?
    14.Java String “+”连接符拼接字符串原理?

    0.String是最基本的数据类型吗
    Java中基本数据类型包括byte,int,char,long,float,double,boolean,short一共八个;String是定义在 java.lang 包下的一个类。它不是基本数据类型。

    1.String是否可以被继承
    不可以,因为String类似final类。

    2.Java中的String a = "abc"和String a = new String(“abc”)的区别?
    String a = “abc” 使用常量进行初始化,初始化后内存存储在String常量池中
    String a = new String(“abc”) 创建字符串对象,JVM创建字符串对象但不存储于字符串池。

    3.为什么字符串是不可变的?
    因为String类似final类。

    4.什么是String常量池?
    字符串池是一个特殊的内存区域,与存储这些字符串常量的常规堆内存分开。这些对象在应用程序的生命周期中被称为字符串变量。
    如:双引号直接创建的字串,String a = “abc”,会将"abc"存储在该区域。

    5.使用字符串初始化代码:String a = new String(“abc”);创建多少个对象?
    上面一行代码将会创建1或2个字符串。如果在字符串常量池中已经有一个字符串“abc”,那么就只会创建一个“abc”字符串。如果字符串常量池中没有“abc”,那么首先会在字符串池中创建,然后才在堆内存中创建,这种情况就会创建2个对象了。

    6.String类中intern()的作用?

    作用:返回字符串对象的规范表示。
    调用该方法时,如果池已包含String与equals(Object)方法确定的此对象相等的字符串,则返回池中的字符串。否则,将此String对象添加到池中,并String返回对此对象的引用。
    它遵循对于任何两个字符串s和t,s.intern()==t.intern()是true当且仅当s.equals(t)是true。意味着如果s和t都是不同的字符串对象并且具有相同的字符序列,则在两者上调用intern()将导致由两个变量引用的单个字符串池文字。

    典型考题:

    String s1 = new String("ab") + new String("c");
    s1.intern();因为此时常量池没有"abc",会将s3指向常量"abc"
    String s2 = "abc";
    System.out.println(s1 == s2);//true
    
    String s3 = new String("de") + new String("f");
    String s4 = "def";
    s3.intern();// 因为此时常量池有"def",不会将s3指向常量"def"
    System.out.println(s3 == s4);// false
    
    String s5 = "ghi";
    String s6 = new String("ghi");
    s6.intern();// 因为此时常量池有"ghi",不会将s6指向常量"ghi"
    System.out.println(s5 == s6);//false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    7.使用equals和’=='进行字符串比较的差异?
    字串中equals是重写的一个方法,比较字符串中value字符数组中字符是否一致,即比较的是字符串的值,==不仅比较字符串的值,而且还比较两个字符串所在内存地址是否相同。

    8.String StringBuffer StringBuilder 三者各自线程安全性如何?
    String StringBuffer线程安全,StringBuilder非线程安全。

    9.String,StringBuffer以及StringBuilder之间的区别?
    String是值不可变类,每次在String对象上的操作都会生成一个新的对象;StringBuffer和StringBuilder则允许在原来对象上进行操作,而不用每次增加对象;StringBuffer是线程安全的,但效率较低,而StringBuilder效率最高,但非线程安全。

    10.如何连接多个字符串。
    String:通过解读Java API,可以知道Java为字符串连接运算提供特殊支持。字符串连接是通过StringBuilder(或StringBuffer)类及其append方法实现的。
    StringBuffer:使用append实现
    StringBuilder:使用append实现。

    11.如何分割一个String?
    可以使用字串分隔函数:public String[] split(String regex),根据传入的正则字符串进行分割,注意,如果最后一位刚好有传入的字符,返回数组最后一位不会有空字符串。

    12.如何判断两个String是否相等?
    有两种方式判断字符串是否相等,使用"“或者使用equals方法。当使用”"操作符时,不仅比较字符串的值,还会比较引用的内存地址。大多数情况下,我们只需要判断值是否相等,此时用equals方法比较即可。
    还有一个equalsIgnoreCase可以用来忽略大小写进行字符串值比较。

    13.String类中,字符串长度是否有限制?
    可以看字符串类的源码,字符串使用char数组存放字符,该字符数组为定义最大长度,故,理论上来说String是没有长度限制的,限制的是你的内存有多大。

    14.Java String “+”连接符拼接字符串原理?
    String字符串拼接通过StringBuilder走中间过程,通过append方法实现。

    程序有大量字符串拼接时,建议直接StringBuilder实现,就不需要底层new很多临时String对象了。注意null参与拼接时会变成字符串"null"。

    相关问题持续更新汇总,逐步添加代码及更详细的原理解析。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    Oracle SQL - HAVING和分析函数的执行顺序
    泰山OFFICE技术讲座:字体的间距研究2
    004:vue使用relation-graph实现关系图谱
    Perl爬虫程序的框架
    上海理工大学计算机考研资料汇总
    Word控件Spire.Doc 【文档操作】教程(十一):如何在C#中按分页符拆分word文档
    WebSocket理解和使用
    兼容vue2和vue3版本的插件实现过程
    java计算机毕业设计家装行业门店订单管理系统源码+mysql数据库+系统+lw文档+部署
    JS之同步异步promise、async、await
  • 原文地址:https://blog.csdn.net/m0_67394002/article/details/126081218