java String校招面试题过程详解

 更新时间:2019年08月12日 08:27:02   作者:曾聪聪  
这篇文章主要介绍了java String校招面试题过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

面试题一:判断下列程序运行结果

package String_test;
public class test_1 {
 public static void main(String[] args) {
  String str1 = "HelloWorld";
  String str2 = "HelloWorld";
  String str3 = new String("HelloWorld");
  String str4 = "Hello";
  String str5 = "World";
  String str6 = "Hello" + "World";
  String str7 = str4 + str5;
  System.out.println("str1 == str2 result: " + (str1 == str2)); //1. true
  System.out.println("str1 == str3 result: " + (str1 == str3)); //2. false
  System.out.println("str1 == str6 result: " + (str1 == str6)); //3. true
  System.out.println("str1 == str7 result: " + (str1 == str7)); //4. false
  System.out.println("str1 == str7.intern() result: " + (str1 == str7.intern()));  //5. true
  System.out.println("str3 == str3.intern() result: " + (str3 == str3.intern()));  //6.false
 }
}

画内存图逐个的分析每种情况:第一个:str1与str2指向同一个地址,故相等。

第二个:new代表创建了一个对象,str3指向堆内存中的引用,故str1与str3指向的地址不同。需要注意的是:字符串常量池中不可能存在两个一样的字符串值,向这里堆内存指向的实际还是运行时常量池中的HelloWorld值

第三个:由于“Hello”与“World”都是常量,用+号在编译时会被自动编译成String str6 = "HelloWorld",所以两个引用都是指向常量池中的地址

第四个:关键点在于理解String str7 = str4+str5。在jdk文档中有这么一段话

java语言提供了字符串串联运算符特殊支持( + ),和其他对象转换为字符串。字符串连接是通过StringBuilder实施(或StringBuffer)类及其append方法。字符串的转换是通过方法toString实施,由Object和继承的所有类的java。

可见jvm会在堆中创建一个以str4为基础的StringBuilder对象,在通过append方法添加,最后通过toSting()返回一个String对象。故str7指向的还是堆内存的对象而str1指向的是常量池中的地址,两者指向地址不相同。

第五个:intern方法使用:一个初始为空的字符串池,它由类String独自维护。当调用 intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(oject)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。这里str1指向常量池中的“HelloWorld”对象,str7.intern():此时常量池中已经有"HelloWorld"字符串值,所以地址指向相同

第六个:str3指向的是堆内存,而str3.intern()返回的是常量池中已有字符串“HelloWorld”的引用,故两者指向地址不同。

面试题二:java中的String为什么设计为final类?

1. 允许String对象缓存hashCode值:在java中String类型是非常常用的,涉及到大量的增删改查。字符串不变性保证了hashCode的唯一性,这是一种优化手段意味着不必每次都去计算hash值,这也是为什么HashMap建议用String,Integer这种不可变对象当作Key值

2. 字符串常量池需要:java中将字符串值存放在字符串常量池中,如果String对象是可变的,会产生很多逻辑错误,比如改变一个对象会影响到另一个独立对象。

3. 安全性:网络地址的url,文件路径path通常情况啊下都是用String类型来保存,如果不是固定不变的可能产生很多安全隐患。

面视题三:有什么办法可以改变String?

如果问了这个就很尴尬,sun公司特意设计的不可变,要强行改变只能通过反射这种骚操作

package String_test;
import java.lang.reflect.Field;
public class test_2 {
 public static void main(String[] args) throws Exception {
  String str = "王老吉真解渴";
  System.out.println("str=: "+str);
  
  //通过反射改变获取内部的value字符数组
  Field field = String.class.getDeclaredField("value");
  field.setAccessible(true);
  field.set(str, new char[]{'加','多','宝','也','解','渴'});
  
  System.out.println("str=: "+str);
 }
}

面试题四:下列代码创建了几个对象?

String st1 = new String(“abc”);

