首页 > 编程语言 >Java面试 : String

Java面试 : String

时间:2024-07-17 20:29:39浏览次数:11  
标签:ab Java String 对象 s2 s1 面试 串池

串池: StringTable,可以理解为一个对象数组 [ "a" ,"b","ab"] 每一个元素都是一个字符串对象

1. 常量池与串池的关系

String s1="a";
String s2="b";
String s3="ab";

上述代码的运行过程:

常量池中的信息会被加载到运行时常量池中,这时 a b ab 都是常量池中的符号,还没有变成Java字符串对象

当编译过后运行到对应的行数 会执行

  • ldc #2 将 a 符号变成 “a” 字符串对象

  • ldc #3 将 b 符号变成 “b” 字符串对象

  • ldc #4 将 ab 符号变成 “ab” 字符串对象

执行第一句后会去串池中比较,如果找到了,就把串池中的value赋给这个String对象,如果找不到信息,就把 “a” 字符串对象放进池中

附加:StringTable是一个hashtable结构,不能扩容

2. 字符串拼接

String s4=s1+s2;

编译之后在jvm中的拼接过程

new String = new StringBuilder().append(s1).append(s2).toString 
  • 面试题:以上述条件为基础 s4==s3 的结果是什么

    • 答案:false

    • 原因:s3声明并赋值后存储在串池中,而从s4的运行结果来看最后调用了toString方法,查看toString方法,会发现它使用new关键字创建了新的String对象,是存储在堆内存中的,他们两个并不是一个对象,这也是证明了字符串的比较不能使用 == 而要使用equals方法,

    • 详细内容可以参考本人的另一篇文章hashcode重写必要性:直观方式理解重写hashcode的必要性-CSDN博客

  • 理解性延展

    String s1="a";
    String s2="a";

    这里s1==s2的结果为true,因为这里操作的是串池,再次声明 "a"对象会直接去串池寻找,找到了直接返回,是同一个字符串对象

    String s1="a";
    String s2="a";
    String s3=s1+s2;
    String s4=s1+s2;

    这里s3==s4的结果为false,依照上面的内容,s3与s4都会分别new一个新的String对象,在堆内存指向两个不同的对象,只是他们作为字符串展示出来的结果一致而已

3. 编译期优化

String s1="ab";
String s2="a"+"b";
System.out.println(s1==s2)

上述代码运行结果为true

Javac在编译期的优化,由于"a"和"b"都是常量,结果在编译器就已经确定为"ab" 但是上一个字符串拼接的内容是变量相加,所以不会优化

4. intern方法

//a存放在串池中
String a="ab"
//堆中分别new了两个对象 "a" "b" 拼接后返回一个String对象 "ab" 所以变量b是存储在堆中的
String b=new String("a")+new String("b")
//尝试将b放入串池,如果有则不放入,直接返回串池中的对象,这里放入失败,b仍然在堆中,返回的是串池中的对象,本质上和a是一个对象
String s= b.intern();
    System.out.println(a==b);
    System.out.println(b==s);

上述代码的结果为 false true

过程分析:①串池中放入一个 "ab" 对象 ,②堆中new了一个由 "a" "b" 拼接的对象 ③尝试将b放入串池,发现串池中已经存在"ab"对象,直接返回给s

误区分析:变量b 如果没有inern成功的话,仅仅是一个存放在堆中的对象,如果调用intern方法之后,发现串池中没有这个字符串对象,那么就会把 b 所引用的堆中的对象放入串池然后返回,所以没有a变量的情况下 b是存放在堆中的,如果有a变量,则b从堆中移动到串池中

扩展:jdk1.6之前 如上代码调用intern的时候,是把b复制一份放入串池,也就是说无论如何b都是一个存放在堆中的对象

标签:ab,Java,String,对象,s2,s1,面试,串池
From: https://blog.csdn.net/weixin_68693132/article/details/140486010

