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

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

(0)

相关推荐

  • Java中构造方法set/get和toString的使用详解

    一.构造函数 构造函数的最大作用就是创建对象时完成初始化,当我们在new一个对象并传入参数的时候,会自动调用构造函数并完成参数的初始化.如下: public class Test01 { private String name; //有参构造函数 public Test01(String name) { this.name = name; } public static void main(String[] args) { Test01 t=new Test01("Wade"); Sy

  • JAVA中截取字符串substring用法详解

    substring public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串.该子字符串始于指定索引处的字符,一直到此字符串末尾. 例如: "unhappy".substring(2) returns "happy" "Harbison".substring(3) returns "bison" "emptiness".substring

  • java判断String类型是否能转换为int的方法

    使用正则表达式,效率较高 public boolean canParseInt(String str){ if(str == null){ //验证是否为空 return false; } return str.matches("\\d+"); //使用正则表达式判断该字符串是否为数字,第一个\是转义符,\d+表示匹配1个或 //多个连续数字,"+"和"*"类似,"*"表示0个或多个 } 以上这篇java判断String类型是

  • Java String字符串和Unicode字符相互转换代码详解

    网上大部分有关"Java String字符串和Unicode字符相互转换代码"的博文几乎都仅是将全为Unicode字符的字符串进行转换,而我们日常很可能需要的是将混有普通字符的Unicode一并转换(例如"\u0061\u0062\u0063(123)",我们希望转换成"abc(123)",而实际上网上的通用方法并不符合该需求,运行即报错),普通字符跳过而Unicode字符要进行转换,在进行字符串的查找替换截取什么的使用正则表达式往往是个很好的选

  • 深入了解Java中String、Char和Int之间的相互转换

    在做在线编程题目的时候,需要了解一下数据的输入格式.这样可以对数据处理有比较好的把握,不需要把太多的时间放在这个上面,注重主要的算法逻辑即可.这里总结一下,为之后笔试做个准备. 1.从终端输入的方式 Scanner类的使用方法: Scanner scanner = new Scanner(System.in); 从终端获取输入流,输入流传入Scanner初始化对象时,作为参数传递进去. Scanner类的重要几个方法: next方法(读取一个字符) 1.一定要读取到有效字符后才可以结束输入(要是

  • java常用工具类 Reflect反射工具类、String字符串工具类

    本文实例为大家分享了java常用工具类的具体代码,供大家参考,具体内容如下 Reflect反射工具类 package com.jarvis.base.util; /** * * * @Title: ReflectHelper.java * @Package com.jarvis.base.util * @Description: 反射工具类 * @version V1.0 */ public class ReflectHelper { /** * 提指定的类载入以系统中 * * @param n

  • Java将Exception信息转为String字符串的方法

    一.前言 在java中,异常机制是非常有用的构成部分,异常信息对于查找错误来说是必不可少至关重要的信息,因此我们希望在发生错误的时候先看到捕捉到底异常信息.然而,通常的异常信息的输出使用e.printStackTrace(),这样异常信息会被输出到控制台中.但有的时候我们需要异常中的部分信息,需要他是一个可以处理的String类型. 二.解决方法 1.使用log4j 当我们使用log4j日志来记录运行信息时,可以直接使用下述方式: logger.error("异常信息:",e); 这样

  • 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&quo

  • JAVA DOM解析XML文件过程详解

    这篇文章主要介绍了JAVA DOM解析XML文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 import java.io.IOException; import javax.xml.parsers.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.No

  • Java并发编程预防死锁过程详解

    这篇文章主要介绍了Java并发编程预防死锁过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在java并发编程领域已经有技术大咖总结出了发生死锁的条件,只有四个条件都发生时才会出现死锁: 1.互斥,共享资源X和Y只能被一个线程占用 2.占有且等待,线程T1已经取得共享资源X,在等待共享资源Y的时候,不释放共享资源X 3.不可抢占,其他线程不能强行抢占线程T1占有的资源 4.循环等待,线程T1等待线程T2占有的资源,线程T2等待线程T1占有

  • 通过Java添加Word文本框过程详解

    前言 在Word中,文本框是指一种可移动.可调节大小的文字或图形容器.我们可以向文本框中添加文字.图片.表格等对象,下面,将通过Java编程来实现添加以上对象到Word文本框. 使用工具:Free Spire.Doc for Java (免费版) Jar文件获取及导入: 方法1:通过官网下载获取jar包.下载后,解压文件,并将lib文件夹下的Spire.Doc.jar文件导入Java程序.(如下图) 方法2:通过maven仓库安装导入. Java代码示例 import com.spire.doc

  • Java synchronized锁升级jol过程详解

    jol(java object layout)需要的依赖 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.10</version> </dependency> 一.synchronized锁对象的升级(膨胀)过程主要如下: 1.膨胀过程:无锁(锁对象初始化时)-> 偏向

  • Java导出网页表格Excel过程详解

    将网页中的table数据,导出到excel表格,可以使用java POI实现. java poi是java中操作excel的工具,支持excel的导入与导出,一般有三种形式: 1.HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls: 2.XSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx: 3.SXSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx: 首先对这三种方式进行一个对比: 1.HSSFWo

  • 使用java实现BBS论坛发送邮件过程详解

    SpringBoot实践,开发社区登录模块今日份开启 发送邮件三个步骤: 1.邮箱设置 首先需要注册一个新浪邮箱 18215626061@sina.cn 然后进入设置开启POP3/SMTP服务,务必记住授权码 左下角点开启 2.Spring Email 导入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail<

  • java Class文件内部结构解析过程详解

    大学的时候,就看过java虚拟机规范第二版,最近把最新的Java虚拟机规范第三版(java se 1.7版本)温习了一遍,发现java虚拟机规范中java class的文件结构部分并没有太大的变化,顺便也整理了一下.java语言是跨平台的,所谓一次编写,到处运行.之所以是跨平台的,就是java定义了一套与操作系统,硬件无关的字节码格式,这个字节码就是用java class文件来表示的,java class文件内部定义了虚拟机可以识别的字节码格式,这个格式是平台无关性的,在linux系统或者在wi

  • java 多线程交通信号灯模拟过程详解

    这学期我们java课程的课程设计项目----交通信号灯的线程设计 实验目的:多线程设计,同步机制 题意 设计一个交通信号灯类: 变量:位置.颜色(红.黄.绿).显示时间(秒). 方法:切换信号灯. 创建并启动两个线程(东西向.南北向)同时运行. 实验要求 设计线程. 设计路口信号灯示意图界面. 进一步将每个方向的信号灯分成3种车道灯:左转.直行和右转. 根据车流量进行时间的模糊控制. 在课程设计的开始并没有仔细看老师的要求,只知道是交通信号灯.然后就开始各种找资料,百度,网上大量的关于红绿灯的设

  • 通过Java设置Word页面背景色过程详解

    前言 Word中可以针对不同文档排版设计要求来设置背景设置颜色.常见的可设置单一颜色.渐变色或加载图片来设置成背景.下面通过Java来设置以上3种Word页面背景色. 使用工具:Spire.Doc for Java v2.2.0 Jar文件导入方法 方法1:通过官网下载.在程序下新建一个directory目录,并命名(本示例中命名为lib):将控件包中lib文件夹下的Spire.Doc.jar(如下图1)直接复制到程序中新建的目录下.复制jar文件后,鼠标右键点击jar文件,选择"Add as

随机推荐