API
文章目录
API:Application Programming Interface 应用程序变成接口。
简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可。
JavaAPI:指的就是JDK中提供的各种功能的Java类。
API帮助文档:帮助开发人员更好的使用API和查询API的一个工具。
Scanner
Scanner scan = new Scanner(System.in);
第一套:
scan.nextInt();//接收整数
scan.nextDouble();//接收小数
scan.next();//接收字符串,不能收空格,制表符
第二套:
scan.nextLine;//接收字符串,可接收空格,制表符,遇到回车停止接收数据
注:
第一套不能与第二套混用
Random
String
字符串的内容不会发生改变,它的对象在创建后不能被更改
String 对象的创建
1.直接赋值:
String name = "Jack";
2.new
String name = new String("Jack");
方法
name.equals();//完全一样结果才是true。否则为false
name.equalsIgnoreCase();//忽略大小写比较
name.charAt();//根据索引返回字符串
name.length();//返回字符串的长度
name.substring();//截取字符串(包头不包尾,包左不包右)
name.replace();//替换
name.toCharArry();//将字符串转换为一个字符数组
name.compareTo(String str);//比较name与str的位置,底层:char(str)-char(name)
注:
使用Scanner录入的abc与定义的abc 使用==
时,结果为false
StringBuilder
StringBuilder可以看成是一个容器,创建之后里面的内容是可变的
提高字符串的操作效率
初始化:StringBuilder stringBuilder = new StringBuilder ( );
StringBuilder stringBuilder = new StringBuilder ( “abc”);
常用方法:
stringBuilder.append();//添加数据,并返回对象本身
stringBuilder.reverse();//反转容器中的内容
stringBuilder.length();//返回长度
stringBuilder.toString();//把StringBuilder对象转换为String字符串
使用场景
1.字符串的拼接
2.字符串的反转
StringJoiner
StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
作用
: 提高字符串的操作效率,而且代码编写特别简洁(JDK8出现)
构造方法:
public StringJoiner(间隔符号)
StringJoiner stringJoiner = new StringJoiner( “,” );
public StringJoiner(间隔符号,开始符号,结束符号)
StringJoiner stringJoiner = new StringJoiner( " , " , " [ " , " ] " );
常用方法:
stringJoiner.add();//添加数据,并返回对象本身
stringJoiner.lengrh();//返回长度
stringJoiner.toString();//返回一个字符串
字符串存储的内存原理
- 直接赋值会复用字符串常量池中的
- new出来的不回复用,而是开辟一个新的空间
==号比较的到底是什么
- 基本数据类型比较数值值
- 引用数据类型比较地址值
字符串拼接的底层原理
-
拼接的时候没有变量,都是字符串:触发字符串的优化机制。在编译的时候已经是最总的结果
-
拼接的时候有变量:
在JDK8以前底层会使用StringBuilder进行拼接:
JDK8字符串拼接的底层原理:
StringBuilder提高效率的原理图
所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存
StringBuilder源码分析
- 默认创建一个长度为16的字节数组
- 添加内容长度小于16,直接存
- 添加内容长度大于16会进行扩容(原来的容量*2+2)
- 如果扩容后还不够长,以实际长度为准
Math
一个帮助我们进行数学运算的工具类
Math.abs(int a);//返回参数绝对值,数值溢出时会产生Bug,不会报错
Math.absExact(int a);//返回参数绝对值,数值溢出时会产生Bug,并报错
Math.ceil(double a);//向上取整
Math.floor(double a);//向下取整
Math.round(float a);//四舍五入
Math.max(int a , int b )//获取两个int值中的较大值
Math.pow(double a , double b );//返回a的b次幂的值
Math.sqrt(int a ); //平方根
Math.cbrt(int a ); //立方根
Math.random();//返回值为double的随机值,范围[0.0,1.0]
System
操作系统相关方法
System.exit(int status); //终止当前运行的Java虚拟机
status:0表示当前虚拟机正常停止;非0表示虚拟机异常停止
System.currentTimeMillis();//返回当前系统时间毫秒值形式
System.arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数);//数组拷贝
注:
数据源数组与目的数组都是基本数据类型,两者的数据类型必须保持一致,否则会报错
在拷贝的时候需要考虑数组长度,长度超出会报错
如果数据源数组和目的数组都是引用数据类型,那么子类类型可以复制给父类类型
Runtime
表示当前虚拟机的运行环境
Runtime runTime=Runtime.getRuntime();//当前系统的运行环境对象
runTime.exit(int status);//停止虚拟机
runTime.availableProcessors();//获得CPU线程数
runTime.maxMemory();//JVM能从系统中获取总内存大小(单位byte)
runTime.totalMemory();//JVM已经从系统中获取总内存大小(单位byte)
runTime.freeMemory();//JVM剩余内存大小(单位byte)
runTime.exec(String command);//运行cmd命令
Object
Java中的顶级父类。所有类都直接或简介的继承与Object类
object.toString();//返回对象的字符串表示形式
object.equals(Object obj);//比较两个对象是否相等
object.clone(int a );//对象克隆
clone
对象拷贝也叫对象复制
复制过程:
重写Object中的clone方法,返回一个super.clone();
让JavaBean类实现Cloneable接口
创建对象,并调用clone()方法
浅克隆:不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来
缺点:引用数据类型会出现脏读的情况,即一个对象修改了引用数据类型中的值,零一对象 也会被修改
Object中的克隆是浅克隆
深克隆:基本数据类型直接拷贝,字符串复用,引用数据类型会重新创建新的
重写JavaBean中继承自Object的clone方法,将其中的引用数据类型的数据,单独重新创建并且返回
第三方工具:gson.jar
使用方法:
Gson gson= new Gson();
String s=gson.toString(user);
User user=gson.fromJson(s,User.class);
Objects
成员方法:
Objects.equals(Object a , Object b);//先做非空判断,再比较两个对象
Objects.isNull(Object obj);//判断对象是否为Null
Objects.nonNull(Object obj);//判断对象是否不为Null
BigInteger
数值不会溢出,故不会产生溢出异常,最大能表示42亿的21亿次方
构造方法:
public BigInteger(int num , Random rnd);//获取随机大整数,范围:[0~(2的num次方)-1]
public BigInteger(Sreing val);//获取指定的大整数 ☆
public BigInteger(String val,int radix);//获取指定进制的大整数
radix表示val的进制格式,此方法将radix进制的val转换为十进制数
即:val中的每一位不能超过(radix-1)
成员方法:
BigInteger.valueOf(long val);//静态方法获取BigInteger的对象(优化版) ☆
优化点:在内部对常用的数字(-16~16)进行了优化,提前把-16~16先创建好BigInteger的对象,多次 获取不会重新创建对象
局限性:数值不能超过long的最大值(9223372036854775807)
bigInteger.add(Biginteger val);//加法
bigInteger.subtract(Biginteger val);//减法
bigInteger.multiply(Biginteger val);//乘法
bigInteger.divide(Biginteger val);//除法,获取商
bigInteger.divideAndRemainder(Biginteger val);//除法,获取商和余数
bigInteger.equals(Object obj);//比较是否相同
bigInteger.pow(int exponet);//次幂
bigInteger.max/min(Biginteger val);//返回较大较小值
bigInteger.intValue(Biginteger val);//转为int类型整数,抄书范围数据有误
对象一旦创建,内部记录的值不能发生改变,且必须是整数,不能是小数
底层存储方式
- 对于计算机而言,没有数据类型的概念,都是010101
- 数据类型是编程语言自己规定的
BigDecimal
用于小数的精确运算
用来表示很大的小数
缺陷:被21亿+ 所限制
构造方法:
通过构造方法创建对象
BigDecimal bigDecimal = new BigDecimal(double a);//结果不精确,不建议使用
BigDecimal bigDecimal = new BigDecimal(String str);//精确的结果,推荐使用
通过静态方法获取对象:
BigDecimal bigDecimal = BigDecimal.valueOf(double a);//将double转化为String类型再创建
常用方法:
bigDecimal.add(BigDecimal val);//加法
bigDecimal.subtract(BigDecimal val);//减法
bigDecimal.multiply(BigDecimal val);//乘法
bigDecimal.divide(BigDecimal val);//除法,除不尽时,需要设置2,3参数 ↓
bigDecimal.divide(BigDecimal val,精确几位,舍入模式);//除法
舍入模式:RoundingMode.HALF_UP 四舍五入
RoundingMode.CEITING 向正无穷舍入
RoundingMode.DOWN 向0舍入
RoundingMode.HALF_DOWN 五舍六入
RoundingMode.HALF_EVEN 向偶数舍入
RoundingMode.UP 远离0舍入
存储方式
遍历每一位字符,获取相应的ASKLL表值分别进行存储
Date
JDK7以前的时间相关类
Date
全世界的时间,有一个统一的计算标注。
格林尼治时间/格林威治时间(Greenwich Mean Time)简称GMT;目前时间标准时间(UTC)已替换为原子钟
中国标准时间:世界标准时间+8小时
时间的换算单位:1秒=1000毫秒
1毫秒=1000微秒
1微秒=1000纳秒
Date类:一个JDK写好的JavaBean类,用来描述时间,精确到毫秒
利用空参构造创建对象,表示系统当前时间
利用有参构造创建对象,表示指定的时间
Date date = new Date();//创建一个Date对象,获取当前系统时间
Date date = new Date(Long 0L);//创建一个对象,并赋值指定时间,0L代表时间原点,1970年1月1日
date.setTime(Long 1000L);//修改时间
date.getTime();//获取当前时间的毫秒值
SimpleDateFormat
格式化:把时间转换为通俗的格式
解析:把字符串表示的时间变成Date对象
构造方法:
空参构造:SimpleDateFormat simpleDateFormat= new SimpleDateformat();
使用指定日期格式的构造:new SimpleDateformat(String pattern);
注:
创建对象的格式要跟时间字符串的格式完全一致,否则无法解析字符串时间
pattern:yyyy-MM-dd HH:mm:ss
yyyy年MM月dd日 HH:mm:ss
y:年 M: 月 d:日 H:时 m:分 s:秒 E:星期 a:上午/下午
常用方法:
simpleDateFormat.format(Date date);//格式化:将日期对象Date 转化为字符串
simpleDateFormat.parse(String source);//解析:将时间字符串转化为Date对象
Calendar
代表了系统当前时间的日历对象,可以单独修改,获取时间中的年,月,日
细节:Calendar使一个抽象类,不能直接创建对象
Calendar日历对象的获取方法
通过静态方法获取:
public static Calendar getInstance( );//获取当前时间的日历对象
常用方法:
calendar.getTime();//获取日期对象
calendar.setTime(Date date);//给日历设置日期对象,月份:0~11,星期1~7 表示周末~周六
calendar.getTimeInMillis();//获取时间的毫秒值
calendar.setTimeInMillis(Long millis);//给日历设置时间毫秒值
calendar.get(int field);//取日历中某个字段信息
calendar.set(int field , int value);//修改日历的某个字段信息
calendar.add(int field , int amount);//为某个字段 增加(+)/减少(-) 指定的值
field: 1:年 2:月 3:一年中的第几周
4:一月的第几周 5:一个月中的第几天 ...... 17:
常量:Calendar.YEAR ...... 调用常量进行代码编写
JDK8新增日期类
更简单,线程更安全
Date类:ZoneId:时区
Instant:时间戳
zoneDateTime:带时区的时间
日期格式化类:DateTimeFormatter:用于时间的格式化和解析
日历类:LocalDate:年,月,日
LocalTime:时,分,秒
LocalDateTime:年,月,日,时,分,秒
工具类:Duration:时间间隔(秒,纳秒)
Period:时间间隔(年,月,日)
ChronoUnit:时间间隔(所有单位)
ZoneId:时区
洲名/城市名国家名/城市名
ZoneId.getAvailableZoneIds();//获取Java中支持的所有时区
ZoneId.systemDefault();//获取系统默认时区
ZoneId.of();//获取一个指定时区
Instant:时间戳
Instant.now();//获取当前时间的Instant对象(标准时间)
Instant.ofXxxx(long epochMilli);//根据(秒/毫秒/纳秒) 获取Instant对象
Instant.atZone(ZoneId zone);//指定时区
Instant.isXxxx(Instant otherInstant);//判断系列的方法(Before/After)
Instant.minusXxxx(long millisToSubtract);//减少时间列的方法
Instant.plusXxxx(long millisToSubtract);//增加时间列的方法
ZoneDateTime:带市区的时间
DateTimeFormatter:时间格式化
日历类
LocalDate,LocalTime,LocalDateTime
类转换方法:
时间工具类
Duration:用具计算两个时间间隔(秒,纳秒)
Period:用于计算两个日期间隔(年,月,日)
ChronoUnit:用具计算两个日期间隔