java中集合API

发布于:2025-06-27 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、简述

  • Collection:
    最基础的集合接口,所有具体集合类都直接或简介实现了这个接口
  • Map:
    以键值对方式存储
  • Iterator:
    迭代器,常用语遍历集合中的元素

二、Collection

在这里插入图片描述

常见方法:

  • add(E e): 将元素添加到集合中,如果集合不支持添加操作则抛出UnsupportedOperationException异常。
  • clear():清空操作
  • contains(Object o): 是否包含指定元素,有则返回true/无 false
  • isEmpty(): 是否为空
  • iterator():返回一个迭代器,用于遍历元素
  • remove(Object o):从集合中移除指定元素
  • size(): 返回集合元素个数
  • toArray():将集合中元素转换为数组

(1).List

  • 有序性:List保持元素的插入顺序。
  • 可重复性:List允许同一个元素出现多次。
  • 索引访问:提供了基于索引(可以理解为下标)的方法来访问和修改列表中的元素。

1.ArrayList:

数组列表,既有数组的特性又有列表的特性,能够动态调整列表大小,访问元素非常快,单插入和删除操作较慢,尤其是列表中间进行这些操作,原因是需要移动元素

import java.util.ArrayList;

public class ArrayListDemo01 {
    public static void main(String[] args) {
		ArrayList<String> 	zqstar = new ArrayList<>();

		//添加
		zqstar.add("内马尔");
		zqstar.add("德布劳内");
		zqstar.add("萨拉赫");

		if(zqstar.contains("内马尔")){
			System.out.println("内马尔 is in the list.");
		}

		// 获取并打印指定索引处的元素
        String secondZqStar = zqstar.get(1);
        System.out.println("Second zqstar is: " + secondZqStar);
		// 替换指定位置的元素
        zqstar.set(2, "博格巴");
        System.out.println("List after replacement: " + zqstar );
		// 删除指定位置的元素
        zqstar.remove(1);
        System.out.println("List after deletion: " + zqstar);
        // 清空列表
        zqstar.clear();
        System.out.println("List is empty now? " + zqstar.isEmpty());
		
	}
}

手搓简易版ArrayList

package com.example.test.api;

import java.util.Arrays;

public class MyArrayList {
    /*存储数据*/
    private Object[] data;
    private int size;

    /*用于记录有效元素的个数*/
    public MyArrayList() {
        this.data = new Object[16];
    }

    public MyArrayList(int capacity) {
        this.data = new Object[capacity];
    }

    //向size位置添加新的元素
    public void add(Object element) {
        //判断是否需要扩容
        if (size == data.length) {
            data = Arrays.copyOf(data, 2 * data.length);
        }
        //存储
        data[size] = element;
        size++;
    }

    //删除
    public boolean remove(Object obj) {
        if (size == 0) return false;
        //遍历找元素
        boolean flag = false;
        for (int i = 0; i < size; i++) {
            if (data[i].equals(obj)) {
                //从i+1开始,将后面的元素往前移动一位(删除下标为i的元素)
                System.arraycopy(data, i + 1, data, i, size - i - 1);
                flag = true;
                break;
            }
        }
        if (!flag) return false;
        data[--size] = null;
        size--;
        return true;
    }

    public int size() {
        return size;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < size; i++) {
            sb.append(data[i]).append(",");
        }
        sb.deleteCharAt(sb.lastIndexOf(","));
        sb.append("]");
        return sb.toString();
    }
}


2. LinkedList

实现了List接口,底层是双向链表

  • 优点:插入或删除元素的性能较好,适合频繁进行首尾插入和删除操作的场景。
  • 缺点:读取元素时需要从头或尾开始遍历链表,性能较差,不适合需要随机访问元素的场景。
package api;

import java.util.ArrayList;
import java.util.LinkedList;

public class LinkedListTests {
    public static void main(String[] args) {
        LinkedList<Integer> list=new LinkedList<>();
        list.add(100);
        list.add(200);
        //在头部添加
        list.addFirst(500);
        //在尾部添加
        list.addLast(600);
        System.out.println(list);
        //移除头部元素,返回值为被移除的元素
        Integer first = list.removeFirst();
        //移除尾部元素,返回值为被移除的元素
        Integer last = list.removeLast();
        System.out.println("first="+first+";last="+last);
        System.out.println(list);
        System.out.println(list.contains(Integer.valueOf(200)));
    }
}

