常用API 集合框架认识 List集合 | DAY 5

目录

常用API

大数计算器

BigDecimal

BigInteger

时间类

LocalDate

LocalTime

LocalDateTime

自定义排序

集合框架认知

什么是集合?

集合体系继承树是什么样子的?

常用API有什么?

List 、Set、Map的区别?

集合框架的遍历方式有哪些?

List集合 

ArrayList

List集合底层分别是什么?List是否可重复?

ArrayList原理

LinkedList

手动实现一个ArrayList集合

常用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]);
    }


}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值