Java知识点汇总

栏目: IT技术 · 发布时间: 5年前

内容简介:从深入理解Java虚拟机一书来说,是不存在这个说法的。从大部分百度而来的结果,就是说如下:123,这个数字存在哪里? 这个从JVM来说,它是存在常量池中的。按照缓存池的说法,int的缓存范围是-128~127,那我们用220来测试下结果。

1.数据类型

1.1装箱和拆箱问题

1.2 缓存池

从深入理解 Java 虚拟机一书来说,是不存在这个说法的。从大部分百度而来的结果,就是说如下:

123,这个数字存在哪里? 这个从JVM来说,它是存在常量池中的。

按照缓存池的说法,int的缓存范围是-128~127,那我们用220来测试下结果。

private void cachePool(){
        Integer a = Integer.valueOf(220);
        Integer b = Integer.valueOf(220);
        AppLog.i(String.valueOf(a == b));

        Integer c = Integer.valueOf(123);
        Integer d = Integer.valueOf(123);
        AppLog.i(String.valueOf(c == d));

        Integer e = 220;
        Integer f = 220;
        AppLog.i(String.valueOf(e == f));

        Integer g = 123;
        Integer h = 123;
        AppLog.i(String.valueOf(g == h));
    }

结果是false,true,false,true。

这里的理解是有误的。首先常量池存的是字符串,比如“abc”,abc存在常量池里面。s = "abc",这个时候,s并不在常量池。

在会过来说缓存池。在java中,当int的范围是【-128,127】时,JVM事先把这个范围内的数值,先存放在堆里面。所以对123的使用,缓存池的地址。

基本类型对应的缓冲池如下:

  • boolean values true and false
  • all byte values
  • short values between -128 and 127
  • int values between -128 and 127
  • char in the range \u0000 to \u007F

    1.3 常量池

    常量池只要针对字符串常量,这个上文有说到,字符串会在使用的时候,存放到常量池中。

    String s1 = "abc";
        String s2 = "abc";
        AppLog.i(String.valueOf(s1 == s2));

    结果是true,更进一步,把s2换成“abc”,还是true。也就是s1和s2都是常量池一个地址的引用。

    1.4 String

    最重要的是不可变性:

    String 由final char[]value,由于final修饰,所以value不能指向其他数组,并且string内部没有修改value的方法,所以String是不可修改的。

    hashcode可以缓存,应为不变。

    StringPool机制,这个就是上面说的常量池。

    String是线程安全的。

    StringBuild不是线程安全

    StringBuffer线程安全,内部有synchronized

    String.intern(),这个方法会主动把字符串放入常量池。

    1.5 精度问题

    Java 不能隐式执行向下转型,因为这会使得精度降低。

    short s = 1;
        /*1是int类型,所以+以后转换为int类型,强转为short型*/
        s = (short) (s+1);
        /*支持隐私转换*/
        s +=1;

    1.6 static

    1.6.1 static 变量

    其他从JVM角度来讲,static的变量和类没有关系,类的实例是在java heap里面new出来的。而static 变量存在于方法区。类名只是为了找到这个全局变量的位置而已。(C++的说法,全局变量,功能类似)

    1.6.2 static方法

    静态方法也是独立于类的存在,所以静态方法必须实现。存在于JVM的方法区。

    1.6.3 static代码块

  • 首先这部分代码,只有在类使用的时候,才会被加载。
  • 其次,它只会运行一次,或者说在类加载的时候,被运行。而不是new一个类的时候,所以它比new 更早。
  • 构造代码块,也就是没有static,这个很显然,是在每次构造的时候调用。其次,每次都会调用。可以理解为是构造函数的一部分。

    1.6.4 static内部类

    从JVM的角度看,只是一个命名方式而已,跟外部类,是完全不想干的2个类。


以上所述就是小编给大家介绍的《Java知识点汇总》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

500 Lines or Less

500 Lines or Less

Amy Brown、Michael DiBernardo / 2016-6-28 / USD 35.00

This book provides you with the chance to study how 26 experienced programmers think when they are building something new. The programs you will read about in this book were all written from scratch t......一起来看看 《500 Lines or Less》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具