string类面试题_实现一个string类 面试题 - CSDN
精华内容
参与话题
  • 下面六道题目,如果您全部做对了,且明白其所以然,那么Java中的关于String的笔试面试题应该难不到你了。也许您觉得polaris说的有点过了,然而彻底明白这些题目,对理解String类还是很有好处的。 写出下面各题的...
     
    

        Java中String类由于其特殊性(不变类),几乎是笔试面试中的必考题,当然有些题目其实没啥意思,不过关键是要通过题目掌握原理性的东西。下面六道题目,如果您全部做对了,且明白其所以然,那么Java中的关于String的笔试面试题应该难不到你了。也许您觉得polaris说的有点过了,然而彻底明白这些题目,对理解String类还是很有好处的。

    写出下面各题的打印输出的结果:

    1 

      

    Java代码 复制代码 收藏代码
    1. public static void main(String[] args) {   
    2.         String a = "a1";   
    3.         String b = "a" + 1;   
    4.         System.out.println(a == b);   
    5.     }  
    public static void main(String[] args) {
    		String a = "a1";
    		String b = "a" + 1;
    		System.out.println(a == b);
    	}

     

     

     

     

    2

     

    Java代码 复制代码 收藏代码
    1. public static void main(String[] args) {   
    2.         String a = "ab";   
    3.         String bb = "b";   
    4.         String b = "a" + bb;   
    5.         System.out.println(a == b);   
    6.     }  
    public static void main(String[] args) {
    		String a = "ab";
    		String bb = "b";
    		String b = "a" + bb;
    		System.out.println(a == b);
    	}

     

    3

     

    Java代码 复制代码 收藏代码
    1. public static void main(String[] args) {   
    2.         String a = "ab";   
    3.         final String bb = "b";   
    4.         String b = "a" + bb;   
    5.         System.out.println(a == b);   
    6.     }  
    public static void main(String[] args) {
    		String a = "ab";
    		final String bb = "b";
    		String b = "a" + bb;
    		System.out.println(a == b);
    	}
    

     

    4

     

    Java代码 复制代码 收藏代码
    1. public static void main(String[] args) {   
    2.         String a = "ab";   
    3.         final String bb = getBB();   
    4.         String b = "a" + bb;   
    5.         System.out.println(a == b);   
    6.     }   
    7.   
    8.     private static String getBB() {   
    9.         return "b";   
    10.     }  
    public static void main(String[] args) {
    		String a = "ab";
    		final String bb = getBB();
    		String b = "a" + bb;
    		System.out.println(a == b);
    	}
    
    	private static String getBB() {
    		return "b";
    	}

     

    5

     

    Java代码 复制代码 收藏代码
    1. private static String a = "ab";   
    2.   
    3. public static void main(String[] args) {   
    4.     String s1 = "a";   
    5.     String s2 = "b";   
    6.     String s = s1 + s2;   
    7.     System.out.println(s == a);   
    8.     System.out.println(s.intern() == a);   
    9. }  
    	private static String a = "ab";
    
    	public static void main(String[] args) {
    		String s1 = "a";
    		String s2 = "b";
    		String s = s1 + s2;
    		System.out.println(s == a);
    		System.out.println(s.intern() == a);
    	}

     

    6

     

    Java代码 复制代码 收藏代码
    1. private static String a = new String("ab");   
    2.   
    3.     public static void main(String[] args) {   
    4.         String s1 = "a";   
    5.         String s2 = "b";   
    6.         String s = s1 + s2;   
    7.         System.out.println(s == a);   
    8.         System.out.println(s.intern() == a);   
    9.         System.out.println(s.intern() == a.intern());   
    10.     }  
    private static String a = new String("ab");
    
    	public static void main(String[] args) {
    		String s1 = "a";
    		String s2 = "b";
    		String s = s1 + s2;
    		System.out.println(s == a);
    		System.out.println(s.intern() == a);
    		System.out.println(s.intern() == a.intern());
    	}
    

     

     

    (1)通过java源码分析String

        我们都知道String是不可变的(immutable),不变性的体现是:String类内部通过char数组来保存字符串,而这个char数组被声明为:final。那么为什么要将String类声明为不可变呢?了解设计模式的你应该知道有一种模式叫做“不变模式”(immutable pattern),String类的设计就是使用了不变模式,有兴趣的朋友可以看看“不变模式”讲的具体是啥东东。

        说完String的不可变性,需要说说String的“final性”(其实也还是不可变性决定的)。这也是有些面试官会问到的问题:我能不能写一个类继承自String?为什么?我们来看看String类的声明:

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence

     

     

     

    
    

     

        对于final关键字的作用不用多解释了。其实这也是“强不变模式”的一种要求(类本身声明为final或所有方法声明为final)。

    (2)理解String对象的存储机制

        要深入理解String必须先了解Java内存机制——运行时数据区(Runtime Data Area)。《The JavaTM Virtual Machine Specification》中将运行时数据区分为六部分(参看第三章): 1)The pc Register;2)Java Virtual Machine Stacks;3)Heap;4)Method Area;5)Runtime Constant Pool;6)Native Method Stacks;     以上数据区的具体描述可参考规范。需要注意的是,以上只是一个规范说明,并没有规定虚拟机如何实现这些数据区。

    在说明String对象存储机制之前,我们需要先了解数据区的三个部分:Java 虚拟机栈(可以简称为Java栈)、堆和运行时常量池(简称常量池)。对于Java栈和堆大家应该比较熟悉,这里有一个关键点是常量池,下面就重点介绍一下与String相关的常量池。

        首先大概描述一下什么是常量池:

     

    虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用常量的一个有序集合,包括直接常量(string,integer和floating point常量)和对其他类型、字段和方法的符号引用。池中的数据项就像数组一样是通过索引访问的。因为常量池存储了相应类型所用到的所有类型、字段和方法的符号引用,所以它在Java程序的动态链接中起着核心的作用。

    <1> String相关常量池

        在《The JavaTM Virtual Machine Specification》第四章有一节是专门讲解各种常量池的,其中有两个常量池是关于String的。

        1)The CONSTANT_String_info Structure

        对于常量池的细节此文不做过多介绍,polaris以后可能会写一序列关于Java虚拟机的文章。现在您可以查阅规范或在网上收集相关资料阅读。规范上对该常量池结构的介绍是: The CONSTANT_String_info structure is used to represent constant objects of the type String. 在该常量池结构中引用了另一个常量池结构,如2)

        2)The CONSTANT_Utf8_info Structure

        规范上的描述是:The CONSTANT_Utf8_info structure is used to represent constant string values.

    根据上面的介绍可以看出,字符串字面值会存储在常量池中。下面来分析String对象的存储机制。

    <2> String对象的存储

        请看这样两个语句:

    String x = "abc"; String y = new String("abcd");

     

     

     

    
    

     现在来分析一下内存的分配情况。如图:

        可以看出,x与y存在栈中,它们保存了相应对象的引用。第一条语句没有在堆中分配内存,而是将“abc”保存在常量池中。对于第二条语句,同样会在常量池中有一个“abcd”的字符串,当new时,会拷贝一份该字符串存放到堆中,于是y指向了堆中的那个“abcd”字符串。不知道polaris有没有讲明白。如果您明白了,那么做前面那六道题就没什么问题了。

     

    3、六道题答案详解

    1)true

        要说明一点:当两个字符串字面值连接时(相加),得到的新字符串依然是字符串字面值,保存在常量池中。

    2)false

        当字符串字面值与String类型变量连接时,得到的新字符串不再保存在常量池中,而是在堆中新建一个String对象来存放。很明显常量池中要求的存放的是常量,有String类型变量当然不能存在常量池中了。

     3)true

        注意此题与上一题的区别,此处是字符串字面值与String类型常量连接,得到的新字符串依然保存在常量池中。

    4)false

        此题中第条语句:final String bb = getBB();其实与final String bb = new String(“b”);是一样的。也就是说return “b”会在堆中创建一个String对象保存”b”,虽然bb被定义成了final。可见并非定义为final的就保存在常量池中,很明显此处bb常量引用的String对象保存在堆中,因为getBB()得到的String已经保存在堆中了,final的String引用并不会改变String已经保存在堆中这个事实。

    5)false,true

        可能很多人对intern()这个函数不了解。JDK API文档中对intern()方法的描述是:

        返回字符串对象的规范化表示形式。
        一个初始为空的字符串池,它由类 String 私有地维护。

        当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

        它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

        所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。

    上面字符串池即为字符串常量池。明白该题结果的原因了吧。

    6)false,false,true

     

    http://jefferent.iteye.com/blog/1127799

    第五题看明白后,第六题就没什么好讲的了。

    展开全文
  • (一)请解释String类 == 与 equals 的区别 (二)请解释String类中两种对象实例化的区别 (一)请解释String类 == 与 equals 的区别 ”==”:进行的数值比较,比较的是两个字符串对象的内存地址数值。 “equals...

    (一)请解释String类 == 与 equals 的区别

    (二)请解释String类中两种对象实例化的区别

    (一)请解释String类 == 与 equals 的区别

    1. ”==”:进行的数值比较,比较的是两个字符串对象的内存地址数值。
    2. “equals()”:可以进行字符串内容的比较 。
    3. 基本数据类型比较使用 ==;
      引用数据类型比较使用 equals

    (二)请解释String类中两种对象实例化的区别

    1. 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
    2. 构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用 intern()方法手工入池。
    展开全文
  • 第一: package com.xian.fang; public class Demo4_String { public static void main(String[] args) { String s1 = "abc"; //常量池中没有这个字符串对象,就创建一个,如果有直接用就可 ...

    第一题:

    package com.xian.fang;
    
    public class Demo4_String {
    
    	public static void main(String[] args) {
    		
    		String s1 = "abc";								//常量池中没有这个字符串对象,就创建一个,如果有直接用就可
    		String s2 = "abc";
    		
    		System.out.println(s1 == s2);					//true,比较两个引用数据类型的地址值
    		
    		System.out.println(s1.equals(s2));				//true,相同字符串则为真
    	}
    
    }
    
    

    内存图解释如下:
    在这里插入图片描述
    字符串在常量池中创建,如果没有就创建,如果有就不用创建了,返回的地址值是相同的,所以s1 == s2 是正确的

    第二题:

    2.下面的程序创建了多少个对象? (两个)

    public static void main(String[] args)
    {
        String s1=new String("abc");
    }
    

    解释如下:
    在这里插入图片描述
    1.main方法进栈,String s1进栈
    2.对于"abc",首先到常量池找"abc",如果没有就创建,
    3.对于new String,在 堆里面创建一个对象,有着自己的地址值,然后把常量池里面的"abc"拷贝一份副本交给堆里里面的对象,
    4.然后堆里面的对象将地址值传给s1,s1通过地址值就找到了这个实体

    第三题:

    3.下面程序段的执行结果是?(D)

    public static void main(String[] args)
    {
        String s1=new String("abc");
        String s2="abc";
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
    }
    
    A. true true          B.true false     C.false false     D.false true
    
    

    解释:s1是对内存地址值,s2是常量池地址值

    第四题:

    4.下面程序执行的结果是?(A)

    public static void main(String[] args)
    {
        String s1="a"+"b"+"c";
        String s2="abc";
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
    }
    
    A. true true          B.true false     C.false false     D.false true
    

    解释:Java有常量优化机制,在编译时就变成abc了

    第五题:

    4.下面程序执行的结果是?(A)

    5.下面程序的执行结果是?(D)
    
    public static void main(String[] args)
    {
        String s1="ab";
        String s2="abc";
        String s3=s1+"c";
        System.out.println(s3==s2);
        System.out.println(s3.equals(s2));
    }
    
    A. true true          B.true false     C.false false     D.false true
    
    

    解释:
    1.常量池创建s1,s2,并给定地址值
    2.调用StringBuffer,在堆内存生成对象,再调用toString转换成String,最后把地址值赋值给s3

    在这里插入图片描述

    展开全文
  • String类相关面试题总结一、判断String类型的s1和s2是否相等 String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2);  //true System.out.println(s1.equals(s2)); //...

    String类相关面试题总结

    一、判断String类型的s1和s2是否相等        

            String s1 = "abc";
            String s2 = "abc";
            System.out.println(s1 == s2);   //true

            System.out.println(s1.equals(s2)); //true

            原因:常量池中如果没有这个字符串对象就创建一个,如果有就总结用。


    二、下面这句话创建了几个对象

                 String s1 = new String("abc"); //创建了两个对象,一个在常量池中,一个在堆内存中

                

    三、判断定义为String类型的s1和s2是否相等

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

                 System.out.println(s1.equals(s2));   //true

                 原因:s1记录的是堆内存中对象的地址,s2记录的是常量池中的地址

    四、判断定义为String类型的s1和s1是否相等

                 String s1 = "a" + "b" + "c";
                 String s2 = "abc";
                 System.out.println(s1 == s2);        //true
                 System.out.println(s1.equals(s2));   //true

                 原因:java中有常量优化机制,编译时就把 "a" + "b" + "c"变成“abc”赋值给s1

    五、判断定义为String类型的s1和s2是否相等

                 String s1 = "ab";
                 String s2 = "abc";
                 String s3 = s1 + "c";
                 System.out.println(s3 == s2);            //false
                 System.out.println(s3.equals(s2));       //true

            原因:




    展开全文
  • String类的常见面试题

    2018-11-18 17:11:29
    String类的常见面试题 package com.heima.string; public class Demo03_String { /** * * 1.判断定义为String类型的s1和s2是否相等 * String s1 = &amp;quot;abc&amp;quot;; * String s2 =...
  • 这篇来看看关于Java String类的5道面试题,这五道题,我自己在面试过程中亲身经历过几道题目,学完了这篇,我才焕然大悟,才知道为什么是这个答案,本篇就带你了解这些题的答案为什么是这样。 1.判定定义为String...
  • String类常见面试题

    千次阅读 2019-05-17 19:45:12
    答案解释:String类代表字符串,字符串是常量,常量需要进入到内存中的方法区的常量池(进入常量池规则:如果常量池中没有这个常量,就创建一个,如果有就不再创建了)。所以s1首先会在常量池中创建“abc”对象,“abc...
  • 有关于 String 面试题

    千次阅读 2019-07-05 10:17:40
    上次写了关于 String 的一些方法今天我们来做一些关于 String 面试题关于 String类 的常见面试题1)判断String类型的 s1 和 s2 是否相...
  • java String类常见面试题

    千次阅读 2018-07-26 10:31:05
    equals只能比较引用数据类型,如果没有重写Object中的equals方法,equals方法和==号比较引用数据类型无区别 ,重写后的equals方法比较的是对象中的属性。 2.字符串常量存储在常量池,而new String 创建对象,在...
  • 面试题String、StringBuffer、StringBuilder的区别与联系

    千次阅读 多人点赞 2018-10-07 23:03:52
    String类: 字符串:就是由多个字符组成的一串数据,也可以看成是一个字符数组,通过查看API可知: (1)字符串字面值(如:“abc”)可以看成是一个字符串对象; (2)字符串是常量,一旦被赋值就不能被改变,这...
  • Java 几道常见String面试题

    万次阅读 多人点赞 2017-05-26 11:36:42
    本篇谈谈几个常见的java关于 String面试题。 (1)String s1="abc"; String s2="abc"; System.out.println(s1==s2); System.out.println(s1.equals(s2)); /*output: true true */本题主要考察对于java常量池的...
  • 1、List集合:ArrayList、LinkedList、Vector等。 2、Vector是List接口下线程安全的集合。 3、List是有序的。 4、ArrayList和LinkedList数据结构不一样,前者用在查询较多的场合,后者适用于插入较多的场合。...
  • String字符串处理常见的面试题总结

    千次阅读 2017-12-05 22:01:51
    它包括了关于,方法,接口等中的常量,也包括字符串常量,如String s = “str”这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。问题一: String是最基本...
  • 前言本套Java面试题大全总共分为以下这十三个模块:Java基础知识面试题Java异常面试题JVM面试题Spring面试题Spring MVC面试题Spring Boot面试题Sprin...
  • Java 最常见的 208 道面试题(含答案)之一

    千次阅读 多人点赞 2019-11-22 21:31:40
    Java 最常见的 208 道面试题(含答案)之二 Java 最常见的 208 道面试题(含答案)之三 Java 最常见的 208 道面试题(含答案)之四 Java 最常见的 208 道面试题(含答案)之五 Java 最常见的 208 道面试题(含答案)之六 ...
  • [面试题]-String为什么不可变

    千次阅读 2019-05-03 19:10:22
    String类被final修饰,不可被继承。 String的成员变量char数组value被final修饰,初始化后不可更改引用。 String的成员变量value访问修饰符为private,不对外界提供修改value数组值的方法。 String类源码 public ...
  • 实现一个自己的String类是一道考验C++基础知识的好。 至少要能实现以下:构造函数,析构函数,拷贝构造函数(copy constructor),重载赋值操作符(copy assignment operator)。 首先是至少能够准确的写出这几个函数...
  • http://coolshell.cn/articles/10478.html先说说程序员(应届生)面试的一般过程,一轮面试(面对一到两个面试官)一般是四、五十分钟,面试官会问两三个编程问题(通常是两大一小),因此留给每个编程的时间只有 ...
  • Socket知识点总结-相关面试题(Java)

    万次阅读 2020-05-18 11:04:10
    相关面试题 面试题一 编写一个网络应用程序,有客户端与服务器端,客户端向服务器发送一个字符串,服务器收到该字符串后将其打印到命令行上,然后向客户端返回该字符串的长度,最后,客户端输出服务器端返回的该字符...
  • 华为经典C语言面试题(一)

    千次阅读 2017-01-02 20:44:07
    1、找错  void test1() {  char string[10];  char* str1="0123456789";... strcpy(string, str1);... 这里string数组越界,因为字符串长度为10,还有一个结束符‘\0’。...string数组大小为
1 2 3 4 5 ... 20
收藏数 136,010
精华内容 54,404
关键字:

string类面试题