`
zhangwei_david
  • 浏览: 469616 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java面试题之 String

    博客分类:
  • Java
阅读更多

        有这样一个面试题:

    

String a = "a";
		String a1 = new String("a");
		String a2 = a1.trim() + "";
		String a3 = "a" + "";
		String a4 = "a".trim() + "";
		System.out.println(a == a1);
		System.out.println(a.intern() == a1.intern());
		System.out.println(a2 == a1);
		System.out.println(a3 == a);
		System.out.println(a4 == a);

 请问结果是什么?

 

运行后的结果是:

 

false
true
false
true
false

 为什么结果是这样呢?这需要从String 本身说起。

Java在运行时会维护一个字符串常量池String Pool; 在String a="a"; 首先检查字符串常量池中是否有"a",如果有则直接返回,否则在常量池中创建一个新的;

     String a1=new String("a"); 使用new 关键字创建的对象一定在堆栈中,同样也会维护字符串常量池,因为字符串常量池中已经存在了,则不会添加新的。在JAVA中==永远都是比较两个内存地址是否相同,这样因为a和a1不是同一个对象则已定返回false;

   intern()方法时返回字符串常量池中的对象,因为常量池中只存在一个“a” 则两者已定相等;

   a2.trim()+"" 则是在堆栈中创建了一个新对象,同时维护常量池;则该表达式返回false 但是字符串常量的拼接仅仅维护常量池不会在堆栈中创建新对象则"a"+""还是常量池中的“a”;

 

为了更直观了解我们可以看一下这段代码的字节码,通过字节码可能更有说服力。

  LDC是将常量推送到栈顶,ASTORE 是将栈顶元素赋值给本地变量。

iinvokespecial 调用实例初始化方法,父类实例化方法,私有方法

iinvokevirtual虚方法

通过字节码可以发现 a是常量指向的地址是#2,a1是通过常量“a"new出来的地址是,a2也是new出来的,a3还是常量“a" #2,a4也是new出来的

 

 

public class core.demo.StringTest {
  public core.demo.StringTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String a
       2: astore_1
       3: new           #3                  // class java/lang/String
       6: dup
       7: ldc           #2                  // String a
       9: invokespecial #4                  // Method java/lang/String."<init>":(Ljava/lang/String;)V
      12: astore_2
      13: new           #5                  // class java/lang/StringBuilder
      16: dup
      17: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
      20: aload_2
      21: invokevirtual #7                  // Method java/lang/String.trim:()Ljava/lang/String;
      24: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      27: ldc           #9                  // String
      29: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      32: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      35: astore_3
      36: ldc           #2                  // String a
      38: astore        4
      40: new           #5                  // class java/lang/StringBuilder
      43: dup
      44: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
      47: ldc           #2                  // String a
      49: invokevirtual #7                  // Method java/lang/String.trim:()Ljava/lang/String;
      52: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      55: ldc           #9                  // String
      57: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      60: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      63: astore        5
      65: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
      68: aload_1
      69: aload_2
      70: if_acmpne     77
      73: iconst_1
      74: goto          78
      77: iconst_0
      78: invokevirtual #12                 // Method java/io/PrintStream.println:(Z)V
      81: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
      84: aload_1
      85: invokevirtual #13                 // Method java/lang/String.intern:()Ljava/lang/String;
      88: aload_2
      89: invokevirtual #13                 // Method java/lang/String.intern:()Ljava/lang/String;
      92: if_acmpne     99
      95: iconst_1
      96: goto          100
      99: iconst_0
     100: invokevirtual #12                 // Method java/io/PrintStream.println:(Z)V
     103: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
     106: aload_3
     107: aload_2
     108: if_acmpne     115
     111: iconst_1
     112: goto          116
     115: iconst_0
     116: invokevirtual #12                 // Method java/io/PrintStream.println:(Z)V
     119: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
     122: aload         4
     124: aload_1
     125: if_acmpne     132
     128: iconst_1
     129: goto          133
     132: iconst_0
     133: invokevirtual #12                 // Method java/io/PrintStream.println:(Z)V
     136: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
     139: aload         5
     141: aload_1
     142: if_acmpne     149
     145: iconst_1
     146: goto          150
     149: iconst_0
     150: invokevirtual #12                 // Method java/io/PrintStream.println:(Z)V
     153: return
}

 

 

 

 

 

 

 

 

0
1
分享到:
评论
1 楼 wst0350 2016-03-01  

相关推荐

    最新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 和StringBuffer的区别

    java面试笔试题String 和StringBuffer的区别

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

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

    java笔试题大汇总

    最常用java笔试题,n多年都在用. 1、面向对象的特征有哪些方面 1.抽象: 2.继承: 3.封装: 4. 多态性: 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short...

    JAVA面试题解惑系列合集

    1.2 JAVA面试题解惑系列(二)——到底创建了几个String对象? 1.3 JAVA面试题解惑系列(三)——变量(属性)的覆盖 1.4 JAVA面试题解惑系列(四)——final、finally和finalize的区别 1.5 JAVA面试题解惑系列(五...

    java面试大全视频版

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

    Java面试题08.String.mp4

    Java面试题08.String.mp4

    【Java面试题】对String常量池的理解

    【Java面试题】对String常量池的理解

    java面试笔试题集合

    java面试笔试题集合4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2...

    企业java面试题(笔试+面试)

    HP笔试题 (时间30分钟,顺序有出入,答案仅供参考) 以下为问答题,每题3分 1. Java的基本类型 boolean,char,byte,short,int,long,float,double 2. String 和StringBuffer的区别 JAVA平台提供了两个类:String和...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

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

    java 面试题 资料

    java 面试题 资料 包括 面向对象的特征、String 和StringBuffer的区别、ArrayList,Vector, LinkedList的存储性能和特性、SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别等等

    java面试笔试题大汇总

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    JAVA面试题最全集

    1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出...

    Java面试题总览

    JAVA面试题总览, 包含如下: 1. JAVA中的几种基本数据类型是什么,各自占用多少字节。 2. String类能被继承吗,为什么。 3. String,Stringbuffer,StringBuilder的区别。 4. ArrayList和LinkedList有什么区别。 5. ...

    各大互联网公司常见java面试题

    答案参考:java常见面试题 1、面向对象的特点有哪些? 2、接口和抽象类有什么联系和区别? 3、重载和重写有什么区别? 4、java有哪些基本数据类型? 5、数组有没有length()方法?String有没有length()方法? 6、Java支持的...

    java面试笔试题大汇总.pdf

    java面试笔试题大汇 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当...

    JAVA面试题汇集

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

    学会这些java面试题让你吊打面试官

    学会这些java面试题让你吊打面试官!面试前看看,让你充满自信,不再惧怕面试官各种刁难。1.Java中内存管理及各区域内存储数据的生命周期? 2.JVM堆内存的分代管理以及垃圾回收流程? 3.面向对象三大特征及详细理解? 4...

Global site tag (gtag.js) - Google Analytics