Java基础——Number&Math

在网上找工作失意,发现基础很重要,于是就去菜鸟教程去学习基础,但我并不是零基础,只是不太牢固和全面,于是便决定开始查漏补缺。好了,开始学习。

大纲: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类常用方法
序号方法名和描述
1xxxValue():将Number对象转换为xxx数据类型的值并返回
2compare():将Number对象与参数比较
3equals():判断Number对象是否与参数相等
4valueOf():返回一个Number类型的指定内置包装数据类型
5toString():以字符串形式返回值
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常用方法:
序号方法名和描述
1abs():返回参数绝对值,返回类型为int
2ceil():返回大于或等于指定类型的参数,向上取整,返回类型为double
3floor():返回小于或等于指定类型的参数,向下取整,返回类型为double
4rint():返回最接近的参数的整数值,返回类型为double
5round():返回最接近的int,long型值,四舍五入
6

min():从两个参数里取最小值
7max():从两个参数中取最大值
8exp():返回自然底数e的参数次方
9log():返回自然底数e的对数值
10pow():返回第一个参数的第二个参数次方
11sqrt():返回参数的算术平方根
12sin():求参数正弦值
13cos():求参数余弦值
14tan():求参数正切值
15asin():求参数的反正弦值
16acos():求参数的反余弦值
17atan():求参数的反正切值
18atan2():将笛卡尔坐标转换为极坐标,并返回极坐标的角度值
19toDegrees():将参数转换为角度
20toRadians():将参数转换为弧度
21random():返回一个随机数,取值范围为[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()返回最接近的intlong型值,四合五入
System.out.println("round()返回最接近的intlong型值,四合五入");
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.可以利用随机数和强转(int)的方法取一定区间的随机整数
 
   
 
   
 
   
 
   


 
    
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值