相关文章

  • Java核心API——Object类
    Object简介         Object类是所有类的根类,这意味着在Java中创建的每一个类都直接或间接地继承自Object类(除了Object类本身以外,因为它没有父类)    看到这里你或许还是不明为什么要有Object类下面我就详细解释。首先这里就不得不提到Java这门语言让人熟......
  • Java——IO流
    1.IO流简介流是一个抽象的概念,它是一串连续动态的数据集合Java.io包中几乎包含了所有操作输入和输出需要的类,同时也支持很多格式,比如:基本类型,对象,本地化字符等io包中主要包括四大抽象类,分别是Writer,OutputStream,InputStream,Reader,其中Writer和OutputStream属于......
  • 常用的 JavaScript 数组处理方法
    1.map方法用于创建一个新数组,其结果是该数组中的每个元素调用一个提供的函数后返回的结果。letitems=[{id:1,name:'item1'},{id:2,name:'item2'},{id:3,name:'item3'}];letitemNames=items.map(item=>item.name);console.log(itemNames);......
  • Java语言基础-03
    1.Scanner接收用户输入的数据:packageday04;importjava.util.Scanner;//1.导入一个扫描仪//Scanner的演示publicclassScannerDemo{publicstaticvoidmain(String[]args){//创建类CommandBySwitch,接收用户输入的命令command(int),并输出......
  • 甲骨文面试题【动态规划】力扣377.组合总和IV
    给你一个由不同整数组成的数组nums,和一个目标整数target。请你从nums中找出并返回总和为target的元素组合的个数。题目数据保证答案符合32位整数范围。示例1:输入:nums=[1,2,3],target=4输出:7解释:所有可能的组合为:(1,1,1,1)(1,1,2)(1,2,1)......
  • 【java计算机毕设】网上购书管理系统MySQL servlet JSP项目设计源代码 期末寒暑假作业
    目录1项目功能2项目介绍3项目地址1项目功能【java计算机毕设】网上购书管理系统MySQLservletJSP项目设计源代码期末寒暑假作业小组作业 2项目介绍系统功能:servlet网上购书管理系统包括管理员、用户两种角色。管理员功能包括订单管理(已处理,未处理),顾客管理(添......
  • Javascript: Blob, File/FileReader, ArrayBuffer, ReadableStream, Response 转换方
    目录先上图各个ObjectArrayBuffer:Blob:File:FileReader:ReadableStream:Response用法举例ArrayBufferBlob,File,FileReaderReadableStream关于ReadableStream的一点总结Response构造函数Parametersblob()先上图各个ObjectArrayBuffer:1.ArrayBuffer是JavaScript......
  • 前端JS箭头函数和普通函数的区别全解 面试必问
    基本语法:普通函数functionfunctionfc(a1,b2,...,pnan){sumnews;}即格式为:funtion 函数名(参数列表) {    语句;    return表达式}2.箭头函数 //当只有一个参数时,圆括号是可选的(singleParam)=>{statements}singleParam=>{......
  • JAVA操作Excel使用poi和easyexcel依赖的兼容性问题
      EasyExcel版本3.1.0及以上支持poi5.2.3。具体来说,EasyExcel3.1.0及之后的版本兼容poi4.1.2至5.2.2的范围,因此它确实支持poi5.2.3。但请注意,使用3.0.0及以上版本的EasyExcel配合poi5+时,需要手动在项目的依赖管理中排除poi-ooxml-schemas依赖,示例如下:<dependency>......
  • 基础知识(JAVA入门)
    常用的CMD命令盘符名称+冒号说明:盘符切换dir说明:查看当前路径下的内容cd说明:进入单级目录cd..说明:回退到上一级目录cd目录1\目录2....说明:进入多级目录cls说明:清屏exit说明:退出命令提示符窗口环境变量我们想要在任意的目录下都可以打开指定的软件。就可以把软件的路......