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

时间:2022-10-08 23:19:19

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++中不出错)