08、API

本文探讨了API的概念,介绍了Java中的字符串处理工具如StringBuilder、StringJoiner以及内存原理,包括Math、System、Object等类的使用,重点讲解了对象克隆、数值类如BigInteger和BigDecimal的特性,同时涵盖了JDK8的新日期类和第三方工具gson.jar的使用。
摘要由CSDN通过智能技术生成

API


API:Application Programming Interface 应用程序变成接口。

简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可。

JavaAPI:指的就是JDK中提供的各种功能的Java类。

API帮助文档:帮助开发人员更好的使用API和查询API的一个工具。

JDK-API.CHM

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类型整数,抄书范围数据有误
     

对象一旦创建,内部记录的值不能发生改变,且必须是整数,不能是小数

底层存储方式

  1. 对于计算机而言,没有数据类型的概念,都是010101
  2. 数据类型是编程语言自己规定的

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.DOWN0舍入
			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:用具计算两个日期间隔

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack丶空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值