API:
Application Programming Interface 应用程序接口
简单来说:就是Java已经帮我们写好的接口,直接拿来用即可
api文档--甲骨文官网---下载java---找到你下载的版本---下面有个doucumentation download---一个是存api一个是整体介绍
static 静态方法,可以直接用类名.调用
Api - Math:
public static int abs(int a) | 返回参数绝对值 |
public static double ceil(double a) | 向上取整 |
public static double floor(double a) | 向下取整 |
public static int round(float a) | 四舍五入 |
public static int max(int a , int b) | 返回两个int值中的较大值 |
public static int min(int a , int b) | 返回两个int值中的较小值 |
public static double pow(double a , double b) | 返回a的b次幂的值 |
public static double random() | 返回值为double的正值, [0.0 , 1.0) |
Api - System:
public static void exit(int status) | 终止当前运行的Java虚拟机,非零表示异常终止 |
public static long currentTimeMillis() | 返回当前时间(以毫秒为单位) |
arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数) | 数组copy |
currentTimeMillis()应用场景:
long start = System.currentTimeMillis();
fori<1000;-----------------需要测试运行时间的内容
long end = System.currentTimeMillis();
long rs = end - start;-------------将两次运行时间相减,得出代码的运行时间
sout(rs)
arraycopy应用场景:
int[] arr1 = {1,2,3,4};
int[] arr2 = new int[10];
此处无需再遍历后再存入了,直接调用arraycopy存储,且可以局部存储
为什么Math和System都不能创建对象呢?
因为构造方法被private私有化了,外类访问不到,只能用静态调用(可用Ctrl+N搜索类的源代码)
Object:
Stutdent s = new Student();
sout(s);
↓
public void println(Object x) {
String s = String.valueOf(x);-------valueOf就是把任意对象转成字符串
synchronized (this) {-----这个this是指调用对象的地址?
print(s);---打印
newLine();---换行
}
}
↓
public static String valueOf(Object obj) {------【Object obj = new Student(); 父类指向子类(多态)】 return (obj == null) ? "null" : obj.toString();-----【obj指的是对象s,但对象s并没有写toString(),但由于所有对象最终都会继承Object这个类,这个类中有toString()方法】 }
↓
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }-----调用 包名、类名+@+对象地址值(十六进制),最终将地址值返回
但注意,打印s,结果是地址值,一般的使用都是想看看属性值,由于父类Object无法满足子类的需求,所以子类可以重写toString()方法,idea已经编辑好,使用快捷键即可
Object类的常用方法
public String toString() | 返回对象的字符串表示形式。建议所有子类重写该方法,自动生成(重写后显示对象属性值) |
public boolean equals(另外一个对象) | 比较对象是否相等。默认比较地址值,重写可以比较内容,自动生成(重写后对比属性内容是否一致) |
此处重点注意一下:equals方法
之前String类里也有一个equals方法
boolean equals(Object anObject) 区分大小写 |
boolean equalsIgnoreCase(String anotherString)忽略大小写的-----可应用于 “验证码” |
其实是一样的,String类里的equals方法,是String类去调用的,
例如:"sss".equals(123);这个是用String这个类去调用的
但如果是封装类,例如我们常写的Student类,这个类里并没有写equals方法,那么就存在于Object父类里
Object里equals方法的源代码是这样的:对比的不是字符串是否一致,而是地址值
public boolean equals(Object obj) { return (this == obj); }
所以,如果需要使用到对比属性值是否一致,可以重写方法,idea也已准备好了,直接快捷生成即可
在类中 Alt+7 可弹出这个类的结构大纲
另外可以看看String类的equals方法的源代码:
public boolean equals(Object anObject) { if (this == anObject) {-----String的地址值相同,直接返回true,字符串常量池(复用性) return true; } if (anObject instanceof String) {------传入的对象是否为String,不是返回false,也就意味着,String的equals方法的对比只能是String类型对比String类型 String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
结论:
再调用方法时,注意是由谁调用
再传递参数时,注意是否会产生多态
Objects:
public static String toString(对象) | 返回参数中对象的字符串表现形式 |
public static String toString(对象,默认字符串) | 返回对象的字符串表现形式 |
public static Boolean isNull(对象) | 判断对象是否为空 |
public static Boolean nonNull(对象) | 判断对象是否不为空 |
Student s = new Student("小花",22);
注意:第一个toString()方法,Objects.toString(s) 和 Student类重写的一样,都是调用同一个重写的toString(),但目的是另外一个:
public static String toString(对象,默认字符串)
sout ( Objects.toString(s,"随便写一个") ) 最终打印出来的和第一个toString()一样,
但是
若将s赋值为null
s = null;
sout ( Objects.toString(s,"随便写一个") ) 打印结果就为 "随便写一个"
当对象为空null,返回的第二个参数(默认字符串)
Object和Objects的区别http://t.csdn.cn/5d4wM
BigDecimal:
用于精确运算,银行、金融、证券这些
计算机计算流程:十进制 → 二进制计算 → 十进制展示
当十进制为小数时,转成二进制,会有数据丢失,会用无限解决于这个数的二进制表示,虽然误差很小,但是不适用于银行、金融、证券这些需要精确运算的地方
构造方法:
BigDecimal(double val) | 参数为double |
BigDecimal(String val) | 参数为String |
常用方法:
public BigDecimal add(另一个BigDecimal对象) | 加法 |
public BigDecimal subtract(另一个BigDecimal对象) | 减法 |
public BigDecimal multiply(另一个BigDecimal对象) | 乘法 |
public BigDecimal divide(另一个BigDecimal对象) | 除法 |
public BigDecimal divide(另一个BigDecimal对象,精确几位,舍入模式) | 除法 |
注意:调用方法时,需要先创建对象,然后再用对象去调用方法,而不是bd1 + bd2
正确格式:
BigDecimal bd1 = new BigDecimal(0.1);
BigDecimal bd2 = new BigDecimal(0.2);
BigDecimal add = bd1.add(bd2);
sout(add)-------------但问题是出来的还是不精确的,原因是出在传入的数据问题,用double传入的是不精确的,只有用字符串形式传入,才能计算精确
BigDecimal bd1 = new BigDecimal( " 0.1 " );
BigDecimal bd2 = new BigDecimal( " 0.2 " );
BigDecimal add = bd1.add(bd2);
sout(add)----结果为0.3
注意:当除不尽时,运行会报错
这是需要用最后一个方法
public BigDecimal divide(另一个BigDecimal对象,精确几位,舍入模式)
舍入模式需要用BigDecimal类名.调用
已过时----还是可以用,新出的只是涉及到后面的知识,后面会讲
常用的舍入模式:
进一法:BigDecimal.ROUND_UP
去尾法:BigDecimal.ROUND_FLOOR
四舍五入:BigDecimal.ROUND_HALF_UP
BigDecimal bd1 = new BigDecimal( " 10.0 " );
BigDecimal bd2 = new BigDecimal( " 3.0 " );
BigDecimal divide = bd1.divide(bd2 , 2 , BigDecimal.ROUND_HALF_UP );
sout(divide)