`
苹果超人
  • 浏览: 198253 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

String面试题

    博客分类:
  • java
 
阅读更多
字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改

String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一个pool里的对象.



1 看下面一段代码.

String s = new String("abc");
  String s1 = "abc";
  String s2 = new String("abc");
 
  System.out.println(s == s1);
  System.out.println(s == s2);
  System.out.println(s1 == s2);



请问 前面三条语句分别创建了几个对象,分别是什么.后面的输出分别是什么



(1)String s = new String("abc"); 这句,创建了两个对象..其内容都是"abc".注意,s不是对象,只是引用.只有new生成的才是对象.

创建的流程是,首先括号里的"abc"先到String pool里看有没"abc"这个对象,没有则在pool里创建这个对象..所以这里就在pool创建了一个"abc"对象.然后 通过new语句又创建了一个"abc"对象..而这个对象是放在内存的堆里. .这里的s指向堆里的对象.



(2) String s1 = "abc"; 这条语句,s1当然还是引用.没啥可说的.后面的"abc".其实就是上面括号里的"abc".执行的是相同的操作.即 在pool里查找有没"abc"这个对象.没有则创建一个...很显然,第一条语句在pool里已经创建了一个"abc".所以这条语句没有创建对象,s1指向的是pool中的"abc"



(3)String s2 = new String("abc"); 这条语句,其实和第一条是一样的,但是,因为第一条已经在pool中创建了"abc"这个对象,所以,这条语句创建了一个对象.s2指向的是堆里的"abc".注意,虽然内容都是"abc",s与s2表示的是不同的对象



(4)接下来就很好说了.下面的三个==判断.(注意,==永远是判断内存地址是否相等) s与s1,一个指向堆里的对象,一个指向pool里的.很明显是不同的对象.s与s2.上面说了,虽然都是指向堆里的对象,内容也是"abc",但是也不是相同的对象.s1与s2.一个指向pool,一个指向堆.也不是相同的对象.所以三个都返回false.



2 第二个问题



String s = new String("abc");
  String s1 = "abc";
  String s2 = new String("abc");
 
  System.out.println(s == s1.intern());
  System.out.println(s == s2.intern());
  System.out.println(s1 == s2.intern());



求最后输出是什么

解答.最后的答案是 false false true

intern()方法.按照jdk的帮助文档来说,是返回字符串对象的规范化表示形式。通俗一点说,就是返回对应这个字符串内容的那个pool里的对象.这样说也许还看不太明白,那可以拿具体例子来说



s1.intern().他的执行流程是,在pool里去查找s1对应的内容(也就是"abc").如果找到,则返回pool里的对象.如果没有(老实说,我没想到有哪种情况是没有的),则在Pool创建这个对象,并返回...



这样就很容易理解了.s1.intern返回的是pool里的"abc"对象.与s这个堆里的对象肯定不同,返回false.同理,s与s2.intern()也肯定不同,返回false.第三个,s1与s2.intern().其中s2.intern()返回的是pool中的"abc"对象,而s1也是指向pool中的"abc"对象.所以返回的是true:



3第三个问题

String hello = "hello";
  String hel = "hel";
  String lo = "lo";
 
  System.out.println(hello == "hel" + "lo");
  System.out.println(hello == "hel" + lo);



求输出的结果



解答 true false



首先,上面已经说明了,hello hel lo这三个都是指向pool中的对象..

现在我们考虑"hel" + "lo" 按照内容来说,两个相加也就是"hello".这个时候,这个会返回pool中的"hello"对象.所以,hello == "hel" + "lo" 返回的是true .

而"hel" + lo 虽然内容也是"hello",但是它将在堆里面生成一个"hello"对象,并返回这个对象...所以这里的结果是false



总结一下就是,如果加号两边的是字面值(字面值就是直接在""里写的值,比如上面的"hel"与"lo"),那么将在pool里查找有没对应内容的对象(这里的内容就是"hello"),并返回pool里的对象.这和hello是一样的....

如果加号两边不满足上面的条件(比如,两边的值是引用值或者堆里的字符串对象).那么将不会再pool里查找"hello",而是直接在堆里生成一个新的对象...
分享到:
评论

相关推荐

    10个Java经典的String面试题

    下面我们将对 10 个 Java 经典的 String 面试题进行详细解答。 1. String 是基本数据类型吗? 答案:String 不是基本数据类型。Java 中的基本数据类型有八种:byte、short、int、long、float、double、boolean 和 ...

    10个Java经典的String面试题!.zip

    下面将详细讲解这10个经典的Java String面试题,帮助你深入理解String的本质和使用技巧。 1. **String是否可变?** Java中的String对象是不可变的,意味着一旦创建,其内容就不能更改。这是因为String对象在Java中...

    10个Java经典的String面试题!.pdf

    以下是对这十个经典Java String面试题的详细解答: 1. **String是基本数据类型吗?** Java的String并不是基本数据类型,而是引用类型。Java有8种基本数据类型,如int、char等,而String属于类,它继承了Object类。...

    史上最全Java面试题目大集合

    整理了网上的一些java面试题目,很全很强大 面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面。抽象并不5. 打算了解全部问题...

    最全面的Java面试题

    九、String面试题 String是Java中特殊的类,其不可变性、字符串连接效率、常量池等特性常常是面试的重点。 以上内容覆盖了Java面试的多个方面,对于每个主题深入理解并能灵活应用,将极大地提升你在面试中的竞争力...

    Java全能学习面试手册——Java架构师进阶资料面试资料.zip

    06 10个Java经典的String面试题!.pdf 07 15道经典的Tomcat面试题!.pdf 08 15道面试常问的Java多线程面试题!.pdf 09 17道消息队列Kafka面试题!.pdf 10 18道非常牛逼的Nginx面试题!.pdf 11 20道顶尖的Spring Boot...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题08.String.mp4 │ Java面试题09.讲一下java中的集合.mp4 │ Java面试题10.ArrayList LinkedList.mp4 │ Java面试题11.HashMap和HashTable的区别.mp4 │ Java面试题12.实现一个拷贝文件的类使用字节流...

    Java常用类String的面试题汇总(java面试题)

    在Java编程语言中,String是一个非常重要...以上是针对Java中String类常见面试题的知识点总结。在面试中,回答这类问题时要注意准确、完整,并且结合Java类库的特点来举例说明,以显示出你对Java语言和类库的深入理解。

    Java全能学习面试手册——Java面试题库.zip

    06 10个Java经典的String面试题!.pdf 07 15道经典的Tomcat面试题!.pdf 08 15道面试常问的Java多线程面试题!.pdf 09 17道消息队列Kafka面试题!.pdf 10 18道非常牛逼的Nginx面试题!.pdf 11 20道顶尖的Spring Boot...

    java面试题集锦 java面试题集锦

    以下是对标题和描述中涉及的一些常见Java面试题的详细解释: 1. **JDK 和 JRE 的区别** JDK(Java Development Kit)是用于开发和调试Java程序的完整工具集,包括JRE(Java Runtime Environment)、编译器(javac...

    2019互联网面试题第2季,互联网面试题及答案,Java

    "2019互联网面试题第2季"聚焦了这一年度的重要面试趋势和热门问题,旨在帮助求职者更好地准备并理解面试官可能提出的各种问题。这份资料可能包含一系列的面试题目、解答以及相关思维导图,帮助求职者系统地梳理和...

    C++面试题集.pdf

    面试题:编写类String的构造函数、析构函数和赋值函数。 答案:使用C++的构造函数、析构函数和赋值函数机制实现String类的构造、析构和赋值操作。 循环 面试题:编写一个循环程序。 答案:使用C++的循环语句,...

    java程序员面试题——863面试集

    ### Java程序员面试题详解 #### 一、Java基础知识 1. **作用域public, private, protected, 以及不写时的区别** - **public**: 可以被任何类访问。 - **protected**: 可以被同一包内及不同包内的子类访问。 - ...

    计算机和JAVA 面试题大全

    【计算机和JAVA 面试题大全】 在计算机科学与技术领域,尤其是软件开发行业,Java是一种广泛应用的编程语言,以其跨平台、面向对象和高效性而受到赞誉。本资料集涵盖了丰富的Java面试题,旨在帮助求职者准备Java...

    c#笔试面试题 c#笔试面试题

    1. 变量与数据类型:理解C#中的基本数据类型(如int、string、bool等)以及引用类型,了解变量声明和初始化的规则。 2. 控制流:包括if-else、switch、for、while、do-while循环以及break和continue语句的使用。 3. ...

    Java17道面试题及答案

    Java 面试题及答案 Java 是一种广泛使用的编程语言,Java 面试中常见的问题有很多,今天我们来讨论 JDK 和 JRE 的区别、==和 equals 的区别等问题。 JDK 和 JRE 的区别 JDK(Java Development Kit)是 Java 开发...

    java经典面试题

    ### Java经典面试题知识点 #### Java数据结构容器 - **核心知识点**:Java集合框架,包括List、Set、Map等接口及其实现类。List接口代表有序的集合,例如ArrayList和LinkedList;Set接口代表不允许重复元素的集合,...

    c# winform面试题

    "C# Winform 面试题详解" C# Winform 面试题详解 1. foreach 遍历访问的对象需要实现 IEnumerable 接口或声明 GetEnumerator 方法的类型 在 C# 中,foreach 语句可以遍历实现了 IEnumerable 接口或声明了 ...

Global site tag (gtag.js) - Google Analytics