目录
什么是API?
API(Application Programming interface) :应用程序编程接口,就是Java帮我们已经写好一些程序,如:类、方法等,我们直接拿过来用就可以解决一些问题,开发效率更高
常见API
String
创建对象封装字符串数据的方式
方式一: 直接使用双引号“...”
方式二: new String类,调用构造器初始化字符串对象
public String() // 创建一个空白字符串对象,不含有任何内容
public String(String original) //根据传入的字符串内容,来创建字符串对象
public String(char[] chars) //根据字符数组的内容,来创建字符串对象
public String(byte[] bytes) //根据字节数组的内容,来创建字符串对象
常用方法
public int length() //获取字符串的长度返回(就是字符个数)
public char charAt(int index) //获取某个索引位置处的字符返回
public char[] toCharArray() //将当前字符串转换成字符数组返回
public boolean equals(Object anObject) //判断当前字符串与另一个字符串的内容一样,一样返回true
public boolean equalsIgnoreCase(String anotherString) //判断当前字符串与另一个字符串的内容是否一样(忽略大小写)
public String substring(int beginIndex, int endIndex) //根据开始和结束索引进行截取,得到新的字符串(包前不包后)
public String substring(int beginIndex) //从传入的索引处截取,截取到末尾,得到新的字符串返回
public String replace(CharSequence target, CharSequence replacement) //使用新值,将字符串中的旧值替换,得到新的字符串
public boolean contains(CharSequence s) //判断字符串中是否包含了某个字符串
public boolean startsWith(String prefix) //判断字符串是否以某个字符串内容开头,开头返回true,反之
public String[] split(String regex) //把字符串按照某个字符串内容分割,并返回字符串数组回来
使用时的注意事项
第一点
String对象的内容不可改变,被称为不可变字符串对象。
第二点
只要是以“...”方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份;
但通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中
Java存在编译优化机制,程序在编译时: “a” + “b” + “c” 会直接转成 “abc”,以提高程序的执行性能,故在字符常量池里面
知识问答
字符串的比较使用==比较好吗?为什么?什么时候使用==?
不好,对于字符串对象的比较,==比较的是地址,容易出业务bug
基本数据类型的变量或者值应该使用==比较。
比较字符串推荐使用什么方式比较?
使用String提供的equals方法,它只关心字符串内容一样就返回true。
方法名
equals
equalsIgnoreCase
ArrayList
什么是集合?
集合是一种容器,用来装数据的,类似于数组,但和数组不同的是长度可变
有数组,为啥还学习集合?
数组定义完成并启动后,长度就固定了。
集合大小可变,开发中用的更多
ArrayList<E>
用的最多、最常见的一种集合。
构造器
public ArrayList() 创建一个空的集合对象
常用方法名
public boolean add(E e) //将指定的元素添加到此集合的末尾
public void add(int index,E element) //在此集合中的指定位置插入指定的元素
public E get(int index) //返回指定索引处的元素
public int size() //返回集合中的元素的个数
public E remove(int index) //删除指定索引处的元素,返回被删除的元素
public boolean remove(Object o) // 删除指定的元素,返回删除是否成功
public E set(int index,E element) //修改指定索引处的元素,返回被修改的元素
知识问答
方式一:每次删除一个数据后,索引-1。
方式二:从集合后面遍历然后删除,可以避免漏掉元素。
Arrays
用来操作数组的一个工具类。可以用内容.split("分隔符");
常见方法
public static String toString(类型[] arr) //返回数组的内容
public static int[] copyOfRange(类型[] arr, 起始索引, 结束索引) //拷贝数组(指定范围)
public static copyOf(类型[] arr, int newLength)//拷贝数组
public static setAll(double[] array, IntToDoubleFunction generator)//把数组中的原数据改为新数据
public static void sort(类型[] arr)//对数组进行排序(默认是升序排序)
sort若存储的是对象
方法1.让该对象的类实现Comparable(比较规则)接口,然后重写compareTo方法,自己在方法中制定比较规则。
比较对象中带字符串的比较方式this.name.compareTo(s.name);忽略大小写比较 o1.compareToIgnoreCase(o2)
方法2.创建Comparator比较器接口的匿名内部类对象,写在生成的对象(数组,集合)构造中然后自己制定比较规则。 使用这个sort方法, public static <T> void sort(T[] arr,new Comparator<? super T> c)
自定义排序规则时,需要遵循的官方约定如下
return this.属性名-容器中已经存在的对象.属性名
如果认为左边对象大于右边对象返回正整数
如果认为左边对象小于右边对象返回负整数
如果认为左边对象等于右边对象返回0整数
eg:排身高可用Double
return Double.compare(值1,值2);
Object
作用
Object类是Java中所有类的祖宗类,因此,Java中所有类的对象都可以直接使用Object类中提供的一些方法。
Object类的常见方法
public String toString()//返回对象的字符串表示形式。
//存在的意义就是为了被子类重写,以便返回对象具体的内容。
public boolean equals(Object o)//判断两个对象是否相等。
//直接比较两个对象的地址是否相同完全可以用“==”替代equals,为了被子类重写,以便子类自己来定制比较规则(比如比较对象内容,如果两个都是null,则会报错,空指针异常)
protected Object clone()//对象克隆,复制一个一模一样的新对象返回。
浅克隆
拷贝出的新对象,与原对象中的数据一模一样(引用类型拷贝的只是地址)
super.clone();
深克隆
对象中基本类型的数据直接拷贝。
对象中的字符串数据拷贝的还是地址。
对象中包含的其他对象,不会拷贝地址,会创建新对象。
用法
1.子类需要重写clone方法;
2.子类需要实现Cloneable(标记)接口
3.默认super.clone()是浅拷贝,深拷贝需要自己手动拷贝引用类型
//深拷贝自己手动拷贝引用类型
Student stu = (Student) super.clone();
stu.score = stu.score.clone();
return stu;
Objects
作用
是一个工具类,提供了很多操作对象的静态方法给我们使用。
Objects类的常见方法
public static boolean equals(Object a, Object b)
//先做非空判断,再比较两个对象更安全
public static boolean isNull(Object obj)
//判断对象是否为null,为null返回true ,反之
public static boolean nonNull(Object obj)
//判断对象是否不为null,不为null则返回true, 反之
包装类
为什么要有包装类
为了万物皆对象,并且泛型和集合都不支持基本类型,支持包装类
包装类有哪些?
8种,int -> Integer , char -> Character,其他的都是首字母大写
//Integer构造方法(过时)
Integer i1=new Integer("200"或100);
//静态方法(代替构造)
Interger i2=Integer.valueOf("200"或100);
//将字符串转换成int数值
String age="19";
int intage= Integer.parseInt(age);
//将Integer对象封装成数值转为String类型
String s=i2.toString();
自动装箱,底层调用valueOf方法
基本数据类型可以自动转换为包装类型
把基本类型的数据转换成对应的包装类(字符串类型)。
public static String toString(double d)
public String toString()
eg:Integer in=100;底层调用valueOf方法
等同于Integer in=Integer.valueOf(100);
自动拆箱,底层调用intValue方法
包装类型可以自动转换为基本数据类型。
可以把字符串类型的数值转换成数值本身对应的数据类型。
public static int parseInt(String s)
public static Integer valueOf(String s)
eg:int num=in;底层调用intValue方法
等同于int num=in.intValue方法;
反编译
通过javac-p 字节码文件名,查看底层对应的valueof和intValue方法
StringBuilder和StringBuffer
StringBuilder
可变字符串对象,相当于是一个容器,它里面装的字符串是可以改变的,就是用来操作字符串的。
与String的比较
StringBuilder比String更适合做字符串的修改(频繁的拼接、修改)操作,效率会更高,代码也会更简洁。
String不可变字符串、频繁操作字符串会产生很多无用对象,性能差。
注意:如果操作字符串较少,或者不需要操作,以及定义字符串变量,还是建议用String。
构造器
public StringBuilder()//创建一个空白的可变的字符串对象,不包含任何内容
public StringBuilder(String str)//创建一个指定字符串内容的可变字符串对象
方法
public StringBuilder append(任意类型)//添加数据并返回StringBuilder对象本身
public StringBuilder reverse()//将对象的内容反转
public int length()//返回对象内容长度
public String toString()//通过toString()就可以实现把StringBuilder转换为String
StringBuffer
StringBuffer的用法与StringBuilder是一模一样的
两者的比较
StringBuilder是线程不安全的
StringBuffer是线程安全的
StringJoiner
StringJoiner是啥?
JDK8出现的一个可变的、操作字符串的容器。
使用它有什么好处?
使用它拼接字符串的时候,不仅高效,而且代码的编写更加的方便。
构造器
public StringJoiner (间隔符号)
//创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner (间隔符号,开始符号,结束符号)
//创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号
方法
public StringJoiner add (添加的内容)
//添加数据,并返回对象本身 数组内容遍历 SJ.add(ARR[i]+"");
public int length()
//返回长度 ( 字符出现的个数)
public String toString()
//返回一个字符串(该字符串就是拼接之后的结果)
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 double pow(double a,double b)//返回a的b次幂的值
public static double random()//返回值为double的随机值,范围[0.0,1.0)
System
System代表程序所在的系统,也是一个工具类。
常见方法
public static void exit(int status)//终止当前运行的Java虚拟机。
public static long currentTimeMillis()//返回当前系统的时间毫秒值形式
//指的是从1970年1月1日(算C语言的生日) 00:00:00走到此刻的总的毫秒数,应该是很大的。1s=1000ms。
public static void arraycopy()拷贝数组元素//arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数)
Runtime
Runtime是一个单例类。代表程序所在的运行环境。
常见方法
public static Runtime getRuntime()//返回与当前Java应用程序关联的运行时对象
public void exit(int status)//终止当前运行的虚拟机
public int availableProcessors()// 返回Java虚拟机可用的处理器数。
public long totalMemory()//返回Java虚拟机中的内存总量
public long freeMemory()//返回Java虚拟机中的可用内存
public Process exec(String command)//启动某个程序,并返回代表该程序的对象
BigDecimal
作用
用于解决浮点型运算时,出现结果失真的问题。
常见构造器
public BigDecimal(double val) //注意:不推荐使用这个将 double转换为 BigDecimal
public BigDecimal(String val) //把String转成BigDecimal
常用方法
public static BigDecimal valueOf(double val)//转换一个 double成 BigDecimal //eg:BigDecimal b1 = BigDecimal.valueOf(0.1)
public BigDecimal add(BigDecimal b)//加法
public BigDecimal subtract(BigDecimal b)//减法
public BigDecimal multiply(BigDecimal b)//乘法
public BigDecimal divide(BigDecimal b)//除法
public BigDecimal divide (另一个BigDecimal对象,精确几位,舍入模式) //除法、可以控制精确到小数几位
RoundingMode.HALF_UP//四舍五入
RoundingMode.UP//进一法
RoundingMode.FLOOP//去尾法
public double doubleValue()//将BigDecimal转换为double
传统日期时间(了解即可)
Date
代表的是日期和时间。
构造器
public Date()//创建一个Date对象,代表的是系统当前此刻日期时间。
public Date(long time)//把时间毫秒值转换成Date日期对象。
常见方法
public long getTime()//返回从1970年1月1日 00:00:00走到此刻的总的毫秒数
public void setTime(long time)//设置日期对象的时间为当前时间毫秒值对应的时间
SimpleDateFormat
代表简单日期格式化,可以用来把日期对象、时间毫秒值格式化成我们想要的形式。
常见构造器
public SimpleDateFormat(String pattern)//创建简单日期格式化对象,并封装时间的格式
格式化时间的方法
public final String format(Date date)//将日期格式化成日期/时间字符串
public final String format(Object time)//将时间毫秒值式化成日期/时间字符串
时间格式的常见符号:
yyyy-MM-dd HH:mm:ss
yyyy年MM月dd日 HH:mm:ss
把字符串时间解析成日期对象解析方法
public Date parse(String source)
Calendar
代表的是系统此刻时间对应的日历,通过它可以单独获取、修改时间中的年、月、日、时、分、秒等。
注意:calendar是可变对象,一旦修改后其对象本身表示的时间将产生变化。
常见方法
public static Calendar getInstance()//获取当前日历对象
public int get(int field)//获取日历中的某个信息。
public final Date getTime()//获取日期对象。
public long getTimeInMillis()//获取时间毫秒值
public void set(int field,int value)//修改日历的某个信息。
public void add(int field,int amount)//为某个信息增加/减少指定的值
JDK8开始新增的日期时间
为什么要学JDK 8新增的时间?
传统时间
1、设计不合理,使用不方便,很多都被淘汰了。
2、都是可变对象,修改后会丢失最开始的时间信息。
3、线程不安全。
4、只能精确到毫秒。
新时间(推荐使用)
1、设计更合理,功能丰富,使用更方便。
2、都是不可变对象,修改后会返回新的时间对象,不会丢失最开始的时间。
3、线程安全。
4、能精确到毫秒、纳秒。
小Tip
1秒=1000毫秒;
1毫秒=1000微秒;
1微秒=1000纳秒;
LocalDate
本地日期(年、月、日、星期)
public static Xxxx now()//获取系统当前时间对应的该对象
LocaDate ld = LocalDate.now();
public static Xxxx of(…)//获取指定时间的对象
LocalDate localDate1 = LocalDate.of(2099 , 11,11);
方法
public int geYear()//获取年
public int getMonthValue()//获取月份(1-12)
public int getDayOfMonth()//获取日
public int getDayOfYear()//获取当前是一年中的第几天
Public DayOfWeek getDayOfWeek()//获取星期几:ld.getDayOfWeek().getValue()
withYear、withMonth、withDayOfMonth、withDayOfYear//直接修改某个信息,返回新日期对象
plusYears、plusMonths、plusDays、plusWeeks//把某个信息加多少,返回新日期对象
minusYears、minusMonths、minusDays,minusWeeks//把某个信息减多少,返回新日期对象
equals isBefore isAfter//判断两个日期对象,是否相等,在前还是在后
LocalTime
本地时间(时、分、秒、纳秒)
public static Xxxx now()//获取系统当前时间对应的该对象
LocalTime lt = LocalTime.now();
public static Xxxx of(…)//获取指定时间的对象
LocalTime localTime1 = LocalTime.of(9, 8, 59);
方法
public int getHour()//获取小时
public int getMinute()//获取分
public int getSecond()//获取秒
public int getNano()//获取纳秒
withHour、withMinute、withSecond、withNano//修改时间,返回新时间对象
plusHours、plusMinutes、plusSeconds、plusNanos//把某个信息加多少,返回新时间对象
minusHours、minusMinutes、minusSeconds、minusNanos//把某个信息减多少,返回新时间对象
equals isBefore isAfter//判断2个时间对象,是否相等,在前还是在后
LocalDateTime
本地日期、时间(年、月、日、星期、时、分、秒、纳秒)
public static Xxxx now()//获取系统当前时间对应的该对象
LocalDateTime ldt = LocalDateTime.now();
public static Xxxx of(…)//获取指定时间的对象
LocalDateTime localDateTime1 = LocalDateTime.of(2025, 11, 16, 14, 30, 01);
方法
getYear、getMonthValue、getDayOfMonth、getDayOfYear,getDayOfWeek、getHour、getMinute、getSecond、getNano
//获取年月日、时分秒、纳秒等
withYear、withMonth、withDayOfMonth、withDayOfYear,withHour、withMinute、withSecond、withNano
//修改某个信息,返回新日期时间对象
plusYears、plusMonths、plusDays、plusWeeks,plusHours、plusMinutes、plusSeconds、plusNanos
//把某个信息加多少,返回新日期时间对象
minusYears、minusMonths、minusDays、minusWeeks,minusHours、minusMinutes、minusSeconds、minusNanos
//把某个信息减多少,返回新日期时间对象
equals isBefore isAfter
//判断2个时间对象,是否相等,在前还是在后
转换相关的API
LocalDate
public LocalDate toLocalDate()//转换成一个LocalDate对象
LocalTime
public LocalTime toLocalTime()//转换成一个LocalTime对象
ZoneId
时区Id
中国标准时间: 世界标准时间(UTC) + 8小时
常见方法
public static Set<String> getAvailableZoneIds()// 获取Java中支持的所有时区
public static ZoneId systemDefault()//获取系统默认时区
public static ZoneId of(String zoneId)//获取一个指定时区
ZoneDateTime
时区时间
public static ZonedDateTime now() //获取当前时区的ZonedDateTime对象
public static ZonedDateTime now(ZoneId zone) //获取指定时区的ZonedDateTime对象
getYear、getMonthValue、getDayOfMonth、getDayOfYeargetDayOfWeek、getHour、getMinute、getSecond、getNano
//获取年月日、时分秒、纳秒等
public ZonedDateTime withXxx(时间) //修改时间系列的方法
public ZonedDateTime minusXxx(时间) //减少时间系列的方法
public ZonedDateTime plusXxx(时间) //增加时间系列的方法
Instant
时间线上的某个时刻/时间戳,通过获取Instant的对象可以拿到此刻的时间,该时间由两部分组成:从1970-01-01 00:00:00 开始走到此刻的总秒数 + 不够1秒的纳秒数
方法
public static Instant now() //获取当前时间的Instant对象(标准时间)
public long getEpochSecond()//获取从1970-01-01T00:00:00开始记录的秒数。
public int getNano()//从时间线开始,获取从第二个开始的纳秒数
plusMillis plusSeconds plusNanos//增加时间系列的方法
minusMillis minusSeconds minusNanos//减少时间系列的方法
equals、isBefore、isAfter//判断系列的方法
作用
可以用来记录代码的执行时间,或用于记录用户操作某个事件的时间点。
优点
可以精确到纳秒,并且是不可变对象,推荐用Instant代替Date。
DateTimeFormatter
格式化器,用于时间的格式化、解析
方法
DateTimeFormatter
public static DateTimeFormatter ofPattern(时间格式) //获取格式化器对象
public String format(时间对象) //格式化时间
LocalDateTime
public String format(DateTimeFormatter formatter)//格式化时间
public static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) //解析时间
Duration
可以用于计算两个时间对象相差的天数、小时数、分数、秒数、纳秒数;支持LocalTime、LocalDateTime、Instant等时间。
方法
public static Duration between(开始时间对象1,截止时间对象2) //传入2个时间对象,得到Duration对象
public long toDays()//计算隔多少天,并返回
public long toHours()//计算隔多少小时,并返回
public long toMinutes()//计算隔多少分,并返回
public long toSeconds()//计算隔多少秒,并返回
public long toMillis()//计算隔多少毫秒,并返回
public long toNanos()//计算隔多少纳秒,并返回
Period
用于计算两个 LocalDate对象 相差的年数、月数、天
方法
public static Period between(LocalDate start, LocalDate end)//传入2个日期对象,得到Period对象
public int getYears()//计算隔几年,并返回
public int getMonths()//计算隔几个月,年返回
public int getDays()//计算隔多少天,并返回