读书笔记(二)——《Java核心技术卷一》第三章Java的基本程序设计结构

1.数值类型之间的转换
这里写图片描述
图中显示的是数值类型之间的合法转换,虚线箭头表示转换的时候可能有精度损失,将两个不是相同类型的数值进行二元操作时,先要将两个操作数转换为同一种类型,然后再进行计算,转换有下列四种情况:

  • 如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型。
  • 否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型。
  • 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型。
  • 否则,两个操作数都将被转换为int类型。

需要注意的是short类型的数值不能直接和其他类型的数值进行二元操作,因为另一个数值将会被转换为short类型,由于精度丢失,所以编译的时候都不能通过,会报错,例如:

        short s = 30;
        s = s + 5;

s=s+5报错,系统会建议你用强制转换或者将s的类型改为int类型。


2.强制类型转换
除了上图箭头指向的可以自动转换外,其他转换需要强制类型转换,还是拿上面的例子:

        short s = 30;
        s = (short) (s + 5);

表达式经过强制转换,所以不会报错了。
这里顺便说一下结合赋值和运算符,就是在赋值中使用二元运算符,如:+=、-=等等,这种运算符特殊的地方在于如果运算符得到一个值,其类型与左侧操作数的类型不同时,就会发生强制类型转换,上面的例子这样写也是合法的

        short s = 30;
        s += 5;

因为它会自动的进行强制转换而不需要我们写,s+=5会把s设置为(short)(s+5),又如:x+=3.5也是合法的,它会把x设置为(int)(x+3.5)。


3.字符串
Java中用String类来处理字符串,里面有许多处理字符串的方法,需要注意的是String类对象称为不可变字符串,因此里面也没有提供用于修改字符串的方法,在对字符串操作中,新手往往会犯的错误便是用==符号进行两个字符串的相等比较,用==运算符只能够确定两个字符串是否放置在同一个位置上,而不能判断两个字符串的内容是否相等,当然啦,如果字符串放置在同一个位置上,那么它们必然相等,但大多数情况下我们比较的两个字符串都不是放在同一个位置的,所以要比较两个字符串是否相等用equals方法,如:

        String aString="abc";
        String bString="abc";
        String cString=null;
        System.out.println(aString.equals(bString));
        System.out.println("abc".equals(aString));
        System.out.println("abc".equals(cString));
        System.out.println(cString.equals("abc"));

结果:
这里写图片描述
第四句话是比较两个字符串变量的内容是否相等,而如果要比较一个字符串变量是否与一个字符串相等,则用第五句和第六句的写法,最好将字符串常量放在前面,因为要比较的字符串变量可能为null,就会出现如图所示的空指针异常。


4.浮点数与循环
原来使用JavaScript的时候曾经遇到过用for循环输出-10.0、-9.9、-9.8……9.8、9.9、10.0,这时候会遇到一个问题,由于舍入的误差,到0的时候会出现问题,如果不进行处理是无法正确表达出上面所要的数列,这是因为0.1无法精确地用二进制表示,在Java的循环中也会有这种情况,在循环中,检测两个浮点数是否相等要格外小心,例如像下列for循环:for(double x=0;x!=10;x+=0.1)
这个循环可能永远不会结束,由于舍入的误差,最终可能得不到精确值,x将从9.99999999999998跳到10.09999999999998。其实不管浮点数有没有用在循环里,用浮点数进行计算,都会由于舍入误差得不到精确值的原因而出现问题,这时候就要用到BigDecimal这个类了。
5.大数值
Java中提供了BigInteger和BigDecimal这两个类来处理包含任意长度数字序列的数值,BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。使用静态的valueOf方法可以将普通的数值转换为大数值

        BigInteger a = BigInteger.valueOf(49);

用这两个类进行运算时不能用常用的算术运算符,只能用它里面提供的方法来进行运算,具体的可以查看API或者以后遇到了再说。


5.数组
数组是一种数据结构,用来存储同一类型值的集合,需要注意的是一旦创建了数组,就不能再改变它的大小了,如果需要改变大小则需要用到数组列表。创建一个数字数组时,所有元素都初始化为0,boolean数组的元素初始化为false,对象数组的元素则会初始化为null。


6.for each
对于数组的遍历,除了用for循环之外,Java还提供了一种for each循环来依次处理数组的每个元素,这种循环的语句格式是:

for(variable:collection) statement

collection这一集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象,具体实现代码如下:

        int[] a={7,34,3,4};
        for (int i : a) {
            System.out.println(i);
        }

使用for each循环对我来说最大的好处就是不用担心数组下标越界的问题,在使用Java或者其他语言这么久以来,数组下标越界仍是遇到的异常最多之一,遇到异常最多的甚至排在第一的是空指针异常。

猜你喜欢

转载自blog.csdn.net/luqiren/article/details/76761381