今天大致的阅读了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.cnblogs.com/xiaoxi/p/6036701.html

参考链接:https://blog.csdn.net/yissan/article/details/78740674

参考链接:https://www.zhihu.com/question/35014775/answer/60785988

搞定java String校招面试题的更多相关文章

  1. 一分钟搞定Java高频面试题

    一分钟搞定Java高频面试题 一.变量赋值和计算 题目: public static void main(String[] args) { int i = 1; i = i++; int j = i+ ...

  2. 几周内搞定Java的10个方法

    不要将Java与JavaScript弄混了,Java的目标是“一次编译,到处调试”(呃,不对,是“到处运行”).简单来说,就是Java程序可以直接在任何设备上运行. Java语言是什么? 不管我们是否 ...

  3. 10分钟搞定 Java 并发队列好吗?好的

    | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...

  4. 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...

  5. 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...

  6. 【第一期百题计划进行中,快来打卡学习】吃透java、细化到知识点的练习题及笔试题,助你轻松搞定java

    [快来免费打卡学习]参与方式 本期百题计划开始时间:2022-02-09,今日打卡题已在文中标红. 0.本文文末评论区打卡,需要登录才可以打卡以及查看其他人的打卡记录 1.以下练习题,请用对应的知识点 ...

  7. Java String常见面试题汇总

    String类型的面试题   1.       String是最基本的数据类型吗? 基本数据类型包括byte,int,char,long,float,double,boolean,short一共八个. ...

  8. 这一份MySQL书单,可以帮你搞定90%以上的面试题!

  9. 一篇搞定Java过滤器

    Filter:过滤器 引言 我们可以通过使用前面的技术,做出一些简单的登陆注册以及配合数据库实现对数据增删改查的Demo,程序是基本运行起来了,但是却存在着一个重大的安全问题,那就登陆权限验证,一般来 ...

随机推荐

  1. Python题整理

    1.Python的多态.鸭子类型? 2.Python的序列化工具有哪些? 3.Python处理Excel的工具有哪些? 4.Python处理Graph的算法库有哪些? 5.Python的dict是基于 ...

  2. SpringBoot第二十一篇:整合ActiveMQ

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11190048.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   前一章节中 ...

  3. [Haoi2016]放棋子 题解

    4563: [Haoi2016]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 440  Solved: 285[Submit][Status] ...

  4. ~~函数基础(三):嵌套函数&匿名函数~~

    进击のpython 嵌套函数&匿名函数 讲完作用域之后 对变量的作用范围有大致的了解了吗? 讲个稍微小进阶的东西吧 能够帮助你更加的理解全局和局部变量 嵌套函数 玩过俄罗斯套娃不? 没玩过听过 ...

  5. tomcat配置https以及配置完成后提示服务器缺少中间证书(已解决)

    #### tomcat配置https 准备工作 下载好证书文件,下载的时候可以选择为tomcat文件.我这下载下来是压缩包.解压后就是下图的样子. 以.key结尾的文件是证书的key 以.pem结尾的 ...

  6. 关于下载安装Photoshop CS6遇到的一些问题

    关于安装Photoshop CS6顺带安装AdobeBridge CS6和Aobe Extension Manager CS6的问题 Bridge是PS的一款插件,它能兼容大多数AODBE公司的软件, ...

  7. openstack-neutron基本的网络类型以及分析

    [概述] Neutron是OpenStack中负责提供网络服务的组件,基于软件定义网络的思想,实现了网络虚拟化下的资源管理,即:网络即服务. [功能] ·二层交换 Neutron支持多种虚拟交换机,一 ...

  8. 个人永久性免费-Excel催化剂功能第17波-批量文件改名、下载、文件夹创建等

    前几天某个网友向我提出催化剂的图片功能是否可以增加导出图片功能,这个功能我一直想不明白为何有必要,图片直接在电脑里设个文件夹维护着不就可以了么?何苦还要把Excel上的图片又重新导出到文件夹中?这个让 ...

  9. C#3.0新增功能03 隐式类型本地变量

    连载目录    [已更新最新开发文章,点击查看详细] 从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式“类型”var. 隐式类型本地变量为强类型,就像用户已经自行声明该类型,但 ...

  10. hdu6406 Taotao Picks Apples(线段树)

    Taotao Picks Apples 题目传送门 解题思路 建立一颗线段树,维护当前区间内的最大值maxx和可摘取的苹果数num.最大值很容易维护,主要是可摘取的苹果数怎么合并.合并左右孩子时,左孩 ...