Java练习
一、枚举:
public class EnumTest {
public static void main(String[] args) {
Size s=Size.SMALL;
Size t=Size.LARGE;
//s和t引用同一个对象?
System.out.println(s==t); //
//是原始数据类型吗?
System.out.println(s.getClass().isPrimitive());
//从字符串中转换
Size u=Size.valueOf("SMALL");
System.out.println(s==u); //true
//列出它的所有值
for(Size value:Size.values()){
System.out.println(value);
}
}
enum Size{SMALL,MEDIUM,LARGE};
此为枚举类型的小测试。
得到结论:
s和t不是同一个对象,但均是一个枚举类里的属性。
枚举类型是引用类型
枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。
可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的。
对于枚举类的属性成员,可以通过value依次输出属性成员。
二、原码,反码,补码:
对于原码, 反码, 补码而言, 需要注意以下几点:
(1).Java中没有无符号数, 换言之, Java中的数都是有符号的;
(2).二进制的最高位是符号位, 0表示正数, 1表示负数;
(3).正数的原码, 反码, 补码都一样;
(4).负数的反码=它的原码符号位不变, 其他位取反;
(5).负数的补码=它的反码+1;
(6).0的反码, 补码都是0;
(7).在计算机运算的时候, 都是以补码的方式来运算的.
public class testBuma {
public static void main(String[] args) {
System.out.println(~2);//取反操作,二进制码原码转化为反码,转为补码,最后1变0,0变1
System.out.println(2&3);//按位与,转化为二进制两个二进制数依次比较,当两位同时为1时,才为1
System.out.println(2|3);//按位或,转化为二进制至少一个1就为1
System.out.println(~-5);
System.out.println(13&7);
System.out.println(5|4);
System.out.println(-3^3);异或操作,一个为1,另一个为0就为1
System.out.println(1>>2);//算术右移,低位溢出,符号位不变,并用符号位补高位
System.out.println(-1>>2);
System.out.println(1<<2);//左移,符号为不变,低位补0
System.out.println(-1<<2);
System.out.println(3>>>2);
}
}
三、变量的作用域:
public class test33 {
private static int value=1;
public static void main(String[] args) {
int value=2;
System.out.println(value);
}
}
输出:2
Java变量遵循“同名变量的屏蔽原则”
Java中的类型转换:
1.自动类型转换是安全的
2.强制类型转换时,可能会引起信息的损失
实线代表无精度损失,虚线表示有精度损失。
自动类型转化是指容量小的可以自动转化为容量大的(即表数范围)
自动例子:
public static void main(String[] args) {
int a=324;
long b=a;//int类型可以转化为long类型
double c=a;//int类型可以转化double类型
//a=b; //不能转化
float d=3222L;//long类型可以转化为float类型
}
强制例子:
public static void main(String[] args) {
double x=3.14;
int t=(int)x;//会有精度损失,直接取整数部分
char c='a';//a的ASCLL码为97
int d=1+c;
System.out.println(t);
System.out.println(d);
}
结果:
四、测试double类型的值运算:
public class TestDouble {
public static void main(String args[]) {
System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
System.out.println("4.015 * 100 = " + (4.015 * 100));
System.out.println("123.3 / 100 = " + (123.3 / 100));
}
}
结论:使用double类型的数值进行计算, 其结果是不精确的。
解决方法——使用BigDecimal类
例子:
import java.math.BigDecimal;
public class TestBigDecimal
{
public static void main(String[] args)
{
BigDecimal f1 = new BigDecimal("0.05");
BigDecimal f2 = BigDecimal.valueOf(0.01);
BigDecimal f3 = new BigDecimal(0.05);
System.out.println("下面使用String作为BigDecimal构造器参数的计算结果:");
System.out.println("0.05 + 0.01 = " + f1.add(f2));
System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
System.out.println("0.05 / 0.01 = " + f1.divide(f2));
System.out.println("下面使用double作为BigDecimal构造器参数的计算结果:");
System.out.println("0.05 + 0.01 = " + f3.add(f2));
System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
System.out.println("0.05 / 0.01 = " + f3.divide(f2));
}
}
五、 以下的代码结果是什么呢?:
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
结论:
System.out.println("X+Y="+X+Y);其中 + 为连接运算符
System.out.println(X+Y+"=X+Y");其中 + 为加法运算符,为两个数相加
若加上括号System.out.println("X+Y="+(X+Y)); 可进行加法运算
六、二柱子出题:
/**
*
*
* 刘子煜20183542
*/
import java.util.Random;
import java.util.Scanner;
public class erzhu {
public static int[] a=new int[100000];
public static int[] b=new int[100000];
public static int[] c=new int[100000];
public static void main(String[] args) {
int x=0;
int y=0;
int z=1;
int i=0;
int j=0;
int q=0;
int num=1;
int n;
int m;
//int[] a=new int[1000000];
//int[] b=new int[1000000];
//int[] c=new int[1000000];
Scanner scanner =new Scanner(System.in);
System.out.println("请输入要出的题目数:");n=scanner.nextInt();
System.out.println("请输入每行的题目数:");m=scanner.nextInt();
for(i=0;;i++)
{
if(num==n+1) break;
else {
z=(int)(Math.random()*5);
x=(int)(Math.random()*100);
y=(int)(Math.random()*100);
//检查重复
for(j=0;j<num;j++)
{
if(x==a[j]&&y==b[j]&&z==c[j])
{
y=(int)(Math.random()*100);
}
}
a[num-1]=x;b[num-1]=y;c[num-1]=z;
if((num-1)%m==0)
{System.out.print("\n"+"\t");}
switch(z) {
case 1:
if(x+y<100)
{
System.out.print(num+"."+x+"+"+y+" "+"\t");num++;
}
else break;
break;
case 2:
if(x>=y)
{
System.out.print(num+"."+x+"-"+y+" "+"\t");num++;}
else {System.out.print(num+"."+y+"-"+x+" "+"\t");num++;}
break;
case 3:
if(x*y>100) break;
else {System.out.print(num+"."+x+"*"+y+" "+"\t");num++;}
break;
case 4:
if(x>y&&y!=0)
{
if(x%y!=0)break;
else System.out.print(num+"."+x+"/"+y+" "+"\t");num++;
}
else if(y>x&&x!=0)
{
if(y%x!=0) break;
else System.out.print(num+"."+y+"/"+x+" "+"\t");num++;
}
break;
default:
break;
}}
}
}}
结果:
利用基本的switch选择四则运算,并把算术的细节完善,避免重复则定义数组存储遍历,产生100以内的随机数,由此达到出题的功能。