jvm 中的常量以及常量的衍生类以及==和equals的比较

在jvm中主要存在8大基础数据类型分别是(byte、int、long、short、float、double、char、boolean)

基本数据类型对应的包装类
byte(内存8位,无符号位时最大存储255,表数范围:-128~127)Byte
short(内存16位,无符号位时最大存储65536,表数范围:-32768~32767)Short
int(内存32位,无符号位时最大存储(2^32)-1,表数范围:-2^31~(2^31)-1)Integer
long(内存64位,无符号位时最大存储(2^64)-1,表数范围:-2^61~(2^61)-1)Long
float(内存32位,数据范围在2^-149~(2^128)-1,直接赋值时必须在数字后加上f或F)Float
double(内存64位,数据范围在2^-1074~(2^1024)-1,赋值时可以加d或D也可以不加)Double
char(内存16位,存储Unicode字符集,用单引号赋值,因为有ASCLL码对应值,可以参与加减乘除运算和比较大小)Character
boolean(数值只有true和false,不能用0代替;其他数值类型不能转换成boolean)Boolean

装箱与拆箱

装箱是指由基本数据类型向对应的包装类型转换。例如,int包装成Integer类的对象。 

   拆箱是指有包装类转换成基本数据类型。例如,把Integer类的对象简化成int。

常见包装类应用(手动装箱与拆箱) 
1、实现int和Integer相互转换 
Integer类通过构造方法将int装箱,通过intValue()方法进行拆箱。

int n = 1;
Integer m = new Interger(n);//手动装箱
int n = m.intValue();//手动拆箱(typeVale)

2、自动装箱与拆箱 
Java 1.5之后,Java支持自动装箱和拆箱

int n = 1;
Integer m = n;//自动装箱
int a = m;//自动拆箱

二、四大引用类型

     引用类型分为:数组,类,接口,字符串。

数组:其实就是一个容器,存储同一种数据类型的集合;如 int[] a = {1,2,3,4}

    类:对象是对事物的抽象,而类是对对象的抽象和归纳;如 public class Person{ ......}

     接口:使用interface来定义一个接口,只能定义方法,不能有方法的实现;如public interface personImpl{......}

     字符串:是存放数据区(静态区)以Unicode编码的字符集合,如 String a="你好"

基本类型与引用类型的区别:

