java基础复习1之八大基本类型及其包装类型,128陷阱

0,前言

前段时间开始准备春招,复习一些知识点,时间也不算太短,记录了一些笔记什么的,接下来会陆陆续续整理发上来,不过也不会很快,毕竟笔记记的不是很规范,得稍微整理整理,内容也会简略很多,尽量一天至少一篇吧,内容还是很多的,所以发的不会很快,接下来还会发些jvm,并发,计网等整理知识点。嘻嘻嘻。
先发个我做的关于java语法复习的思维导图吧,相信做的还是比较完善的。如有缺陷,欢迎指出。
这个是我做流程图的一个网址,点击这个链接注册可以为我扩容,欢迎点击,蟹蟹。
https://www.processon.com/i/5f734507f346fb06e1bd03e7
java基础
对于一些基础语法,我没有做太多的介绍,和其他的语言基本上没有太多的区别。这里推荐一本书,可以说是java必读的一本经典书籍吧《java核心技术 卷1》里面有详细的java语法。我也是根据这本书的流程来复习的。
对于相对时间比较紧迫的同学们,可以利用目录复习(我也是这样的),大致根据目录来回忆知识点,关于模糊的,可以认真查阅。不过有的时候未免遗忘一些细节(自己可能不知道),可以大致将章节浏览一遍,然后再复习。关于基础部分还是很重要的。多敲代码,很多细节要避免想当然。
链接:https://pan.baidu.com/s/1KBHJGm7gA3tdtHyj0N6Jyg
提取码:a1b1
这里贴出《java核心卷1》的pdf版,有需要的可以下载。
注:博客中的内容可能会有疏漏,错误,希望同学们带着批评思维来看待。

一,java的简单基础语法

1,自增,自减。也就是i++,和–i的区别。
2,&&和& 的区别,||和|的区别。
3,还有c,c++和java一个挺大的区别,java中if判断必须是boolean类型。
4,还有什么for什么的。
这里不做过多描述。

二,八大基本类型

数据类型
  • 基本数据类型

    • 整型

      • byte:1字节 -128———127 ( 10000000==-128)
      • short:2字节 -215—————215-1
      • int:4字节 -231—————231-1
      • long:8字节 -263—————263-1
    • 浮点型:阶位用移码表示

      • float:4字节 符号 阶位 值 (1 8 23 )

      • double:8字节 符号 阶位 值 (1 11 52 )

      • 精度丢失的原因:

        1,阶位不够表示

        2,尾数不够表示

    • boolean:默认值:flase

    • char:默认值:空(\u0000)
      以上其实底层会涉及到一些原码,补码的问题,有兴趣的同学可以去了解,这里不做太多描述。不过这些底层的结构也就是为什么java对于一些类型转换需要显示声明的原因,因为可能丢失精度。

二,类型转换

1,自动类型转换
自动类型转换简单理解,就是小转大的时候,是不需要显示声明的。例如:

int a=10;
double b=a;

这里是没有问题的,因为是小(32位)转大(64位)。int转double不需要强制类型转换。ps:这里的64位其实是不严谨的。

long a=100000l;
int c=a;

这样的类型转换是不行的,需要显式声明,因为属于大转小,
注:long变成double可能存在精度丢失问题。
因为其实double的结构上只有52位来表示小数位。所以说其实能精确表示的范围没有long类型大,也就是有精度丢失问题的。所以不能类型转换也会有精度丢失问题,同理int->float,也是会有精度丢失问题。

三,包装类型

类型大小对应包装类
int4字节Integer
long8字节Long
short2字节Short
byte1字节Byte
浮点型
float4字节Float
double8字节Double
其他
char2字节Character
boolean1字节Boolean

为什么会有包装类型呢,我的理解就是在很多情况下,我们需要利用一个对象来传参,而八大基本类型是不属于对象的,那么我们就需要一些类,能代替八大基本类型来实现这个需求的。也就是包装类型的。

1,自动装箱

int a=1;
Integer b=a;

这里会发现一个问题,a不属于Integer,却能直接给赋值成Integer,其实这里就算是自动装箱了。

2,自动拆箱

Integer a=new Integer(1);
int i=a;

这里就是自动拆箱机制。

3,128陷阱

这里贴出一段源码

    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

这是关于128陷阱的来源,为什么是128(-128到127),不是其他的数字,其实我们可以修改上显得范围。

 public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

这是利用==比较两个Integer对象的代码。可以看出在cache范围内的数字其实是比较数组中的数值,而对于所有Integer其实就是同一个数组,地址一致,所以结果会是true。
贴一段比较代码吧,大家可以试一试,结果会是怎么样的

        Integer a1=1;
        Integer a2=1;
        int b=1000;
        Integer b1=1000;
        Integer b2=1000;
        System.out.println(a1==1);
        System.out.println(a1==a);
        System.out.println(a1==a2);
        System.out.println(a1.equals(a2));

        System.out.println(b1==1000);
        System.out.println(b1==b);
        System.out.println(b1==b2);
        System.out.println(b1.equals(b2));

涉及到自动拆装箱和128陷阱,大家可以试一试,理解一下。
结果:是 T T T T T T F T。大家可以结合源码理解一波。

留个挺有意思的小问题

     	long c=1000l;
        Long c1=1000l;
        Long c2=1000l;
        System.out.println(c1==c);
        System.out.println(c1==1000);
        System.out.println(c1==c2);
        System.out.println(c1.equals(1000));


		Long c3=100l;
        Long c4=100l;
        System.out.println(c3==c4);
        System.out.println(c1.equals(100));

这样的结果会是怎么样的呢,猜一猜,执行一波,看看结果是否在预料之中。
注:涉及到自动装箱机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值