API(Java)
- API(Application Programming Interface)应用程序编程接口
- java语言中实际提供的类和接口
- API文档:对java中提供的类和接口中的功能进行说明的文档
基本类型包装类
-
Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面
向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设
计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和
基本数据类型对应的类统称为包装类.
-
包装类(如:Integer,Double等)这些类封装了一个相应的基本数据
类型数值,并为其提供了一系列操作方法。
对于包装类来说,这些类的用途主要包含两种:
-
作为和基本数据类型对应的类类型存在。
-
包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操
作方法。
包装类常用属性方法以及装箱和拆箱(Auto-boxing/unboxing):
- 以Integer类为例:
public class DemoInteger {
public int value ;
public DemoInteger(int value){this.value=value;}//构造方法
}
public class Demo{
public static void main(String[] args) {
DemoInteger di = new DemoInteger(10);
Integer integer = new Integer(10);//把基本类型包装到对象中
Integer integer1 = new Integer("10");/*在内部先把String类型的"10"先转换为基本类型的10,然后再包装到对象中*/
int i= integer.intValue();//把对象中的基本类型取出
int i1 = integer1.intValue();
System.out.println(integer.equals(integer1));
System.out.println(Integer.MAX_VALUE);//最大值2147483647
System.out.println(Integer.MIN_VALUE);//最小值-2147483648
System.out.println(Integer.SIZE);//位数32
System.out.println(Integer.BYTES);//字节数4
System.out.println(Integer.toBinaryString(integer.intValue()));//转二进制
System.out.println(Integer.toOctalString(integer1.intValue()));//转八进制
System.out.println(Integer.toHexString(demoInteger.value));//转十六进制
Integer integer2 = Integer.valueOf(10);//将基本类型转换为引用类型
Integer integer3 = Integer.valueOf("10");
int i2 = Integer.parseInt("-129");//将String类型转换为int类型
Integer integer4 = i2;//自动装箱,实质还是在内部自动调用valueOf()
Integer integer5 = -129;
Integer integer6 = 127;
Integer integer7 = 127;
System.out.println(integer4==integer5);/*false,大于等于128和小于-128的数会new Integer()*/
System.out.println(integer6.equals(integer7));/*true,小于128大于等于-128的数会直接从缓冲区拿出,缓冲区中创建了256个Integer类型的对象*/
int i3 = integer4;//自动拆箱,在内部自动调用intValue()
System.out.println(i3);
}
}
运行结果:
Object类:
- 是java中所有类的基类(超类 (祖宗类)) 所有类直接间接继承Object 为实现多态性
public class Car {
private String name;
private float price;
public Car(String name, float price) {//车类有参构造方法
this.name = name;
this.price = price;
}
@Override
public String toString() {//重写Object类中的toString方法
return "Car{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
/*
native修饰的方法称为本地方法(有些方法java是不实现的,直接调用本地操作系统中的方法)
输出一个对象时,默认回调用类中toString(), 我们的类中如果没有定义toString(),找父类中的toString()
Object类中的toString(){
getClass().getName()+"@" hashCode() 转换成16进制的字符串
}
*/
@Override
public boolean equals(Object obj) {//重写equals方法
Car car = (Car)obj;//向下转型,将Object类型转为它的子类Car类型
return this.name== car.name&&this.price==car.price;//对内容进行比较
}
}
public class TestCar {
public static void main(String[] args) {
Car car1 = new Car("奔驰",600000f);
Car car2 = new Car("奔驰",600000f);
Car car3 = new Car("宝马",500000f);
System.out.println(car1+"\n"+car2+"\n"+car3);
/*
输出对象时会默认调用类中的toString方法,若类中没有就会调用父类
中的toString方法,这里若没有重写toString()就会调用Object类中的
toString();Object类时java中所有类默认的基类(祖宗类,超类),
所有类直接或间接继承Object类
*/
System.out.println(car1==car2);
/*
"==" 用于基本类型的比较 比较的值是否相等
"==" 用于引用类型比较 比较的是引用地址(对象地址)是否相等
这里是引用类型的比较,和--Object类中的equals方法--实现相同,比较的是他们的地
址,而他们是不同的对象,地址一定不同,所以输出false
*/
System.out.println(car1.equals(car2));
//在Car类中重写了equals方法,比较类中内容是否相同,输出true
System.out.println(car3.equals(car1));//false
}
}
运行结果:
Arrays类
- 用于操作数组工具类,里面定义了常见操作数组的静态方法。
- equals方法
import java.util.Arrays;
/*
声明:public static boolean equals(type[]a,type[]a2)
参数的类型可以是基本数据类型和引用类型的任意一种类型。
内容相等则返回true,否则返回false。例
*/
public class EqualsDemo {
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
int[] b = {1,2,3,4,5};
Arrays.equals(a, b);//比较数组中的内容是否相等
System.out.println(Arrays.equals(a, b));//true
}
}
- sort方法(排序)及copyOf方法(数组复制)
import java.util.Arrays;
/*
将指定的类型(除boolean以外的任意原生数据类型)数组所有元素(或指定范 围内的元素)按数字升序进行排序。
*/
public class Sort {
public static void main(String[] args) {
int [] a = {5,3,4,2,1,9,16};
int [] b = Arrays.copyOf(a,10);//传入原数组,返回一个新数组,还可以设置新数组的长度
ystem.out.println(Arrays.toString(b));
Arrays.sort(a,0,3);/*对某个区间排序 sort(type[] a,开始位置(包含结束),结束位置(不包含结束位置));*/
System.out.println(Arrays.toString(a));
Arrays.sort(a);//默认从0-length-1 底层使用的是快速排序的排序方法
System.out.println(Arrays.toString(a));
}
}
运行结果:
- object型数组会根据元素的自然顺序,对指定对象数组进行升序排序。
- 自定义对象排序
- 自定义类实现Comparable接口
- 重写compareTo方法
public class Acount implements Comparable/*<Acount>*/{//自定义类实现Comparable(可比较)接口
private int id;
private String acount;
private String password;
public Acount(int id,String acount,String password){
this.acount=acount;
this.id=id;
this.password=password;
}
@Override
public String toString() {
return "Acount{" +
"id=" + id +
", acount='" + acount + '\'' +
", password='" + password + '\'' +
'}';
}
/*
这里重写了compareTo方法,它为我们的引用
类型提供一个自定义排序规则,方法会在Arrays
类中的sort()方法底层调用结果是用来判断大小 小于0 等于0 大于0
*/
@Override
public int compareTo(Object o/*Acount acount*/) {
Acount a = (Acount) o;//可以强制向下转型,也可以利用泛型
//return this.id-a.id;
return this.acount.compareTo(a.acount);/*若是比较String类型的数据
就会,调用底层compareTo()方法,把字符串转化为字符数组,再去统计比较各字符串中字符编码和的大小*/
}
}
import java.util.Arrays;
public class TestAcount {
public static void main(String[] args) {
Acount acount1 = new Acount(1, "123456", "111111");
Acount acount2 = new Acount(2, "123457", "222222");
Acount acount3 = new Acount(3, "123458", "333333");
Acount acount4 = new Acount(4, "123459", "444444");
Acount acount5 = new Acount(5, "123460", "555555");
Acount[] acounts = new Acount[]{acount1, acount4, acount5, acount2, acount3};
Arrays.sort(acounts);//按照 Acount类中的某个成员变量进行排序,这里按acount排序
for(int i=0;i<acounts.length;i++){
System.out.println(acounts[i]);
}
}
}
运行结果:
-
binarySearch -使用二分搜索算法搜索指定数组
import java.util.Arrays; /* 声明: public static int binarySearch(type[] a, type key) 默认在0-length-1范围里查找key public static int binarySearch(long[] a,int fromIndex,int toIndex,long key) 从fromIndex-toIndex范围查找key,不包含toIndex */ public class BinarySearch { public static void main(String[] args) { int [] a = {8,2,7,4,5,6,3,1,9}; Arrays.sort(a);//二分查找前提是数据是有序的,所以这里先排序 System.out.println(Arrays.toString(a)); System.out.println(Arrays.binarySearch(a, 10)); //返回负数表示没有找到,若key在数组里,应该是在返回负数的绝对值处 System.out.println(Arrays.binarySearch(a, 0,6,3)); } }
运行结果:
-
toString() 方法(只是重写了Object中的toString方法)
-
声明:public static String toString(type[] a)
-
描述:返回指定数组内容的字符串表示形式。
-
基本数组,字符串表示形式由数组的元素列表组成,括在[]中,相邻元素用“, ”(逗号加空格)分隔。
-
String类
- String类概述
字符串是由多个字符组成的一串数据(字符序列)的字符串常量,java中所有字
符串都是String类的实例.
-
String类有两种创建方式
-
String s = "abc"; /* 先在栈中创建一个对String类的对象引用变量s,然后去字符串常量池中查找 有没有"abc", 如果没有则在常量池中添加”abc”, s引用变量指向常量池中 的”abc”,如果常量池中有,则直接指向改地址即可,不用重新创建. */
-
String s = new String("abc"); //用构造方法直接创建新对象,值存储在 堆内存 的对象中,且是独一无二的。
-
-
String类的构造方法
public String()//创建一个只有""的空字符串,并不是null public String(String str) public String(byte[] bytes) //将byte型数组的内容转换为String类型,常用来解码 String s0 = "你好啊"; byte[] b = s0.getBytes("UTF-8");//编码,一个汉字对应三个byte型数字 String s02 = new String(b,"UTF-8");//解码 public String(char[] value)//将字符型组拼接成一个String类字符串
-
String类中的判断功能(boolean类方法)
boolean equals(Object obj)//判断与另一个字符串对象是否相等
boolean equalsIgnoreCase(String str)//与equals不同的是此方法判断时不区分大小写
boolean contains(String str)//判断字符串中是否包含另一个字符串
boolean isEmpty() //判断字符串是否为空
boolean startsWith(String prefix) //测试此字符串是否以指定的前缀开头。
boolean endsWith(String suffix)//测试字符串是否以指定的后缀结束。
- String类中的获取功能
int length() //获取字符串长度
char charAt(int index) //获取指定索引的字符
int indexOf(String str) //获取str在字符串第一次出现的索引
int indexOf(String str,int fromIndex)//从索引fromIndex开始获取字符串str在字符串中第一次出现的索引
String substring(int start) //截取start之后的字符串包括start处的字符
String substring(int start,int end)//截取start-end之间的字符串,不包括end
- String类中的转换功能
byte[] getBytes()
char[] toCharArray() //将字符串转换成Char数组
static String valueOf(char[] chs)
/*静态方法,将chs数组中的字符拼接成字符串返回,底层还是new Stirng(char [] )*/
String toLowerCase()// 将字符串转换为小写
String toUpperCase() //将字符串转换为大写
String concat(String str) //方法用于将指定的字符串连接到另一字符串上。
Stirng[] split(分割符);/*方法根据匹配给定的正则表达式来拆分字符串。注意 . 、 $、 | 和 * 等转义字符,必须得加 \\ 。*/
- String类中的替换功能
String replace(char old,char new);//将字符串中所有的字符old替换为字符new
String replace(String old,String new);//将字符串中所有的字符串old替换为字符串new
replaceAll(String regex, String replacement);//使用给定的参数 replacement 替换字符串所有匹配给定的正则表达式的子字符串。
replaceFirst(String regex, String replacement);//使用给定的参数 replacement 替换字符串第一个匹配给定的正则表达式的子字符串。
- String中的trim()方法:删除字符串首尾的空格返回
StringBuffer类
- StringBuffer类概述
- 我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个问题。
- 线程安全的可变字符序列
- StringBuffer类的构造方法
/*
当向StringBuffer中添加内容时,是将内容添加到底层的数组中,数组没有被final修饰,当数组装满时,会创建一个新的数组,将新数组地址给底层数组,StringBuffer对象是不会改变的.
*/
StringBuffer stringBuffer = new StringBuffer();//底层char数组默认长度为16
StringBuffer stringBuffer1 = new StringBuffer(30);//底层char数组长度设为30
StringBuffer stringBuffer2 = new StringBuffer("abcd");//~20
stringBuffer.append("abcd1111");//此时底层数组长度不变
stringBuffer.append("efgh11111");/*此时底层数组长度变为42,底层数组对象虽然变了,但是StringBuffer对象却不会变*/
- 添加功能
public StringBuffer append(String str)//向末尾追加内容
public StringBuffer insert(int offset,String str)//向指定的位置插入字符串
- 删除功能
public StringBuffer deleteCharAt(int index)//删除指定索引的字符
public StringBuffer delete(int start,int end)//删除指定区间的内容 包含开始,不包含结束
- 替换功能
public StringBuffer replace(int start,int end,String str)//把指定区间的子字符串替换为字符串str
- 反转功能
public StringBuffer reverse()//将字符串反转 "abc->cba"
- 截取功能
public String substring(int start)//截取start之后的字符串包括start处的字符返回
public String substring(int start,int end)//截取start-end之间的字符串,不包括end返回
//返回的是String类型的,但本身没变
StringBuilder
- StringBuilder类功能和StringBuffer功能完全一致, 但StringBuffer是线程安全的
String类StringBuffer类StringBuilder区别
- String:是字符常量,适用于少量的字符串操作的情况
- StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
- StringBuffer:适用多线程下在字符缓冲2
Math类
- java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和返回值类型一般为double型。
- 静态方法
Math.PI//圆周率 (3.141592~)
abs(); //绝对值
sqrt(); //平方根
pow(double a, double b); //a的b次幂
max(double a, double b);//返回大的值
min(double a, double b);//返回小的值
random(); //返回 0.0 到 1.0 的随机数
long round(double a); //double型的数据a转换为long型(四舍五入)
Random类
- 此类用于产生随机数
- 构造方法
Random random = new Random();
- 成员方法
public int nextInt();
public int nextInt(4);//随机产生一个0--<4的数
System类
- System 类包含一些有用的类字段和方法。它不能被实例化。
- 成员方法
public static void exit(0);//推出虚拟机
public static long currentTimeMillis();//获取当前时间的毫秒数,自1970年1月1日0时起的毫秒数.
Date类
- 使用Date类代表当前系统时间
Date d = new Date(); //创建一个日期对象,里面包含了程序运行时的那一刻的时间,提供方法方便操作
Date d = new Date(long d);//两种构造方法
System.out.println(date.getTime());//1637485760505
System.out.println(date.getYear()+1900);// 称为过期方法,不建议使用,有新方法代替
System.out.println(date.getMonth()+1);//0,1,2,3,4,...,获取月数
System.out.println(date.getHours());//获得指定时间小时数 几点(0-23)
System.out.println(date.getMinutes());//获得指定时间的分钟数 (几点)几分
System.out.println(date.getSeconds());//获得指定时间的秒数 (几点几分)几秒
Calendar类
- Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。
/*例:
Calendar.getInstance(); 获得是一个子类对象GregorianCalendar 公历*/
Calendar c1 = Calendar.getInstance();//用getInstance方法创建
c1.get(Calendar.YEAR);//获取 本年的年份,从1970年开始
//或
Calendar c2 = new GregorianCalendar();//用他的子类GregorianCalender实现
System.out.println(c2.get(Calendar.DAY_OF_WEEK));//获取 本周的第几天,从星期天开始(包括星期天)
System.out.println(c2.get(Calendar.DAY_OF_YEAR));//获取 本年年的第几天
/* Calendar.DAY_OF_MONTH本年第几月
Calendar.WEEK_OF_YEAR本年第几周
Calendar.WEEK_OF_MONTH本月第几周
Calendar.DAY_OF_WEEK本周第几天
...
*/
Date d = c2.getTime();//getTime()方法返回的是一个Date对象
Date data = new Date(c2.getTimeInMillis());//获取 从1970年到c2对象创建所经过时间的long类型时间值,包装在date对象中
System.out.println(data);//输出时间,按Date中toString方法的格式输出
SimpleDateFormat 日期格式化类
-
构造方法:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//括号里的格式不唯一,但也有一定的限制 //yyyy代表年份 MM代表月 dd代表日 E代表星期几 HH mm ss分别表示时 分 秒 SSS表示毫秒
-
日期转字符串
-
Date d1 = new Date();//先创建一个日期对象 String s = sdf.format(d1);//按照上面yyyy-MM-dd的格式把d1这个日期转为字符串输出 System.out.println(s);//输出d1对象创建时刻的时间
-
字符串转日期
-
String birthday = "2001-12-13"; SimpleDateFormat mysdf = new SimpleDateFormat("yyyy-MM-dd");//日期格式必须和指定格式一致 try{//防止birthday的规则错误 Date d2 = mysdf.parse(birthday);//把字符串birthday解析为Date类型 System.out.println(d2);//Thu Dec 13 00:00:00 CST 2001 }catch(ParseException e){ e.printStackTrace(); }
BigInteger类
- 我们都知道 Integer 是 Int 的包装类,int 的最大值为 2^31-1。若希望描述更大的整数数据时,使用Integer 数据类型就无法实现了,所以Java中提供了BigInteger 类。
- BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息。
- BigInteger类位于java.math包中
- 构造方法
//BigInteger(String val) /BigInteger(byte[] val) ...
BigInteger b = new BigInteger("922337203685477580711111111111111111111111111111");
- 基本运算方法
//add()加 subtract()减 multiply()乘 divide()除
BigInteger b1 = new BigInteger("11111111111111111111111111111111111111111111111");
BigInteger b2 = new BigInteger("22222222222222222222222222222222222222222222222");
System.out.println(b1.add(b2));//33333333333333333333333333333333333333333333333
BigDecimal类
- 在计算机中不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去 一定的精确度。
- 根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可 能不精确。只能无限接近于那个值.
double a = 1.0-0.9;
double b = 0.8-0.7;
System.out.println(a==b);//false
- 在现实生活中,特别是金融项目,我们必须做到计算十分精确So Java在java.math包中提供的API BigDecimal
- 构造方法
//BigDecimal(String val)
BigDecimal bigDecimal = new BigDecimal("11.9");
- 基本运算方法
//add() subtract() multiply() divide()
BigDecimal b1 = new BigDecimal("12");
BigDecimal b2 = new BigDecimal("11.9");
System.out.println(b1.subtract(b2));//减法 得0.1
BigDecimal b3 = new BigDecimal("10");
BigDecimal b4 = new BigDecimal("3");
// 精度 舍入模式:向正无限大方向舍入
System.out.println(b3.divide(b4,3,BigDecimal.ROUND_CEILING));//除法 得3.334