Java课堂篇1

    科技2025-04-08  14

    写在前面

    这里是Java课堂篇系列博客的第1篇,此系列博客是记录课堂中涉及的一些小知识点、小细节。

    正所谓,得细节者得天下

    虽然我走的很慢,但我仍在前进!


    目录

    Java课堂篇1-内容目录

    浮点数的精度问题、

    ++i 和 i++、

    0.0 / 0.0 和 0 / 0 等NaN和Infinite、

    & 作为逻辑运算符 和 &&的区别、

    旋转字符小实验、

    二进制计算小实验、

    不同级别类型变量计算时的类型转化


    开始

    一、浮点数的精度问题、

    对于知道次数的循环,我们一般用for(int i = 0;....;...)

    那么如果不用 int型的循环变量呢,在Java中使用double型的变量,当循环结束的条件 是 等于 某个确定的浮点数 时,

    你会发现程序不会停下来,一直跑下去。(用范围 作为 限制 结束的条件可以停下来)原因是什么呢?

    原因是

    停不下来,因为浮点精度问题。因为每次加的0.1在计算机中每次表示不一样,

    也就是说 不能恰巧等于某个 限制结束 的 条件 值

    package demo.one; public class FuDianJingDu { public static void main(String[] args) { // TODO Auto-generated method stub float f = 20.0f; //停不下来,因为浮点精度问题。因为每次加的0.1在计算机中每次表示不一样, //也就是说 不能恰巧等于10.0 // for(float i = 0;i !=10.0 ; i = (float)(i + 0.1)) { // System.out.println(i); // } //这样可以停下来 for(float i = 0;i < f ; i = (float)(i + 0.1)) { System.out.println(i); } } }
    二、++i 和 i++、

    关于这两个运算符,之前在学C语言的时候就接触到了,记住的一句话:只要不是立刻使用(就像处在单独的一行,不涉及其他运算符),i++的效果和++i和 i= i+ 1相同

    立即使用就不一样了,区别在于是先使用,还是先 +1

    例子参考往期博客:C/C++练习题

    如果 ++ i 和 i ++放在循环涉及赋值问题呢?

    课堂上老师找到了一个此方面的面试题,题目代码如下:

    public class IPlusAndPlusI { public static void main(String[] args) { // TODO Auto-generated method stub int a = 0,b = 0; for(int i = 0;i<99;i++) { a = a ++; b = ++ b; } System.out.println(a); System.out.println(b); } }

    问 a、b的最后打印值为多少?答案是a = 0,b = 99;

    答对了吗?执行原理如下:

    此行代码执行的时候 a = a++;,编译器会自动生成一个临时变量t

    t = a;---->临时变量也就是t先使用a再++

    a = a + 1 ;---->然后 赋值号右边a ++;

    a = t;---->最后,临时变量t的值还给a,此时t的值还是0,所以循环99次,a的值还是0

    此行代码执行的时候b = ++ b,编译器也会自动生成一个变量t

    b = b + 1;

    t = b;—>t后使用b

    b = t;

    区别上面的是,这里是先 ++ b再使用

    总之,关键判断

    先被t使用

    还是先+ 1 然后被 t 使用 ,

    三、0.0 / 0.0 和 0 / 0 等NaN和Infinite、

    public class Devide { public static void main(String[] args) { // TODO Auto-generated method stub //int sumI = 0/0; //System.out.println(sumI); double sumD = 0.0 / 0.0; System.out.println(sumD); double sumD2 = 1 / 0.0; System.out.println(sumD2); } }
    四、& 作为逻辑运算符 和 &&的区别、

    首选知道 & 既可以做逻辑运算符,还可以做 位运算符

    &&只能做逻辑运算符

    二者做逻辑运算符还是有差别的:

    & 当前条件为假时,接着判断后面的条件(可以利用赋值条件验证)&& 当前条件为假时,不在判断后面的条件 public class YanZhengYuAndShuangYu { public static void main(String[] args) { // TODO Auto-generated method stub int a = 1; int b = 2; int c1 = 0,c2 = 0; if(a > b & (c1 = 10)>a) { System.out.println("1执行了"); } System.out.println("这是&:"+ c1); if(a > b && (c2 = 10)> a) { System.out.println("2执行了"); } System.out.print("这是&&:" + c2); } }

    五、旋转字符小实验、

    在一个位置打印一个类似 金箍棒 旋转的字符,需要用到退格'\b’,和线程类静态方法Thread.sleep(),防止太快看不清

    注意,开发环境的控制台可能会影响效果,建议在DOS窗口运行

    public class XuanZhuanXiaoShiYan { public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub char ch1 = '\\'; String str = "——"; char ch4 = '|'; char ch3 = '/'; while(true) { System.out.print(ch1); Thread.sleep(500); System.out.println('\b'); System.out.print(str); Thread.sleep(500); System.out.println('\b'); System.out.print(ch4); Thread.sleep(500); System.out.println('\b'); System.out.print(ch3); Thread.sleep(500); System.out.println('\b'); } } }
    六、二进制计算小实验

    需要注意的是,在JDK1.7之后,才支持0b二进制输入,之前支持16进制

    public class ErJinZhi { public static void main(String[] args) { // TODO Auto-generated method stub int a = 0B111;//7 int b = 0B1011;//11 int c = a & b; System.out.print(c);//3 } }

    七、运算符在计算中的隐式转换

    默认比 int 级别的 的 变量类型,运算时会转化为int型变量,

    如 byte + byte、int + byte 、short + byte 、short + short 等,都会转化为int来计算,结果如果需要转换再转换

    但 float + float 不会转化为 double 型的类型计算,不像 double + float 型的计算提升为double

    Processed: 0.010, SQL: 8