(2) Set

HashSet
实现了Set接口,不允许元素重复,无序
添加、查询和删除等操作都具有较高的效率

package api;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

public class HashSetTests {
    public static void main(String[] args) {
        Collection c1=new HashSet();
        c1.add("one");
        c1.add("one");//不会添加重复元素
        c1.add("two");
        System.out.println(c1.size());
        System.out.println(c1);
        Set<Integer> c2=new HashSet<>();
        c2.add(100);
        c2.add(100);
        c2.add(200);
        c2.add(200);
        System.out.println(c2);
        c2.remove(200);
        System.out.println(c2);
    }
}

三、Map

键值对方式存储

1.HashMap

底层数据结构是散列桶(数组、链表、红黑树),数组用于存储桶,桶里装着一个链表或红黑树。
java8之后,链表为了解决哈希冲突,链表长度大于8之后会转换为红黑树,红黑树的节点小于6时会转换为链表。取8为临界值是因为可以更好的平衡时间和空间复杂度。
**特点:**无序,键和值都允许为null,非同步,不是线程安全的
put()方法插入键值对
get() 方法获取指定键对应的值
remove() 删除指定键的值
遍历:

//键值对的方式
 for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
     System.out.println("键: " + entry.getKey() + ", 值: " + entry.getValue());
        }

//键找值的方式
//所有key取出来存到一个Set集合中
Set<String> keySet = map.keySet();

//迭代器遍历
Iterator<Map.Entry<String,Integer>> iterator = entrySet.iterator();
While (iterator.hasNext()) {
	Map.Entry<String,Integer> entry = iterator.next();
	String key = entry.getKey();
	Integer value = entry.getValue();
	System.out.println(key+","+value);
}

2. TreeMap

底层是红黑树
**特点:**数据有序,比HashMap多实现了NavigableMap接口,非同步

三、Iterator接口

常见方法
hasNext() 判断是否还有下一个元素,boolean类型
next()获取当前指针指向的元素,调用移动指针

Collection c = new ArrayList();
        c.add(100);
        c.add(200);
        c.add("Hello kugou");
        Iterator iterator = c.iterator();
        while (iterator.hasNext()){
            Object obj = iterator.next();;
            System.out.println(obj);
        }

Collections工具类

1.对集合元素进行排序

List<Integer> List = Arrays.asList(array);数组转换为List
Collections.sort(list);
System.out.println(list);

//实现Comparable接口
package api;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Student implements Comparable<Student>{
    private String name;
    private int score;
    public Student(String name,int score){
        this.name=name;
        this.score=score;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }

    /**
     * 当我们使用Collections的sort方法进行排序时,
     * 底层会调用待排序对象内部的compareTo方法
     * @param o the object to be compared.
     * @return 0表示等于,负数小于,正数表示大于
     */
    @Override
    public int compareTo(Student o) {
        return this.score-o.score;
    }
}
/**
 * 通过Collections对多个学生按成绩进行排序.
 */
public class CollectionSortDemo02 {
    public static void main(String[] args) {
        List<Student> list=new ArrayList<>();
        list.add(new Student("Tony",91));
        list.add(new Student("Mike",90));
        list.add(new Student("Jack",97));
        Collections.sort(list);
        System.out.println(list);
    }
}

)

2.基于Comparator,自定义方法(内部类)进行排序

package api;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**电影对象类型*/
class Film{
    private String name;
    private int score;
    public Film(String name,int score){
        this.name=name;
        this.score=score;
    }

    public int getScore() {
        return score;
    }

    @Override
    public String toString() {
        return "Film{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}
public class CollectionSortDemo03 {
    public static void main(String[] args) {
        Film f1=new Film("马尔扎哈",90);
        Film f2=new Film("阿斯特拉",87);
        Film f3=new Film("魔童哪吒",93);
        List<Film> list=new ArrayList<Film>();
        list.add(f1);
        list.add(f2);
        list.add(f3);
        Collections.sort(list,new Comparator<Film>(){
        @Override
        public int compare(Film o1,Film o2){
        return o1.getScore()-o2.getScore();
        }
     });
     System.out.println(list);
  }
}   

网站公告

今日签到

点亮在社区的每一天
去签到