一.JAVA基础 数据类型

本文介绍了JAVA的基础知识,包括基本数据类型的大小,如boolean、byte、char等,并详细阐述了装箱和拆箱的概念。此外,还讨论了Integer缓存池的工作原理,特别是对于小数值的缓存范围。最后提到了equals方法在不同类中的行为差异,以及Unicode和ASCII的区别。
摘要由CSDN通过智能技术生成

基础

1字=2字节=2*8位
1word=2byte=2*8bit
bps bits per second/Bps Byte per second

基本数据类型

  • boolean/1
  • byte/8
  • char/16
  • short/16
  • int/32
  • float/32
  • long/64
  • double/64
Integer x = 2;     // 装箱
int y = x;         // 拆箱

装箱和拆箱:装箱给基础数据类型提供工具方法,装箱自动调用Integer.valueOf(int),拆箱调用Integer.intValue()。

public class Main {
    public static void main(String[] args) {

        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;

        System.out.println(i1==i2);
        System.out.println(i3==i4);
//输出true  false。i1和i2指向同一个对象,i3和i4指向不同对象。原因是通过valueOf方法创
建Integer对象时,如果数值在[-128127]之间,返回指向IntegerCache.cache中已经存在的
对象的引用,否则创建一个新的Integer对象。缓存池详细说明。

        Double i1 = 100.0;
        Double i2 = 100.0;
        Double i3 = 200.0;
        Double i4 = 200.0;

        System.out.println(i1==i2);
        System.out.println(i3==i4);
//false false。在某个范围内的整型数值是有限的,所以可以采用缓存方式,但Double、float
不是,所以和其他几个类的valueOf方法实现不一样。

        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        Long h = 2L;

        System.out.println(c==d);
        System.out.println(e==f);
        System.out.println(c==(a+b));
        System.out.println(c.equals(a+b));
        System.out.println(g==(a+b));
        System.out.println(g.equals(a+b));
        System.out.println(g.equals(a+h));   
//true false true true true false true 
当“==”的两个操作数都是包装类型的引用,比较指向的是否是同一个对象(12),而如果其中一个操作数有算术运算,则比较的是数值(自动拆箱)(35)。对于
c.equals(a+b)会先触发自动拆箱过程,再触发自动装箱过程,也就是说a+b会先各自
调用intValue方法,得到了加法运算后的数值之后,便调用Integer.valueOf方法,
再进行equals比较,由于在缓存区的范围内所以是true(4)。对包装器类型,equals方法不进行类型转换,所以自动拆箱再装箱后6是Integer,7是Long(67)。      
    }
}

缓存池

new Integer()每次都会创建新对象,
Integer.valueOf()(自动装箱调用)可能使用IntegerCache.cache中的缓存对象。

Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y);    // false,==对基础数据类型比较值,对对象比较地址
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k);   // true
Integer m = 123;
Integer n = 123;
System.out.println(m == n); // true

其他在缓冲池中的的基本数据类型范围
- boolean true false
- byte all
- short [-128,127]
- int [-128,127]
- char [\u0000,\u007F]即0-127

补充:\u是Unicode码字符,包含65536个字符,ASCII/ANSI只包含255个字符,是Unicode的子集。Unicode使用16进制编码,[\u0000,\uFFFF]。ASCII/ANSI [\u0000,\u00FF]
equals方法是Object类的方法,自己创建的类如果不重写equals方法,比较的是地址,因为底层是用==实现的。String、Integer等重写了equals方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值