在网上找工作失意,发现基础很重要,于是就去菜鸟教程去学习基础,但我并不是零基础,只是不太牢固和全面,于是便决定开始查漏补缺。好了,开始学习。
大纲:1.Number类介绍、使用与分析
2.Math类介绍、使用与分析
3.总结
1.Number类介绍、使用与分析
1.1Number类介绍:一般当我们需要使用数字的时候,我们通常使用内置数据类型,如byte、int、long、double等,但实际开发中我们往往需要操作对象,为了解决这个问题,java为每一个内置数据类型提供了包装类,而这些包装类都是Number的子类(Byte、Integer、Long、Double、Float、Short),它和这些子类都在java.lang包中。
1.2装箱拆箱:编译器把基本数据类型包装为包装类型的过程叫做装箱,反之就是拆箱。
public class Test{ public static void main(String args[]){ Integer x = 5;//装箱,将int类型的5包装成Integer类型 int i = x;//拆箱,将Integer类型的值取出赋值给int 类型 System.out.println(x); } }
编译器结果:5
1.3Number类常用方法
序号 | 方法名和描述 |
1 | xxxValue():将Number对象转换为xxx数据类型的值并返回 |
2 | compare():将Number对象与参数比较 |
3 | equals():判断Number对象是否与参数相等 |
4 | valueOf():返回一个Number类型的指定内置包装数据类型 |
5 | toString():以字符串形式返回值 |
6 |
parseXxx():以基本数据类型将字符串的值返回
|
接下来让我们看实例
1.xxxValue()
Integer i = 5; //xxxValue()返回double原生类型 System.out.println("xxxValue()返回double原生类型"); System.out.println("i.doubleValue():"+i.doubleValue());
编译器结果:
xxxValue()返回double原生类型
i.doubleValue():5.0
其实该方法原理很简单,就是强转一下类型让我们看一下源码
public double doubleValue() { return (double)value; }
2.compare()
Integer i = 5;
//compareTo()如果比参数值大返回1,等于返回0,小于返回-1 System.out.println("compareTo()如果比参数值大返回1,等于返回0,小于返回-1"); System.out.println("i.compareTo(2):"+i.compareTo(2)); System.out.println("i.compareTo(5):"+i.compareTo(5)); System.out.println("i.compareTo(8):"+i.compareTo(8));
编译器结果:
compareTo()如果比参数值大返回1,等于返回0,小于返回-1
i.compareTo(2):1
i.compareTo(5):0
i.compareTo(8):-1
这个方法原理也很简单,利用三元运算符实现,源码
public int compareTo(Integer anotherInteger) { return compare(this.value, anotherInteger.value); }
进入compare方法
public static int compare(int x, int y) { return (x < y) ? -1 : ((x == y) ? 0 : 1); }
3.equals()
Integer i = 5;
Integer a = 10; Integer b = 5; Short s = 5;
//equals()如果参数类型和参数值都相同,返回true,否则返回false System.out.println("equals()如果参数类型和参数值都相同,返回true,否则返回false"); System.out.println("i.equals(a):"+i.equals(a)); System.out.println("i.equals(b):"+i.equals(b)); System.out.println("i.equals(s):"+i.equals(s));
编译器结果:
equals()如果参数类型和参数值都相同,返回true,否则返回false
i.equals(a):false
i.equals(b):true
i.equals(s):false
原理很简单,先判断参数是不是这个类的实例,然后比较它们的值是否相同,源码
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
进入intValue()
public int intValue() { return value; }
4.valueOf()
//valueOf()返回一个内置数据类型 System.out.println("valueOf()返回一个内置数据类型"); System.out.println("Integer.valueOf(10):"+Integer.valueOf(10)); System.out.println("Integer.valueOf(\"10\"):"+Integer.valueOf("10")); System.out.println("Integer.valueOf(\"10\",16):"+Integer.valueOf("10",16));
编译器结果:
valueOf()返回一个内置数据类型
Integer.valueOf(10):10
Integer.valueOf("10"):10
Integer.valueOf("10",16):16
这个源码太复杂,分析不全,就不写了。最后一个方法,将第一个二进制字符串转换为基数进制数据。
打个比方,比如字符串是"10",基数是16,那么值就是16,那如果超出了怎么办?我发现一个有趣的
计算方法,就是超出1的部分可以全部分成多个1然后再将分了的部分的值相加,打个比方如("21",1
6),那么最后的值相当于("10",16)+("11",16)=16+17=33。(自己的计算方法,仅供参考。)
5.toString()
Integer i = 5;
//toString()返回String对象 System.out.println("toString()返回String对象"); System.out.println(i.toString()); System.out.println(Integer.toString(5)); System.out.println(Integer.toString(50,16));//10进制转16进制
编译器结果:
toString()返回String对象
5
5
32
同样太复杂。最后方法是把10进制的数转换为基数进制。6.parseXxx()
//parseXxx()返回基本数据类型值 System.out.println(Integer.parseInt("15")); System.out.println(Short.parseShort("155")); System.out.println(Short.parseShort("10",16)); System.out.println(Long.parseLong("20")); System.out.println(Long.parseLong("20",16)); System.out.println(Float.parseFloat("15")); System.out.println(Double.parseDouble("16")); System.out.println(Byte.parseByte("10")); System.out.println(Byte.parseByte("10",8));编译器结果:
parseXxx()返回基本数据类型值
15
155
16
20
32
15.0
16.0
10
8
还是很复杂,不写了。注意该方法返回的是基本数据类型。之前的valueOf()返回包装数据类型。
2.Math类介绍、使用与分析
2.1.Math类介绍:Java的Math类包含了用于执行基本数据运算的属性和方法,如指数运算、e为底数的对数运算
、三角函数、绝对值等。Math类的所有方法都是static,可以直接调用。它也在java.lang包下。
2.2.Math常用方法:
序号 | 方法名和描述 |
1 | abs():返回参数绝对值,返回类型为int |
2 | ceil():返回大于或等于指定类型的参数,向上取整,返回类型为double |
3 | floor():返回小于或等于指定类型的参数,向下取整,返回类型为double |
4 | rint():返回最接近的参数的整数值,返回类型为double |
5 | round():返回最接近的int,long型值,四舍五入 |
6 |
min():从两个参数里取最小值
|
7 | max():从两个参数中取最大值 |
8 | exp():返回自然底数e的参数次方 |
9 | log():返回自然底数e的对数值 |
10 | pow():返回第一个参数的第二个参数次方 |
11 | sqrt():返回参数的算术平方根 |
12 | sin():求参数正弦值 |
13 | cos():求参数余弦值 |
14 | tan():求参数正切值 |
15 | asin():求参数的反正弦值 |
16 | acos():求参数的反余弦值 |
17 | atan():求参数的反正切值 |
18 | atan2():将笛卡尔坐标转换为极坐标,并返回极坐标的角度值 |
19 | toDegrees():将参数转换为角度 |
20 | toRadians():将参数转换为弧度 |
21 | random():返回一个随机数,取值范围为[0,1) |
下面实例
1.abs()
//abs()返回参数的绝对值 System.out.println("abs()返回参数的绝对值"); System.out.println(Math.abs(-10));
编译器结果:
abs()返回参数的绝对值
10
原理就是三元运算,判断是否小于零,是取-参数值,否则取参数值,源码
public static int abs(int a) { return (a < 0) ? -a : a; }
2-5.ceil()、floor()、rint()、round()
double d = 1.25; float f = 3.5f; //ceil()返回大于或等于指定类型的参数,向上取整 System.out.println("ceil()返回大于或等于指定类型的参数,向上取整"); System.out.println(Math.ceil(d)); System.out.println(Math.ceil(f)); //floor返回小于或等于指定类型的参数,向下取整 System.out.println("floor返回小于或等于指定类型的参数,向下取整"); System.out.println(Math.floor(d)); System.out.println(Math.floor(f)); //rint()返回最接近的参数的整数值,返回类型为double,小数点后一位四舍五入 System.out.println("rint()返回最接近的参数的整数值,返回类型为double,小数点后一位四舍五入"); System.out.println(Math.rint(1.49999)); System.out.println(Math.rint(1.5)); //round()返回最接近的int,long型值,四合五入 System.out.println("round()返回最接近的int,long型值,四合五入"); System.out.println(Math.round(1.50000)); System.out.println(Math.round(1.425));
编译器结果:
ceil()返回大于或等于指定类型的参数,向上取整
2.0
4.0
floor返回小于或等于指定类型的参数,向下取整
1.0
3.0
rint()返回最接近的参数的整数值,返回类型为double,小数点后一位四舍五入
1.0
2.0
round()返回最接近的int,long型值,四合五入
2
1
四舍五入的原理就是+0.5然后向下取整
6-7.min()、max()
//min()两个值中取最小,max()两个值中取最大 System.out.println("min()两个值中取最小,max()两个值中取最大"); System.out.println(Math.max(10,15)); System.out.println(Math.min(1.5,1.6));
编译器结果:
min()两个值中取最小,max()两个值中取最大
15
1.5
最大值原理就是第一个参数是否大于等于第二个参数,是取第一个参数值,否取第二个参数值。
最小值原理也是类似。
max()源码:
public static int max(int a, int b) { return (a >= b) ? a : b; }
min源码():
public static double min(double a, double b) { if (a != a) return a; // a is NaN if ((a == 0.0d) && (b == 0.0d) && (Double.doubleToLongBits(b) == negativeZeroDoubleBits)) { return b; } return (a <= b) ? a : b; }
8-9.exp()、log()
//exp()返回自然底数e的参数次方 System.out.println("exp()返回自然底数e的参数次方"); System.out.println(Math.exp(1)); //log()返回自然底数的对数值 System.out.println("log()返回自然底数的对数值"); System.out.println(Math.log(Math.E)); System.out.println(Math.log(1.5));
编译器结果:
exp()返回自然底数e的参数次方
2.718281828459045
log()返回自然底数的对数值
1.0
0.4054651081081644
底层原理看不到的,学过数学的应该懂的。
10-18.pow()、sqrt()、sin()、cos()、tan()、asin()、acos()、atan()、atan2()
//pow()返回第一个参数的第二个参数次方 System.out.println("pow()返回第一个参数的第二个参数次方"); System.out.println(Math.pow(2.0,3)); //sqrt()返回参数的算数平方根 System.out.println("sqrt()返回参数的算数平方根"); System.out.println(Math.sqrt(4)); //sin()求正弦值,cos()求余弦值,tan()求正切值,asin()求反正弦值,acos()求反余弦值,atan()求反正切值 System.out.println("sin()求正弦值,cos()求余弦值,tan()求正切值,asin()求反正弦值,acos()求反余弦值,atan()求反正切值"); System.out.println(Math.sin(100)); System.out.println(Math.cos(100)); System.out.println(Math.tan(100)); System.out.println(Math.asin(90)); System.out.println(Math.acos(90)); System.out.println(Math.atan(100)); //atan2()将笛卡尔坐标转换为极坐标,并返回极坐标的角度值。 System.out.println("atan2()将笛卡尔坐标转换为极坐标,并返回极坐标的角度值。"); System.out.println(Math.atan2(100,100));
编译器结果:
pow()返回第一个参数的第二个参数次方
8.0
sqrt()返回参数的算数平方根
2.0
sin()求正弦值,cos()求余弦值,tan()求正切值,asin()求反正弦值,acos()求反余弦值,atan()求反正切值
-0.5063656411097588
0.8623188722876839
-0.5872139151569291
NaN
NaN
1.5607966601082315
atan2()将笛卡尔坐标转换为极坐标,并返回极坐标的角度值。
0.7853981633974483
底层是看不了的,a开头的方法在高等数学里。19-20.toDegrees()、toRadians()
//toDegrees()将参数转换为角度,toRadians()将参数转换为弧度 System.out.println("toDegrees()将参数转换为角度,toRadians()将参数转换为弧度"); System.out.println(Math.sin(Math.toDegrees(90))); System.out.println(Math.sin(Math.toRadians(90)));
编译器结果:
toDegrees()将参数转换为角度,toRadians()将参数转换为弧度
-0.9540914674728181
1.0
可以看出弧度才是我们数学里的°
底层很简单,toDegrees()参数*180.0除以π,另一个参数除以180.0*π
public static double toDegrees(double angrad) { return angrad * 180.0 / PI; }
public static double toRadians(double angdeg) { return angdeg / 180.0 * PI; }
21.random()
//random()返回一个随机数 System.out.println("random()返回一个随机数"); System.out.println(Math.random());//0取的到,1取不到 System.out.println("1-100的随机整数"); System.out.println(Math.floor(Math.random()*100)+1);
编译器结果:
random()返回一个随机数
0.09954959462094182
1-100的随机整数
68.0
3.总结
1.Number的子类有Byte、Short、Integer、Float、Double、Long
2.可以用包装类的valueOf()和parseXxx()将字符串转换为对应类型,valueOf()返回的是对应包装类型,
parseXxx()返回的是对应基本数据类型,可以用toString将包装类转为String类型
3.Number和它的子类都在java.lang包中,Math也在java.lang包中,并且Math里的方法都是静态的可以
直接调用
4.可以利用随机数和向下取整的方法取一定区间的随机整数