在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码。就像下面这样。那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码的输出是什么? Runnable x = new Runnable() { @Override pu ...
分类:
其他好文 时间:
2018-09-03 13:38:43
阅读次数:
150
通过学习string源码,可以知道String类其实是通过char数组来保存字符串的。String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。 一. toString Object中有个方法叫toString,所有的子类都可以重写这个方法。Syste ...
分类:
编程语言 时间:
2018-09-02 21:47:27
阅读次数:
155
1. 新增Show byte code 2. 3. 在类上右键 external tools ...
分类:
编程语言 时间:
2018-08-31 10:51:23
阅读次数:
625
java 1.5发行版引入的for-each循环。(引自《Effective Java》中文版第二版 第46条) 如以下对数组列表的for-each循环示例: 在JDK1.8.0_151的环境下,利用javac工具编译上面的代码,得到ForEach.class字节码文件,然后利用javap反编译这份 ...
分类:
编程语言 时间:
2018-08-24 20:40:19
阅读次数:
156
常量池深度剖析: 在上一次【https://www.cnblogs.com/webor2006/p/9416831.html】中已经将常量池分析到了2/3了,接着把剩下的分析完,先回顾一下我们编译的源文件为: 然后用javap -verbose查看一下编译字节码的信息,其中字符串相关的如下: 而对应 ...
分类:
编程语言 时间:
2018-08-11 01:23:30
阅读次数:
484
1、String对象是不可变的,JDK源码的类的定义如下: 不可变的特性会带来一定的效率问题。比如“+”或“+=”操作字符串带来的性能。 示例1: 使用jdk的命令javap -c反编译,从以下结果可以看到,程序创建了一个StringBuilder对象,并使用append方法拼接,最后将对象转换成最 ...
分类:
其他好文 时间:
2018-08-09 01:18:17
阅读次数:
129
上面是带范型的,下面是正常常规的 //上面同name的trait解析 看编译后的文件 那就是被编译成了三个class Pet.class源码,Pet是一个接口,有俩个方法,由下可见trait里面并没有name这个字段. Dog.class源码 那么可以知道.下面这个语法是一个糖衣. ...
分类:
其他好文 时间:
2018-07-30 01:09:06
阅读次数:
179
jvm字节码指令我们都知道,Java源代码不会像C/C++那样直接被编译为机器码,而是被编译成字节码,这造就了Java可以跨平台的特性。JVM实际执行的也是编译后的字节码,所以想要在Java代码层进行调优,就得对字节码有一定的了解。.class文件是无法直接使用文本编辑器查看的,至于字节码的查看,我们可以使用javap这个jdk自带的工具。javap是Javaclass文件分解器,可以反编译(即对
分类:
编程语言 时间:
2018-07-27 21:01:47
阅读次数:
149
String的不可变,String类为什么要被设计为是final的,Java String的可变性,Byte,Short,Integer,Long,Double,Float,Character,Boolean 八种基本数据的包装类,enum枚举类型 不变性分析 ...
分类:
编程语言 时间:
2018-07-26 10:48:45
阅读次数:
175
前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析。 一、问题引出 先看一段代码 运行结果:仔细发现,出现了两个84,但代码想要的结果是,每个线程每次执行,就在原来的基础上加一。因此,这里就是 ...
分类:
编程语言 时间:
2018-07-25 00:54:36
阅读次数:
260