zoukankan      html  css  js  c++  java
  • Java 代码学习之理解数据类型中的坑

    package dailytest;
    
    import org.junit.Test;
    
    public class DataTypeTest {
        
        /**
         * 当有字符串第一次参与运算后,+成了连接符的作用
         * 注意是第一次参与运算后
         */
        @Test
        public void test02() {
          System.out.println("hello" + 'a');    //helloa
          System.out.println("hello" + 'a' + 1);  //helloa1
          System.out.println("hello" + ('a' + 1));  //hello98
          System.out.println('a' + 1);  //98
          System.out.println("5 + 5 =" + 5 + 5);  //5 + 5 =55
          System.out.println(5 + 5 + " = 5 + 5");  //10 = 5 + 5
          System.out.println(5 + 5 + " = 5 + 5 = " + 5 + 5);  //10 = 5 + 5 = 55
        }
        
        @Test
        public void test01(){
            //boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。
            //boolean b = 1;  //编译报错 boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。
            
            /*
             * byte 占一个字节,范围-128-127
             * 1.首先需要知道的是,在Java中,整数默认都是int型 
             * 2.jvm 在编译过程中,对于默认为int类型的数值,当赋值给一个比int类型数值范围小的数值类型时(byte,char,short),记作K
             *   首先会进行判断,如果超出K类型的范围时,会报编译异常,因为超出范围了,需要强制转换。
             * 3.如果此时赋值在K类型的范围内,jvm会自动进行一次隐式类型转换,将int转成K 
             */
            byte b1 = -128;
            byte b2 = 127;  //b2, b2都正常
            //byte b3 = 128;  //编译报错,Cannot convert from int to byte
            
            /**
             * byte b3 = 3,3是直接量,在编译期间就可以直接进行判定
             * 而byte b4 = i5,i5是一个变量,需要在运行期间才能确定,所以会编译异常,需要强制类型转换
             */
            byte b3 = 3;
            int i5 = 3;
            //byte b4 = i5;   //编译报错 cannot convert from double to float
            byte b5 = (byte) i5;
            
            /**
             * 当进行数值运算时,会将结果自动提升,再向小类型赋值时,会报异常。
             * 可以简单记为:运行期才能确定的变量,赋值给小的,都会报编译异常
             */
            byte b6 = 3 + 5;
            byte b7 = 3 + 5;
            int i6 = 3;
            //byte b8 = i6 + b6;  //编译异常 Cannot convert from int to byte
            //byte b9 = b7 + b6;  //编译异常 Cannot convert from int to byte
            
            //short同理
            short s1 = 5;
            //short s2 = s1 + 5;  //编译异常 Cannot convert from int to short
            short s3 = s1 += 5; //+=可以通过
            
            double f4 = 3.5;
            //float d = f4 + f4;    //编译异常 Cannot convert from double to float
            
            /**
             * 数值越界问题
             */
            int a = 233;
            byte b = (byte) a;
            System.out.println("b:" + b);  // 输出:-23
            
            /**
             * 将数值大的转换成数据小的,可能会丢失精度,主要针对符点型数据
             * 默认小数类型为double,将它赋值给float,会丢失精度,因而编译异常
             * 解决方法是加f或者F,或者强制类型转换
             */
            //float f1 = 4.0; //编译报错 cannot convert from double to float
            float f2 = 4.0f; 
            float f3 = (float) 4.0; 
            
            /**
             * 当将一个数值范围小的类型赋给一个数值范围大的数值型变量,jvm在编译过程中会进行自动提升
             * 在数值类型的自动提升过程中,数值精度至少不应该降低(整型保持不变,float->double精度将变高)
             */
            //Long与long
            //Long l1 = 1; //编译报错,Cannot convert from int to byte
            Long l1 = 1L; //正确写法,后面接小写的l和大写的L都没有问题,建议用大写的,小写的l容易和1弄混
            long l2 = 1;
            
            /**
             * 1.首先需要知道的是Java把内存划分为两种,一种是栈内存,一种是堆内存
             * 2.byte,short,int,long,boolean,char,double,float这八个是基本数据类型,用它们声明的变量,存放的是栈内存
             * 3.Byte,Short,Integer,Long,Boolean,Character,Double,Float这八种是包装类,它们声明的是变量实际上是一个对象,对象是存储在堆内存中的
             * 4.所以,用包装类声明的变量,在用 == 作比较时,比较的其实是对象的地址值
             * 
             * l3 == l4 为true的原因:
             * 因为Long l = 3L,在底层,其实调用的是Long.valueOf()这个方法
             * 在Long.valueOf()这个方法里,对于在-128-127范围内的数据,是直接从缓存里取的,没有new一个新的对象
             * 所以,凡是在-128-127范围内的数据,== 都为true
             * 不在此范围内的,每次都会新new一个对象,因而地址值肯定是不一样的。
             * 
             * 因为对于包装类,我们需要知道的是:
             * 1.在比较大小时,应该用equals,或者先转成基本数据类型再比较
             *      可以用equals方法的原因在于:
             *          对于Object来说,equals和==没有区别,都是比较地址值
             *          但是Integer这些包装类,重写了equals方法
             * 2.在做条件判断时,注意先判断是否为null,特别是Boolean类型,如果直接作条件判断,很容易在拆箱时报NullPointException
             * 3.Long和Integer都将-128-127这些对象缓存了,所以下面测试的结果对于Integer同样适用
             */
            Long l3 = 3L;
            Long l4 = 3L;
            System.out.println(l3 == l4);   //true
            
            Long l5 = 129L;
            Long l6 = 129L;
            System.out.println(l5 == l6);   //false
            
            Integer i1 = 1;
            Integer i2 = 1;
            System.out.println(i1 == i2);   //true
            
            Integer i3 = -129;
            Integer i4 = -129;
            System.out.println(i3 == i4);   //false
            
            Integer i9 = -128;
            
            System.out.println(i3 > i9);
            
        }
    
    }
  • 相关阅读:
    EAX、ECX、EDX、EBX寄存器的作用
    MFC VS2005 添加Override 和 Message
    ActiveX添加测试工程, 出现的问题[非选择性参数][找不到成员]
    两种应该掌握的排序方法--------2.quick Sort
    关于I/O的那点事
    整理一下 编码、解码库
    VC一些经验系列: 《分享泄漏检测工具:内存、DC、GDI、Handle... 》
    golang安装卸载 linux+windows+raspberryPI 平台
    (转)如何正确使用C++多重继承
    单播、多播(也称组播)、广播
  • 原文地址:https://www.cnblogs.com/yrrAwx/p/7966489.html
Copyright © 2011-2022 走看看