(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。
三、==和equals的比较

3.1、基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值。 当存在基本数据类型和包装类型进行比较的时候,由于jvm的自动装箱机制和自动拆箱机制使其也可以使用==进行比较

3.2、复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。   对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

实践:

/**
 * Created by Administrator on 2019/2/17.
 */
public class LearnDataType {
    public static void main(String []args){
        int i = 10;
        Integer i1 = 10;
        Integer i2 = new Integer(10);

        int j = 128;
        Integer j1 = 128;
        Integer j2 = new Integer(128);

        System.out.println("i1:"+i1);
        System.out.println("i2:"+i2);

        System.out.println("i==i1:"+(i==i1));
        System.out.println("i==i2:"+(i==i2));
        System.out.println("i2==i:"+(i2==i));
        System.out.println("i1==i2:"+(i1==i2));
        System.out.println("i2==i1:"+(i2==i1));

        System.out.println("i1.equals(i):"+(i1.equals(i)));
        System.out.println("i2.equals(i):"+(i2.equals(i)));
        System.out.println("i2.equals(i1):"+(i2.equals(i1)));
        System.out.println("i1.equals(i2):"+(i1.equals(i2)));


        System.out.println("j==j1:"+(j==j1));
        System.out.println("j==j2:"+(j==j2));
        System.out.println("j2==j:"+(j2==j));
        System.out.println("j1==j2:"+(j1==j2));
        System.out.println("j2==j1:"+(j2==j1));

        System.out.println("j1.equals(j):"+(j1.equals(j)));
        System.out.println("j2.equals(j):"+(j2.equals(j)));
        System.out.println("j2.equals(j1):"+(j2.equals(j1)));
        System.out.println("j1.equals(j2):"+(j1.equals(j2)));

        System.out.println(new Integer(15));
    }
}
i1:10
i2:10
i==i1:true
i==i2:true
i2==i:true
i1==i2:false(由于两个对象在使用==进行比较的时候是通过比较引用的地址是否相等)
i2==i1:false
i1.equals(i):true
i2.equals(i):true
i2.equals(i1):true
i1.equals(i2):true
j==j1:true
j==j2:true
j2==j:true
j1==j2:false
j2==j1:false
j1.equals(j):true
j2.equals(j):true
j2.equals(j1):true
j1.equals(j2):true
15

在jvm中通常存在常量池,主要缓存的数据是8大基础数据类型,以及字符串缓存常量池

通常基础数据类型变量赋值是从常量池里面获取,如果不存在的话,则创建一个常量,而当使用new的话则是在堆里面创建一个对象并且引用的值是常量池里面的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为什么要学JVM1、一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大的代码,解决更深层次的问题。2、JVM是迈向高级工程师、架构师的必备技能,也是高薪、高职位的不二选择。3、同时,JVM又是各大软件公司笔试、面试的重之重,据统计,头部的30家互利网公司,均将JVM作为笔试面试的内容之一。4、JVM内容庞大、并且复杂难学,通过视频学习是最快速的学习手段。课程介绍本课程包含11个大章节,总计102课时,无论是笔试、面试,还是日常工作,可以让您游刃有余。第1章 基础入门,从JVM是什么开始讲起,理解JDK、JRE、JVM的关系,java的编译流程和执行流程,让您轻松入门。第2章 字节码文件,深入剖析字节码文件的全部组成结构,以及javap和jbe可视化反解析工具的使用。第3章 的加载、解释、编译,本章节带你深入理解加载器的分、范围、双亲委托策略,自己手写加载器,理解字节码解释器、即时编译器、混合模式、热点代码检测、分层编译等核心知识。第4章 内存模型,本章节涵盖JVM内存模型的全部内容,程序计数器、虚拟机栈、本地方法栈、方法区、永久代、元空间等全部内容。第5章 对象模型,本章节带你深入理解对象的创建过程、内存分配的方法、让你不再稀里糊涂。第6章 GC基础,本章节是垃圾回收的入门章节,带你了解GC回收的标准是什么,什么是可达性分析、安全点、安全区,四种引用类型的使用和区别等等。第7章 GC算法与收集器,本章节是垃圾回收的重点,掌握各种垃圾回收算法,分代收集策略,7种垃圾回收器的原理和使用,垃圾回收器的组合及分代收集等。第8章 GC日志详解,各种垃圾回收器的日志都是不同的,怎么样读懂各种垃圾回收日志就是本章节的内容。第9章 性能监控与故障排除,本章节实战学习jcmd、jmx、jconsul、jvisualvm、JMC、jps、jstatd、jmap、jstack、jinfo、jprofile、jhat总计12种性能监控和故障排查工具的使用。第10章 阿里巴巴Arthas在线诊断工具,这是一个特别小惊喜,教您怎样使用当前最火热的arthas调优工具,在线诊断各种JVM问题。第11章 故障排除,本章会使用实际案例讲解单点故障、高并发和垃圾回收导致的CPU过高的问题,怎样排查和解决它们。课程资料课程附带配套项目源码2个159页高清PDF理论篇课件1份89页高清PDF实战篇课件1份Unsafe源码PDF课件1份class_stats字段说明PDF文件1份jcmd Thread.print解析说明文件1份JProfiler内存工具说明文件1份字节码可视化解析工具1份GC日志可视化工具1份命令行工具cmder 1份学习方法理论篇部分推荐每天学习2课时,可以在公交地铁上用手机进行学习。实战篇部分推荐对照视频,使用配套源码,一边练习一遍学习。课程内容较多,不要一次性学太多,而是要循序渐进,坚持学习。      

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值