基本数据类型知识点积累

作者: 奔跑吧李博 | 来源:发表于2019-01-02 23:37 被阅读8次
    • 数据类型和字节大小对应表:
    类型 大小
    int 4个字节
    char 2个字节
    byte 1个字节
    short 2个字节
    long 8个字节
    float 4个字节
    double 8个字节
    • Integer与int的区别:

    Ingeter是int的包装类,int的初值为0,Ingeter的初值为null
    Integer i = 1;int ii = 1; i==ii为true;因为Integer与int比较会自动拆装箱

    • Float和Double的最小值和最大值都是以科学记数法的形式输出的,结尾的"E+数字"表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14 × 103 =3140,3.14E-3 就是 3.14 x 10-3 =0.00314。

    • 对象、数组都是引用数据类型。

    • byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。
      当使用常量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制

    • 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
      转换过程中可能导致溢出或损失精度,例如:
      int i =128;
      byte b = (byte)i;
      因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。

    • Java中各种数据默认值

    Byte,short,int,long默认是都是0
    Boolean默认值是false
    Char类型的默认值是 ’ ’
    Float与double类型的默认是0.0
    对象类型的默认值是null

    • 什么是值传递和引用传递?

    1.值传递

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
    
        swap(num1, num2);
    
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
    
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    

    运行的结果是:

    a = 20
    b = 10
    num1 = 10
    num2 = 20
    

    在swap方法中,a、b的值进行交换,并不会影响到num1、num2。因为,a、b中的值,只是从num1、num2的复制过来的。 对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。

    2.引用传递

    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
    
        change(arr);
    
        System.out.println(arr[0]);
    }
    
    //将数组的第一个元素变为0
    public static void change(int[] array) {
        int len = array.length;
        array[0] = 0;
    }
    

    运行的结果是: 0
    调用change()的时候,形参array接收的是arr地址值的副本。并在change方法中,通过地址值,对数组进行操作。对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。
    但是对于String类型用于传参,String是对象虽然是引用传递,但是值却是不能被改变的。

    请写出下面几个表达式的结果,答案可以用10进制或16进制书写

    1). 0xaa | 0x55
    2). 15 & 240
    3). 10 ^ 12
    4). -2 >> 1
    5). -2 >>> 1
    1). 分析:十六进制数用0x……来表示,后面一个十六进制位是四位,两个十六进制位为一个字节,最多后面可以有8个十六进制位,32个字节,如:0xFFFFFFFF。 或(“ | ”)运算,全0为0,其他为1。
    所以:0xaa 用二进制表示为 10101010 ,0x55 用二进制表示为 01010101 ,按位或之后为 11111111 ,十进制数为255,十六进制数为 0xFF 。

    2). 分析:10进制转换成2进制,用该数字除以2,记录商和余数,利用商再次除以2,记录商和余数……直到上为0或余数为0停止,余数逆序组成二进制的从低到高位(最后的余数为二进制最低位)。与(“ & ”)运算,全1为1,其他为0 。
    所以: 15 等于1111 ,240等于 11110000,15前面用0补齐为00001111 ,按位与之后为 00000000 ,即结果为0

    3). 分析: 亦或(“ ^ ”)运算,相同取0,不同取1 。
    所以:1010 ^ 1100 =0110 , 十进制表示为6,十六进制表示为 0x06 。

    4). 分析: 带符号右移(“ >> ”),即有符号位时,负数符号位补1,正数符号位补0, -2 的二进制求法是正数取反加1,因此 2 的二进制表示为0000 0000 0000 0000 0000 0000 0000 0010 ,取反加一为
    1111 1111 1111 1111 1111 1111 1111 1110 ,即 -2 的二进制表示。
    注: >> , << , >>> , 运算符只针对int型和long型,byte ,short ,char型需要转换成Int型在进行操作。
    所以: 带符号右移之后为 1111 1111 1111 1111 1111 1111 1111 1111 ,除符号位之外,减一取反,得到带符号十进 制数为 -1 。

    5). 分析:无符号右移 (“ >>> ”) ,即无论正负数,右移之后符号位均补 0 。
    所以: -2 的二进制无符号右移一位之后为 0111 1111 1111 1111 1111 1111 1111 1111,即 2^31 - 1,二的三十一次方减一。
    注:右移和无符号右移主要区别就在于左面最高位补 0 还是补 1 的问题,无符号右移任何时候最高位都补 0 , 有符号右移则是正数补 0 ,负数补 1 。(没有无符号左移!)。

    • Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
    • 我们能将 int 强制转换为 byte 类型的变量吗?

    我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃。

    • 可以将int强转为byte类型么?会产生什么问题?

    我们可以做强制转换,但是Java中int是32位的而byte是8 位的,所以,如果强制转化int类型的高24位将会被丢弃,byte 类型的范围是从-128到127

    • 64位的JVM当中,int的长度是多少?

    Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。

    • 我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?

    不能,必须要强制。

    • 3*0.1 == 0.3 将会返回什么?true 还是 false

    答案是false,因为有些浮点数不能完全精确的表示出来。


    image.png
    • int 和 Integer 哪个会占用更多的内存?(答案)

    Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。同理,包装类型比基本类型占内存更多。

    • ArrayList 和 HashMap 的默认大小是多数?(答案)

    在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。

    • ceil floor round使用规则

    ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.6)的结果为-11;
    floor的英文是地板,该方法就表示向下取整,Math.floor(11.6)的结果是11,Math.floor(-11.4)的结果-12;
    round方法,他表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果是12,Math.round(-11.5)的结果为-11.

    • a=a+b与a+=b有什么区别吗?

    a+=b会进行隐士类型转换。而a+b不会。

            byte a = 127;
            byte b = 127;
            a = a + b;   //报错
            a+=b;    //正常
    

    当a+b时,程序会首先将a和b转为int类型再进行预算,a+b结果为int,需要强转为byte;a+=b隐士地转为了byte,不需要强转了。

    相关文章

      网友评论

        本文标题:基本数据类型知识点积累

        本文链接:https://www.haomeiwen.com/subject/qgsgaftx.html