常量池一个“abc”对象,堆中一个"abc"对象,总共两个。

String st1 = new String(“abc”);
String st2 = new String(“abc”);

3个对象。 字符串在常量池中是唯一的,堆内存中有两个,常量池中一个。

面试题五:谈一下String,StringBuilder,StringBuffer的区别?

1.String类是字符串常量,而StringBuilder与StringBuffer是字符串变量。前者不可变后者可变

2.StringBuilder是非同步的,StringBuffer类的API都套上了一层synchronized同步修饰,所以StringBuffer适合在多线程场景使用(实际基本不用),StringBuilder类适合单线程使用,它两用的多的就是append和insert方法

它三的适用场景可以看下知乎:https://www.zhihu.com/question/20101840

小结:

关于String类和它的成员方法,都是被final修饰的,意味着Strin类不可被继承。String底层是采用字符数组对数据进行操作的,关于String的一切操作jdk底层都是会new一个新的String对象,在它的基础上进行操作。所以String是不可变的。

关于String,基础性的理论大致就这些,更多的还会考察字符串的一些算法,这部分也是需要攻克的一个难点!!

参考链接:https://www.jb51.net/article/102181.htm

参考链接:https://www.jb51.net/article/124070.htm

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java毕业设计实战之在线高中考试系统的实现

    Java毕业设计实战之在线高中考试系统的实现

    这是一个使用了java+SSM+Jsp+Mysql+Maven开发的在线高中考试系统,是一个毕业设计的实战练习,具有考试系统该有的所有功能,感兴趣的朋友快来看看吧
    2022-02-02
  • Spring AOP有多少个通知以及它们的执行顺序介绍

    Spring AOP有多少个通知以及它们的执行顺序介绍

    这篇文章主要介绍了Spring AOP有多少个通知以及它们的执行顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java Benchmark 基准测试的实例详解

    Java Benchmark 基准测试的实例详解

    这篇文章主要介绍了Java Benchmark 基准测试的实例详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • 利用Jacob将Excel转换PDF的问题汇总

    利用Jacob将Excel转换PDF的问题汇总

    项目中经常会遇到将excel转换成PDF的需求,下面这篇文章主要给大家介绍了关于如何利用Jacob将Excel转换PDF问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Java web.xml之contextConfigLocation作用案例详解

    Java web.xml之contextConfigLocation作用案例详解

    这篇文章主要介绍了Java web.xml之contextConfigLocation作用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java中创建线程的四种方法解析

    Java中创建线程的四种方法解析

    这篇文章主要介绍了Java中创建线程的四种方法解析,线程是Java编程语言中的一个重要概念,它允许程序在同一时间执行多个任务,线程是程序中的执行路径,可以同时执行多个线程,每个线程都有自己的执行流程,需要的朋友可以参考下
    2023-10-10
  • SpringBoot 配合 SpringSecurity 实现自动登录功能的代码

    SpringBoot 配合 SpringSecurity 实现自动登录功能的代码

    这篇文章主要介绍了SpringBoot 配合 SpringSecurity 实现自动登录功能的代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 使用Log4j为项目配置日志输出应用详解以及示例演示的实现分析

    使用Log4j为项目配置日志输出应用详解以及示例演示的实现分析

    本篇文章是对Log4j为项目配置日志输出应用详解以及示例演示的实现进行了分析介绍,需要的朋友参考下
    2013-05-05
  • Springboot集成minio实现文件存储的实现代码

    Springboot集成minio实现文件存储的实现代码

    MinIO 是一款基于Go语言的高性能对象存储服务,本文主要介绍了Springboot集成minio实现文件存储的实现代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Java中的权重算法(如Dubbo的负载均衡权重)详解

    Java中的权重算法(如Dubbo的负载均衡权重)详解

    这篇文章主要介绍了Java中的权重算法(如Dubbo的负载均衡权重)详解,负载均衡,其含义就是指将负载进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务,需要的朋友可以参考下
    2023-08-08

最新评论