- 浏览: 246632 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
mabusyao:
漠北空城 写道请问下,你这个是JDK版本是多少呢?!忘记了,应 ...
HashMap 源码解读 -
漠北空城:
请问下,你这个是JDK版本是多少呢?!
HashMap 源码解读 -
schumee:
完美团队~
项目沉思录 - 1.1 -
winie:
整理下 搞成引擎嘛 国产需要这样的engine
简单工作流引擎 -
mabusyao:
某位同学给我提供的堪称完美的解决方案:1. 将三个int数组放 ...
CraneWork
今天在论坛上看到的几个题,有几个貌似还挺有意思的。
x == hello:true
a == helloworld:true
a == x+y:false
请看翻译过的源码:
对于String常量,包括“hello”+“world”这种方式的的值(第54行),都被设置为常量。然而对于x+y这种方式,其实首先是创建了一个StringBuilder,然后把两个变量都加到StringBuilder内,再转换成String。此时,就形成了一个新的String对象了。equals方法也就不适用了。
三、Override覆盖
parent static say
child say
所谓静态方法,并不仅仅指该方法在所有实例中只有一份,同时也指该方法是“静态”加载的,即在编译期就已决定其行为。此处p的静态类型为Parent,所以它所调用的方法也在编译期和Parent的say()方法绑定:
六、提前引用
first = 0
这段代码有点诡异,但明白万变不离其宗,只要牢记静态方法&变量是“静态”加载的,即编译时就决定的即可。当然,对于静态变量的这种先定义后赋值的行为,还是需要小心:
看这段代码也许更加直观点:
编译后的代码:
七、对象引用
ab,b
ab,ab
这段代码就十分简单了,明白了引用拷贝就知道原因了。
public static void test() { String x = "hello"; String y = "world"; String z = new String("helloworld"); String a = "helloworld"; System.out.println("x == hello:" + (x == "hello")); System.out.println("a == helloworld:" + (a == "hello" + "world")); System.out.println("a == x+y:" + (a == (x + y))); }
x == hello:true
a == helloworld:true
a == x+y:false
请看翻译过的源码:
public static void test(); 0 ldc <String "hello"> [15] 2 astore_0 [x] 3 ldc <String "world"> [17] 5 astore_1 [y] 6 ldc <String "helloworld"> [19] 8 astore_2 [a] 9 getstatic java.lang.System.out : java.io.PrintStream [21] 12 new java.lang.StringBuilder [27] 15 dup 16 ldc <String "x == hello:"> [29] 18 invokespecial java.lang.StringBuilder(java.lang.String) [31] 21 aload_0 [x] 22 ldc <String "hello"> [15] 24 if_acmpne 31 27 iconst_1 28 goto 32 31 iconst_0 32 invokevirtual java.lang.StringBuilder.append(boolean) : java.lang.StringBuilder [34] 35 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38] 38 invokevirtual java.io.PrintStream.println(java.lang.String) : void [42] 41 getstatic java.lang.System.out : java.io.PrintStream [21] 44 new java.lang.StringBuilder [27] 47 dup 48 ldc <String "a == helloworld:"> [47] 50 invokespecial java.lang.StringBuilder(java.lang.String) [31] 53 aload_2 [a] 54 ldc <String "helloworld"> [19] 56 if_acmpne 63 59 iconst_1 60 goto 64 63 iconst_0 64 invokevirtual java.lang.StringBuilder.append(boolean) : java.lang.StringBuilder [34] 67 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38] 70 invokevirtual java.io.PrintStream.println(java.lang.String) : void [42] 73 getstatic java.lang.System.out : java.io.PrintStream [21] 76 new java.lang.StringBuilder [27] 79 dup 80 ldc <String "a == x+y:"> [49] 82 invokespecial java.lang.StringBuilder(java.lang.String) [31] 85 aload_2 [a] 86 new java.lang.StringBuilder [27] 89 dup 90 aload_0 [x] 91 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [51] 94 invokespecial java.lang.StringBuilder(java.lang.String) [31] 97 aload_1 [y] 98 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [57] 101 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38] 104 if_acmpne 111 107 iconst_1 108 goto 112 111 iconst_0 112 invokevirtual java.lang.StringBuilder.append(boolean) : java.lang.StringBuilder [34] 115 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38] 118 invokevirtual java.io.PrintStream.println(java.lang.String) : void [42] 121 return
对于String常量,包括“hello”+“world”这种方式的的值(第54行),都被设置为常量。然而对于x+y这种方式,其实首先是创建了一个StringBuilder,然后把两个变量都加到StringBuilder内,再转换成String。此时,就形成了一个新的String对象了。equals方法也就不适用了。
三、Override覆盖
public class Parent { public static String say() { return "parent static say"; } public String say2() { return "parent say"; } } public class Child extends Parent { public static String say() { return "child static say"; } public String say2() { return "child say"; } } public class OverrideTest { public static void main(String[] args) { Parent p = new Child(); System.out.println(p.say()); System.out.println(p.say2()); } }
parent static say
child say
所谓静态方法,并不仅仅指该方法在所有实例中只有一份,同时也指该方法是“静态”加载的,即在编译期就已决定其行为。此处p的静态类型为Parent,所以它所调用的方法也在编译期和Parent的say()方法绑定:
// Method descriptor #15 ([Ljava/lang/String;)V // Stack: 2, Locals: 2 public static void main(java.lang.String[] args); 0 new com.ibm.oneteam.Child [16] 3 dup 4 invokespecial com.ibm.oneteam.Child() [18] 7 astore_1 [p] 8 getstatic java.lang.System.out : java.io.PrintStream [19] 11 invokestatic com.ibm.oneteam.Parent.say() : java.lang.String [25] 14 invokevirtual java.io.PrintStream.println(java.lang.String) : void [31] 17 getstatic java.lang.System.out : java.io.PrintStream [19] 20 aload_1 [p] 21 invokevirtual com.ibm.oneteam.Parent.say2() : java.lang.String [37] 24 invokevirtual java.io.PrintStream.println(java.lang.String) : void [31] 27 return
六、提前引用
public class ForwardReference { static int first = test(); static int second = 2; static int test() { return second; } public static void main(String[] args) { System.out.println("first = " + first); } }
first = 0
这段代码有点诡异,但明白万变不离其宗,只要牢记静态方法&变量是“静态”加载的,即编译时就决定的即可。当然,对于静态变量的这种先定义后赋值的行为,还是需要小心:
public class com.ibm.oneteam.Main { // Field descriptor #6 I static int first; // Field descriptor #6 I static int second; // Method descriptor #9 ()V // Stack: 1, Locals: 0 static {}; 0 invokestatic com.ibm.oneteam.Main.test() : int [11] 3 putstatic com.ibm.oneteam.Main.first : int [15] 6 iconst_2 7 putstatic com.ibm.oneteam.Main.second : int [17] 10 return Line numbers: [pc: 0, line: 5] [pc: 6, line: 6] [pc: 10, line: 3] // Method descriptor #9 ()V // Stack: 1, Locals: 1 public Main(); 0 aload_0 [this] 1 invokespecial java.lang.Object() [22] 4 return Line numbers: [pc: 0, line: 3] Local variable table: [pc: 0, pc: 5] local: this index: 0 type: com.ibm.oneteam.Main // Method descriptor #14 ()I // Stack: 1, Locals: 0 static int test(); 0 getstatic com.ibm.oneteam.Main.second : int [17] 3 ireturn Line numbers: [pc: 0, line: 9]
看这段代码也许更加直观点:
public class Main { static int first = test(); static int second = 2; static int test() { return second; } static int third = 3; public static void main(String[] args) { System.out.println("first = " + first); } }
编译后的代码:
// Compiled from Main.java (version 1.6 : 50.0, super bit) public class com.ibm.oneteam.Main { // Field descriptor #6 I static int first; // Field descriptor #6 I static int second; // Field descriptor #6 I static int third; // Method descriptor #10 ()V // Stack: 1, Locals: 0 static {}; 0 invokestatic com.ibm.oneteam.Main.test() : int [12] 3 putstatic com.ibm.oneteam.Main.first : int [16] 6 iconst_2 7 putstatic com.ibm.oneteam.Main.second : int [18] 10 iconst_3 11 putstatic com.ibm.oneteam.Main.third : int [20] 14 return Line numbers: [pc: 0, line: 5] [pc: 6, line: 6] [pc: 10, line: 12] [pc: 14, line: 3] // Method descriptor #10 ()V // Stack: 1, Locals: 1 public Main(); 0 aload_0 [this] 1 invokespecial java.lang.Object() [25] 4 return Line numbers: [pc: 0, line: 3] Local variable table: [pc: 0, pc: 5] local: this index: 0 type: com.ibm.oneteam.Main // Method descriptor #15 ()I // Stack: 1, Locals: 0 static int test(); 0 getstatic com.ibm.oneteam.Main.second : int [18] 3 ireturn Line numbers: [pc: 0, line: 9] // Method descriptor #30 ([Ljava/lang/String;)V // Stack: 4, Locals: 1 public static void main(java.lang.String[] args); 0 getstatic java.lang.System.out : java.io.PrintStream [31] 3 new java.lang.StringBuilder [37] 6 dup 7 ldc <String "first = "> [39] 9 invokespecial java.lang.StringBuilder(java.lang.String) [41] 12 getstatic com.ibm.oneteam.Main.first : int [16] 15 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [44] 18 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [48] 21 invokevirtual java.io.PrintStream.println(java.lang.String) : void [52] 24 return Line numbers: [pc: 0, line: 15] [pc: 24, line: 16] Local variable table: [pc: 0, pc: 25] local: args index: 0 type: java.lang.String[] }
七、对象引用
public class TestRef { public static void main(String[] args) { StringBuffer a = new StringBuffer("a"); StringBuffer b = new StringBuffer("b"); append(a, b); System.out.println(a.toString() + "," + b.toString()); b = a; System.out.println(a.toString() + "," + b.toString()); } public static void append(StringBuffer a, StringBuffer b) { a.append(b); b = a; } }
ab,b
ab,ab
这段代码就十分简单了,明白了引用拷贝就知道原因了。
发表评论
-
各种语言写的wordcount
2015-09-24 16:07 0Java版本: String input ... -
数组双指针算法的研究
2015-07-14 16:59 2408双指针算法在数组/链 ... -
初识ThreadLocal
2015-07-07 13:15 1453最近公司在进行Java开发人员的招聘活动,其中有一道面试题 ... -
摩尔投票法
2015-06-30 20:13 18250摩尔投票法 提问: 给定一个int型数组,找出该数 ... -
小心寄存器
2012-11-08 13:53 4试试这段代码就知道了 public cla ... -
简单工作流引擎
2012-07-06 16:58 2335从公司的一个项目中挖出来的工作流引擎的代码,虽然是一个很简单的 ... -
Always clean the ThreadLocal variables.
2012-05-24 09:16 1166Any variable stored in ThreadLo ... -
STRUTS2 源码 - Logging System
2012-05-24 08:51 1344看了STRUTS2的源码,了解了它的logging系统,觉得还 ... -
在线词典的数据结构实现。
2012-05-18 08:37 0昨天在网上看到了一道百度的面试题: Baidu写道 ... -
Log4j 代码学习 - Factory
2012-05-17 08:47 1068我们最早提到,Log4j的初始代码在LogManager的静态 ... -
Log4j 代码学习 - Appender
2012-05-16 09:09 1301在上一篇文章里,我们 ... -
Log4j 代码学习
2012-05-15 14:58 1116最近闲来无事,正好手头上有Log4j的代码,于是就拿来学习了下 ... -
java7中的ThreadLocalRandom(转)
2012-01-20 09:08 4277今天早上看到一个关于java7中的ThreadLocalRan ... -
(转)追MM与23种设计模式
2011-11-16 14:13 9531、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德 ... -
(转)Java 参数列表
2011-11-05 19:48 2845下面的讨论以Windows ... -
(转)TOMCAT源码分析
2011-10-17 16:06 2052TOMCAT源码分析(启动框架 ... -
java写的四则运算器
2011-08-19 22:19 2653本打算做一个从RE到NFA的转换器,思路已经理清了,但是在动手 ... -
MBeanServer中instantiate 和 invoke的区别
2011-06-02 11:52 1256JMX中有两种方式调用另一个MBean中的方法 先创建一个M ... -
JMX 的一个简单例子
2011-05-30 17:41 1017废话不多说,上代码: HelloWorldMBean接口 ... -
执行JAR文件的一些问题(转)
2011-03-25 13:41 1340大家都知道一个java应用项目可以打包成一个jar,当然你必须 ...
相关推荐
Java面试知识点总结,2022最新,35问答,助您斩获offer Java面试知识点总结,2022最新,35问答,助您斩获offer Java面试知识点总结,2022最新,35问答,助您斩获offer Java面试知识点总结,2022最新,35问答,助您斩...
最近的java 面试知识点, 比较全的java基础知识面试知识,linux
JAVA核心知识点整理.pdf 整理了java开发中比较重要的知识点,对java开发有很大的帮助!主要介绍了 JVM,JAVA集合,多线程,Spring原理,微服务,Zookeeper等...
Java基础知识点和答案Java基础知识点和答案Java基础知识点和答案Java基础知识点和答案Java基础知识点和答案Java基础知识点和答案Java基础知识点和答案Java基础知识点和答案Java基础知识点和答案Java基础知识点和答案...
几个有意思的java程序,考考你的java功底,需要的可以看看
内容较杂,有java初中高级知识点,也有Java web架构及原理
java核心知识点从0到1全包括 JVM 所有知识点技术点 JAVA集合 JAVA多线程并发 JAVA基础 SPRING原理 微服务 等等 java核心知识点从0到1全包括 JVM 所有知识点技术点 JAVA集合 JAVA多线程并发 JAVA基础 SPRING原理 ...
java基础知识点汇总
java基础知识点,面试宝典,最适合你的java面试知识点,所学java知识点总结
java基础知识点总结及面试问题java基础知识点总结及面试问题java基础知识点总结及面试java基础知识点总结及面试问题
JAVA知识点32JAVA知识点32JAVA知识点32JAVA知识点32JAVA知识点32JAVA知识点32JAVA知识点32JAVA知识点32JAVA知识点32
JAVA核心面试知识点整理
java基础知识点总结,初级 中级各个知识点总结。java基础知识点总结,初级 中级各个知识点总结
基础的java 知识点,包含集合等的知识点,供大家学习,欢迎大家留言
JAVA核心知识点整理--》从Java基础-->Java数据结构-->框架-->Java中间件,缓存JAVA核心知识点整理--》从Java基础-->Java数据结构-->框架-->Java中间件,缓存JAVA核心知识点整理--》从Java基础--&...
Java基础知识点,内容比较全面。 目录: 1.1 Java中的引用概念 1.2 Java多线程相关知识 1.3 Java中的垃圾回收算法 1.4 Java IO流相关知识 1.5 JVM ClassLoader机制 1.6 Java中的synchronized使用 1.7 Java中的...
91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识...