目录
常用API
大数计算器
BigDecimal
用于解决浮点运算时 出现结果失真的问题
构造器 | 说明 |
BigDecimal(String val) | 把String转换成BigDecimal |
方法 | 说明 |
valueOf | 转换一个double成BigDecimal |
add | 加法 |
subtract | 减法 |
multiply | 乘法 |
divide | 除法 |
divide(另一个BigDecimal,精确位数,舍入模式) | 可以控制精确到几位小数 |
doubleValue | 转换成double类型 |
double a= 0.1;
double b= 0.2;
double c= a=b;
System.out.println(c); //输出0.300000004
BigDecimal a1=new BigDecimal(Double.toString(a));
Bigdecimal a2=BigDecimal.valueOf(b);//两种方法都可以将小数转换成BigDecimal模式
Bigdecimal a3=a1.add(a2);
System.out.println(a3); //输出0.3
BigInteger
处理非常大的整数,或者需要执行超出 long
类型范围的整数运算
BigInteger bigInteger1 = new BigInteger("12345678901234567890");
BigInteger bigInteger2 = new BigInteger("98765432109876543210");
BigInteger sum = bigInteger1.add(bigInteger2);
System.out.println("Sum: " + sum);
与BigDecimal类似 每次对该对象操作时 都会返回一个新的对象
时间类
LocalDate
代表本地日期(年月日星期)
now()
: 返回表示当前日期的LocalDate
对象。of(int year, int month, int dayOfMonth)
: 根据指定的年、月和日创建一个LocalDate
对象。ofYearDay(int year, int dayOfYear)
: 根据指定的年和一年中的第几天创建一个LocalDate
对象。getYear()
: 获取年份。getMonth()
: 获取月份(返回一个Month
枚举)。getMonthValue()
: 获取月份的值(1-12)。getDayOfMonth()
: 获取一个月中的第几天。getDayOfWeek()
: 获取周几(返回一个DayOfWeek
枚举)。plusDays(long daysToAdd)
: 在当前日期上加指定的天数。minusMonths(long monthsToSubtract)
: 在当前日期上减去指定的月份数。isLeapYear()
: 判断是否是闰年。lengthOfYear()
: 获取当前年份的天数。lengthOfMonth()
: 获取当前月份的天数。compareTo(ChronoLocalDate<?> other)
: 比较两个日期,返回一个整数表示它们的大小关系。isBefore(ChronoLocalDate<?> other)
: 判断当前日期是否在另一个日期之前。isAfter(ChronoLocalDate<?> other)
: 判断当前日期是否在另一个日期之后。isEqual(ChronoLocalDate<?> other)
: 判断两个日期是否相等
LocalTime
代表本地时间(时分秒纳秒)
now()
: 返回表示当前时间的LocalTime
对象。of(int hour, int minute, int second, int nanoOfSecond)
: 根据指定的小时、分钟、秒和纳秒创建一个LocalTime
对象。getHour()
: 获取小时。getMinute()
: 获取分钟。getSecond()
: 获取秒。getNano()
: 获取纳秒。plusHours(long hoursToAdd)
: 在当前时间上加上指定的小时数。minusMinutes(long minutesToSubtract)
: 在当前时间上减去指定的分钟数。withHour(int hour)
: 替换当前时间的小时数。withMinute(int minute)
: 替换当前时间的分钟数。withSecond(int second)
: 替换当前时间的秒数。withNano(int nanoOfSecond)
: 替换当前时间的纳秒数。
LocalDateTime
代表本地日期时间(年月日时分秒纳秒)
now()
: 返回表示当前日期和时间的LocalDateTime
对象。of(LocalDate date, LocalTime time)
: 根据指定的日期和时间创建一个LocalDateTime
对象。toLocalDate()
: 获取LocalDateTime
对象的日期部分。toLocalTime()
: 获取LocalDateTime
对象的时间部分。plusHours(long hoursToAdd)
: 在当前日期时间上加上指定的小时数。minusMinutes(long minutesToSubtract)
: 在当前日期时间上减去指定的分钟数。atZone(ZoneId zone)
: 将LocalDateTime
转换为ZonedDateTime
,指定时区。atStartOfDay()
: 获取表示当天开始时间的LocalDateTime
对象(即 00:00)。toEpochMilli(ZoneId zone)
: 将LocalDateTime
转换为自1970-01-01T00:00:00Z以来的毫秒数,指定时区。compareTo(ChronoLocalDateTime<?> other)
: 比较两个日期时间对象,返回一个整数表示它们的大小关系
自定义排序
我们可以实现Comparator接口重写比较方法
例如
public class CustomSortExample {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 20));
people.add(new Person("Charlie", 30));
// 使用自定义比较器对people列表进行排序
Collections.sort(people, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge());
}
});
}
}
集合框架认知
什么是集合?
在Java中,集合(Collection)是一种数据结构,它用于存储多个对象,并且提供了一个统一的接口来管理这些对象。Java集合框架是Java标准库中的一个重要部分,它提供了多种集合类型,以满足不同的数据存储需求。
集合体系继承树是什么样子的?
常用API有什么?
-
boolean add(E e) 添加元素
-
addAll() 把集合全部数据添加到当前集合
-
void clear() 清空集合元素
-
boolean isEmpty() 判断是否为空
-
int size()获取集合大小
-
boolean contains(Object obj)判断是否包含某个元素
-
boolean remove(E e)删除某个元素 默认删除前面的元素
-
Object[] toArray()把集合转换成数组
List 、Set、Map的区别?
- List允许元素重复,且元素有序。
- Set不允许元素重复,且元素无序(但某些实现如LinkedHashSet保持插入顺序)。
- Map以键值对形式存储元素,键不允许重复,但值可以。Map中的元素也是无序的,但某些实现如TreeMap对元素进行了排序。
集合框架的遍历方式有哪些?
-
for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
-
迭代器
-
Iterator<String> it=list.iterator();
-
it.hasnext() it.next
-
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
}
-
增强for循环
for (String fruit : list) {
System.out.println(fruit);
}
-
lambda表达式
ist.forEach(fruit -> System.out.println(fruit));
// 或者使用方法引用
list.forEach(System.out::println);
List集合
ArrayList
-
基于数组实现
-
查询速度快(根据索引查询数据快)
-
删除效率低 (需要把后面数组进行秦阿姨)
-
添加效率极低(后面数据)
-
List集合底层分别是什么?List是否可重复?
ArrayList原理
-
默认创建为0的数组
-
添加第一个数据 时创建新的长度为10 的数组
- 数据存满时 数组扩容为1.5倍 然后迁移到新数组
LinkedList
-
基于双链表实现
-
查询慢 (无论查询那个数据都要从头开始找)
-
增删快
-
双向链表 查询速度快于单向 比较索引位置选择从头搜索或尾部搜索
-
相比较map集合 list可以重复
手动实现一个ArrayList集合
public class myArrayList {
private final double NN=1.5; //数组扩容系数
private int[] arr;
private int currentNum=10; //当前数组存储的最大值
private int current=0; //当前数组存储的值
myArrayList()
{
arr=new int[10];
}
//随机读取一个数
public int get(){
int a = 0; // 范围的开始
int b = current; // 范围的结束
Random rand = new Random();
int randomNum = a + rand.nextInt(b - a + 1);
return arr[randomNum];
}
//在指定坐标下添加数值
public boolean add(int index,int val)
{
if(index>current){//数组
return false;
}
else {
if((current+1<currentNum)) {
for (int i = current; i >= index; i--) {
arr[i + 1] = arr[i];
}
arr[index] = val;
return true;
}
else
{
enrich();
add(index,val);
}
}
return true;
}
// 在后面自动添加数值
public boolean add(int val)
{
if(current<currentNum) {
arr[current] = val;
current++;
return true;
}
else {
enrich();
add(val);
return true;
}
}
//判断是否含有某个值
public boolean contains(int val)
{
for(int i:arr)
{
if(i==val)
return true;
}
return false;
}
//返回元素个数
public int size()
{
return arr.length;
}
public int indexOf(int val)
{
for(int i=0;i<arr.length;i++)
{
if(val==arr[i]){
return i;
}
}
return -1;
}
//数组扩容
private void enrich()
{
currentNum= (int) ((int)currentNum*NN);
int[] temp=new int[currentNum];
int j=0;
for(int i:arr)
{
temp[j++]=i;
}
arr=temp;
}
public void printArr()
{
for(int i=0;i<current-1;i++){
System.out.print(arr[i]+" ");
}
System.out.println(arr[current-1]);
}
}