我的java基础学习笔记(二)

今天发现一个有趣的java基础题

System.out.println(1.0-0.8);


答案不是0.2


而是0.19999999999999996


去网上查阅:java遵循IEEE 754浮点数运算,是使用分数来表示的


double a = 0.1;
		double b = 0.1;
		double c = 0.1;
		
		if((a + b + c) == 0.3){
			System.out.println("等于0.3");
		}else{
			System.out.println((a + b + c));
			System.out.println("不等于");
		}


答案:不等于


结论:如果要求精确度,那就要小心使用浮点数,而且尽量 别用==来直接比较浮点数运算结果



如果解决呢?


BigDecimal a = new BigDecimal("0.1");
		BigDecimal b = new BigDecimal("0.1");
		BigDecimal c = new BigDecimal("0.1");
		
		BigDecimal result = new BigDecimal("0.3");
		
		if(a.add(b).add(c).equals(result)){
			System.out.println("等于");
		}else{
			System.out.println("不等");
		}


java.math.BigDecimal类提供有plus(),substract(),multiply(),divide()等方法加减乘除


这几个方法返回都是BigDecimal




注意java中的 ==是用在比较两个参考名称是否参考同一个对象,言外之意,就是是否名称指向的同片内存


equal()方法,则是指两个对象实际指向的内存的值是否相同




二,基本类型的打包器


Long, Integer,Double, Float,Boolean等就是所谓的打包器(Wrapper)


作用:就是讲基本的数据类型打包在对象中,这样就把基本数据类型当做了对象类操作了


int a = 10;
System.out.println(a/3);


结果为:3


原因:如果表达式中都是int类型,就只会在int空间中做运算


Integer  aa = new Integer(a);

System.out.println(aa.doubleValue()/3);


答案:3.3333333333333335



三,自动装箱,拆箱


Autoboxing


例如:Integer a = 10;编译程序会自动判断是否能进行自动装箱



使用一般化的Number类自动装箱

Number num = 3.14f;


分析:3.14会先被自动装箱为Float,




自动拆箱(Auto unboxing)---也就是自动取出打包器中的基本形态信息



数组


遍历二维数组方法


int[][] cords = {{1,3,5},{2,4,6}};
		
		for(int i=0;i<cords.length;i++){
			for(int j=0;j<cords[i].length;j++){
				System.out.print(cords[i][j]+" ");
			}
			System.out.println();
		}
		
		System.out.println("************");
		
		for(int[] row : cords){
			for(int value : row){
				System.out.printf("%2d",value);
			}
			System.out.println();
		}


int[] a = {1,3,5}; 这种方法建立数组,是事先知道了数组的元素值,如果事先不知道数组的元素值,只知道数组的元素个数,那么可以使用new关键


字指定数组的长度来建立数组了


int[] a = new int[10];


java中new关键字就是建立对象,也代表了数组就是对象,这样每个索引的元素有默认值


默认值为0,


注意可以使用java.util.Arrays的fill()方法来设定默认值


例如:

int[] a = new int[10];
		
		for(int i=0;i<a.length;i++){
			System.out.printf("%5d",a[i]);
		}
		
		System.out.println();
		
		System.out.println("************");
		
		Arrays.fill(a, 20);
		
		for(int i : a){
			System.out.printf("%5d",i);
		}



关于类类型建立的数组


Integer[] a = new Integer[10];


这个每个索引指向的为空null


Integer[] a = {1,2,3}; 可以自动装箱来完成初始化



数组的复制


当我们了解了数组是对象,就知道了


int[] a={1,2,3};


int[] b = a;


这个不是数组的复制,指向了同一片内存


那么如何数组复制呢? 做法:建立一个新的数组


int[] a = {1,2,3};
		int[] b = new int[a.length];
		
		for(int i=0;i<a.length;i++){
			b[i] = a[i];
		}

实际上jdk提供了System.arraycopy()方法来专门实现数组复制,比自己使用循环来的快的多:


int[] a = {1,2,3};
		
		int[] b = new int[a.length];
		
		System.arraycopy(a, 0, b, 0, a.length);


如果是jdk6以上也可以用:Arrays.copyof()


int[] a = {1,2,3};

int[] b = Arrays.copyOf(a, a.length);



我们知道在java中,数组 一旦建立后,长度就固定了,那么如果事先建立的数组的长度不够了怎么办呢?那么我们只有建立一个新的数组,将原来的数组拷贝到新的数据里“


int[] a = {1,2,3};


int[] b = Arrays.copyOf(a,a.length*2);


相当于把原来的数组的长度扩大了一倍



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值