Java日记(4)— 第一次总结

本文介绍了四个Java编程示例,包括条件运算符的使用、循环控制结构的技巧、素数求和以及最大公约数的计算。同时探讨了基本类型与包装类型的差异、冷门知识点以及常见疑问解答。

1.书上的习题:

代码一:

package Unit_4;

public class P62_4_1_2 {

    public static void main(String[] args) {
        int x=4;
        System.out.println("value is "+((x>4)?99.99:9));
//输出9.0
    }
}

条件运算符:如果结果一和结果二的类型不一样,会先统一类型,在进行判断



代码二:

package Unit_4;

public class P65_4_1_7 {

    public static void main(String[] args) {
        int x=0;
        int y=0;
        outer:
            for (;x<100;x++)
            {
                for (;y<100;y++)
                    if(y==50)
                        break outer;
            }
        System.out.print(x);
 //输出50
    }

}

break的标签用法:跳到标签处,且不会再进循环
continue的标签用法:跳到标签处,进去循环进行接下来的循环



代码三:

//编程计算求1~100内的所有素数的和
package Unit_4;

public class P64_4_2_4 {

    public static void main(String[] args) {
        int sum=0;

        for(int i=2;i<100;i++)
        {
            int t = 1;
            for(int j=2;j<i;j++)
            {
                if((i%j) == 0)
                {
                    t=0;
                    break;
                }
            }
            if(t==1)
                sum+=i;
        }
        System.out.println("100以内所有素数的和:"+sum);
    }

}

注意t的用法,当作一个开关(务必牢牢掌握这种用法)



代码四:

//计算两个整数的最大公约数(GCD),采用经典的Euclid算法,方法是:
//用变量m和n存储两个数的值,如果n为0,程序结束,m的值为最大公约数;
//否则计算m除以n的余数,把n保存到m中,并且把余数保存到n中。重复这个过程,每次都先判断n是否为0
package Unit_4;

import java.util.Scanner;
public class P65_4_2_9 {

    public static void main(String[] args) {
        int m,n;
        Scanner scn = new Scanner(System.in);
        System.out.println("Please Enter Two Number:");
        System.out.print("M:");
        m=scn.nextInt();
        System.out.print("N:");
        n=scn.nextInt();
        while(n!=0)
        {
            //如果m<n,那么第一次循环就相当于是交换m和n的值,从而使m>n
            //如果m>n,那么temp<n<m;每一次循环都意味着m和n的值越来越小
            int temp;
            temp = m%n;
            m=n;
            n=temp;
        }
        System.out.println("最大公约数:"+m);
    }

}

1.掌握Euclid算法用于求公约数
2.体会while循环中的注释,深入理解Euclid算法的巧妙

2.深思的问题:

2.1 基本类型与包装类型的异同:

  1. 在java中,一切皆对象,但八大基本数据类型却不是对象
  2. 声明的方式不同,基本类型无需通过new关键字创建,而封装类型需new关键字
  3. 存储方式及位置的不同,基本类型是直接存储变量的值保存在堆栈中能高效的存取,封装类型需要通过引用指向实例(对象),具体的实例(对象)保存在堆中。
  4. 初始值不同,封装类型的初始值为null,基本类型的请参见日记(2)
  5. 使用方式不同,比如与集合类合作使用时只能使用包装类型

2.2一些冷门知识:

  • 问题:为什么-0/3的结果是0,-0.0/3.0结果是-0.0
  • 答案:在java里,整数是用补码表示的。在补码中0只有一种表示方法。另一方面,浮点数则使用IEEE标准表示的,对于0有两种表示方法:0和-0。


  • 问题:我可以用%除以一个小数么?
  • 答案:当然可以


  • 问题:a+=b和a=a+b有区别么?
  • 答案:当a和b的类型不同时,二者是有区别的,如果a是int类型,b是float类型,后者会报错。(float无法隐式转换成int型)

    需要明确的是“+=”这个运算符在Java中是一个运算符,而不是两个,程序在执行“+=”时,会自动向高精度进行数据类型转换。(如果高精度的数值赋值给低精度的变量,则必须做显示转换;+=运算符,结合了强制类型转换的功能,而普通的没有


  • 问题:为什么判断字符串相等不能使用==?
  • 答案:可以比较==比较的是内存地址(??和c不一样??),而两个字符串类型的内存地址可能是不一样的。使用new关键字时会开辟一块新的内存地址


  • 问题:使用int[] a或者int a[]去声明一个数组有什么区别
  • 答案:没什么区别


  • 问题:创建一个a[]数组时,为什么System.out.print(a)会打印出来一个16进制的数,比如@f62373这样,而不是打印出数组的元素?
  • 答案:因为系统会自动调用数组的toString()方法,如果没有重写这个toString()方法的话,会默认调用Object类中的,可以去看一下toString()方法中的源码


  • 问题:那为什么不把所有的方法参数的传递都设置为值传递的方式?
  • 答案:比如方法参数在传递数据时,倘若数组中的元素比较多,如果使用值传递的话,需要复制一份该数组,此复制的过程需要消耗一些性能,所以在传递类似数组的类型时,使用的是引用传递,这样可以提高一些性能。


  • 问题:为什么java中没有指针?
  • 1.java中有指针!!!,在java中指针成为”引用“,所谓的引用就是内存地址的值,拿到了该引用就相当于拿到了该对象

    2.java中可以使用指针(当然我们称之为”引用“),但我们不能修改引用。(包装类除外,包装类有自动封包解包的特性),及point++在java中是错误的(当然C++中不出错)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值