Java基础之集合框架详解

简介: Java基础之集合框架详解

集合是Java中提供的一种容器,可以存储多个数据。


集合和数组之间的差别

    数组的长度是固定的,集合的长度是可变的


    数组中存储的是同一类型的元素,可以存储基本数据类型的值。(可以是对象,可以是基本数据类型)


    集合存储的都是对象,而且对象的类型可以不一致。(只能是对象)


Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素。

它有两个重要的子接口,分别是 java.util.List 和 java.util.Set 。


    List 的特点是元素有序、元素可重复。


    Set 的特点是元素无序而且不可重复。


    List 接口的主要实现类有 java.util.ArrayList 和Java.util.LinkedList


    Set 接口的主要实现类有 java.util.HashSet 和 java.util.TreeSet

image.png

Collection接口中常用的方法

image.png

public static void main(String[]args){
  //创建集合对象,使用多态
  Collection<String>coll=newArrayList<>();
  System.out.println(coll);//空
  //add()方法 
  booleanb1=coll.add("小小张自由!");
  coll.add("小张!");coll.add("小小张!");
  coll.add("小小自由!");coll.add("小小张自由!");
  System.out.println(coll);
  //remove()方法
  coll.remove("小小张自由!");//重复值只删除第一个
  System.out.println(coll);
  //contains()方法判断集合中是否包含给定对象
  System.out.println(coll.contains("zyb"));
  System.out.println(coll.contains("小小张自由!"));
  //isEmpty();判断集合是否为空
  System.out.println(coll.isEmpty());
  //size()方法返回集合中元素的个数
  System.out.println(coll.size());
  //toArray()方法把集合中元素存储到数组中
  Object[]objects=coll.toArray();
  for(inti=0;i<objects.length;i++){
  System.out.println(objects[i]);
  }
    //遍历集合
  /*for(inti=0;i<coll.size();i++){
  System.out.println(coll[i]);
  }*/
  //清空
  coll.clear();
  System.out.println(coll);
}

List接口中常用的方法

public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。

public E get(int index):返回集合中指定位置的元素。

public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。

public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。


ArrayList集合

    java.util.ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。


LinkedList集合

java.util.LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。

LinkedList集合特有的方法


public void addFirst(E e):将指定元素插入此列表的开头。

public void addLast(E e):将指定元素添加到此列表的结尾。

public E getFirst():返回此列表的第一个元素。

public E getLast():返回此列表的最后一个元素。

public E removeFirst():移除并返回此列表的第一个元素。

public E removeLast():移除并返回此列表的最后一个元素。

public E pop():从此列表所表示的堆栈处弹出一个元素。

public void push(E e):将元素推入此列表所表示的堆栈。

public boolean isEmpty():如果列表不包含元素,则返回true。

private static void show01(){
  LinkedList<String>LinkedList=newLinkedList<String>();
  LinkedList.add("a");LinkedList.add("b");
  LinkedList.add("c");LinkedList.add("d");
  System.out.println("原始数组"+LinkedList);
  System.out.println(LinkedList.removeFirst());//移除第一个与pop()效果一样
  System.out.println(LinkedList.removeLast());
  LinkedList.addFirst("Java");//开头与push()效果一样
  LinkedList.addLast("promsing");//结尾与add()效果一样
  System.out.println(LinkedList);
  System.out.println(LinkedList.getFirst());//获取第一个
  System.out.println(LinkedList.getLast());//获取最后一个
}

set接口

java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比 Collection 接口更加严格了。


HashSet集合

java.util.HashSet 是 Set 接口的一个实现类, 它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。 java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持,

public class HashSetDemo { 
    public static void main(String[] args) { 
        //创建 Set集合
        HashSet<String> set = new HashSet<String>(); 
        //添加元素 
        set.add(new String("cba")); 
        set.add("abc"); 
        set.add("bac"); 
        set.add("cba"); 
        //遍历 
        for (String name : set) { 
            System.out.print(name); 
        } 
    } 
}
//输出结果为 cba  abc  bac

LinkedHashSet集合

HashSet 保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序就要用到LinkedHashSet集合。 它是链表和哈希表组合的一个数据存储结构。

public class LinkedHashSetDemo { 
    public static void main(String[] args) { 
        Set<String> set = new LinkedHashSet<String>(); 
        set.add("bbb"); 
        set.add("aaa"); 
        set.add("abc"); 
        set.add("bbc"); 
        Iterator<String> it = set.iterator(); 
        while (it.hasNext()) { 
            System.out.print(it.next()); 
        } 
    } 
}
//输出结果为 bbb   aaa  abc  bbc


Collections:集合工具类

public static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加一些元素。

public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。

public static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。

public static <T> void sort(List<T> list,Comparator<? super T> ) :将集合中元素按照指定规则排序。
public static void main (String[] args){
  ArrayList<String> list = new ArrayList<>();
  Collections.addAll(list,"a","b","c","d","e");//批量添加多个e
  System.out.println(list);
  Collections.shuffle(list);//打乱
  System.out.println(list);
}

双列集合Map

Map接口中常用的方法

image.png

public static void main(String[] args) { 
    //创建 map对象 
    HashMap<String, String> map = new HashMap<String, String>(); 
    //添加元素到集合 
    map.put("黄晓明", "杨颖"); 
    map.put("文章", "马伊琍"); 
    map.put("邓超", "孙俪"); 
    System.out.println(map); 
    //String remove(String key) 
    System.out.println(map.remove("邓超")); 
    System.out.println(map); 
    // 想要查看 黄晓明的媳妇 是谁 
    System.out.println(map.get("黄晓明")); 
    System.out.println(map.get("邓超")); 
}

Map集合的两种遍历方式

一、使用set方法 通过键找值的方式

public static void main(String[] args) {
        Map<String,Integer> map=new HashMap<>();
        map.put("郭靖",175);
        map.put("杨过",180);
        map.put("乔峰",183);
        map.put("无忌",177);
        //1、使用Map集合中的方法keySet()方法,把Map集合中所有的key取出来,存储到set集合中
        Set<String> set=map.keySet();
        //2、遍历set集合,获取Map集合中的每一个key
        //使用迭代器遍历set集合
        Iterator<String>iterator=set.iterator();
        while(iterator.hasNext()){
            String key=iterator.next();
            //3、通过Map集合中的方法get(),通过Key找到value
            Integer integer=map.get(key);//根据指定的键,找到对应的值
            System.out.println(key+","+integer);
        }
        System.out.println("增强For循环========");
        for(String key:set){
            Integer integer=map.get(key);//根据指定的键,找到对应的值
            System.out.println(key+","+integer);
        }
    }

二、使用Entry对象遍历map集合

public static void main(String[] args) {
        Map<String,Integer> map=new HashMap<>();
        map.put("郭靖",175);
        map.put("杨过",180);
        map.put("乔峰",183);
        map.put("无忌",177);
        //一、使用Map集合中的entrySet()方法,把Map集合中多个entry对象取出来,存储到Set集合中
        Set<Map.Entry<String,Integer>>set=map.entrySet();
        //二、遍历Set集合,获取每一个entry对象
        Iterator<Map.Entry<String,Integer>>iterator=set.iterator();
        while(iterator.hasNext()){
            Map.Entry<String,Integer>entry=iterator.next();
            String key=entry.getKey();
            Integer value=entry.getValue();
            System.out.println(key+","+value);
        }
        System.out.println("增强For循环==============");
        for(Map.Entry<String,Integer>entry:set){
        }
    }

LinkedHashMap:存储有序-它是链表和哈希表组合的一个数据存储结构。

public class LinkedHashMapDemo { 
        public static void main(String[] args) { 
            LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(); 
            map.put("邓超", "孙俪"); 
            map.put("李晨", "范冰冰"); 
            map.put("刘德华", "朱丽倩"); 
            Set<Entry<String, String>> entrySet = map.entrySet(); 
            for (Entry<String, String> entry : entrySet) { 
                System.out.println(entry.getKey() + " " + entry.getValue()); 
            }
        } 
    }
相关文章
|
4天前
|
Java 数据安全/隐私保护 Spring
Java 中 Spring Boot 框架下的 Email 开发
Java 中 Spring Boot 框架下的 Email 开发
29 2
|
4天前
|
存储 安全 算法
【常见集合】Java 常见集合重点解析
【常见集合】Java 常见集合重点解析
8 0
|
1天前
|
安全 Java 容器
Java一分钟之-高级集合框架:并发集合(Collections.synchronizedXXX)
【5月更文挑战第18天】Java集合框架的`Collections.synchronizedXXX`方法可将普通集合转为线程安全,但使用时需注意常见问题和易错点。错误的同步范围(仅同步单个操作而非迭代)可能导致并发修改异常;错误地同步整个集合类可能引起死锁;并发遍历和修改集合需使用`Iterator`避免`ConcurrentModificationException`。示例代码展示了正确使用同步集合的方法。在复杂并发场景下,推荐使用`java.util.concurrent`包中的并发集合以提高性能。
9 3
|
1天前
|
Java 开发者
Java一分钟之-高级集合框架:优先队列(PriorityQueue)
【5月更文挑战第18天】`PriorityQueue`是Java集合框架中的无界优先队列,基于堆数据结构实现,保证队头元素总是最小。常见操作包括`add(E e)`、`offer(E e)`、`poll()`和`peek()`。元素排序遵循自然排序或自定义`Comparator`。常见问题包括错误的排序逻辑、可变对象排序属性修改和混淆`poll()`与`peek()`。示例展示了自然排序和使用`Comparator`的排序方式。正确理解和使用`PriorityQueue`能提升应用性能。
13 6
|
1天前
|
存储 Java
Java一分钟之-高级集合框架:Queue与Deque接口
【5月更文挑战第18天】本文探讨Java集合框架中的`Queue`和`Deque`接口,两者都是元素序列的数据结构。`Queue`遵循FIFO原则,主要操作有`add/remove/element/peek`,空队列操作会抛出`NoSuchElementException`。`Deque`扩展`Queue`,支持首尾插入删除,同样需注意空`Deque`操作。理解并正确使用这两个接口,结合具体需求选择合适数据结构,能提升代码效率和可维护性。
11 4
|
2天前
|
存储 Java 容器
Java一分钟之-高级集合框架:LinkedList与TreeSet
【5月更文挑战第17天】这篇博客对比了Java集合框架中的LinkedList和TreeSet。LinkedList是双向链表,适合中间插入删除,但遍历效率低且占用空间大;TreeSet基于红黑树,保证元素有序且不重复,插入删除速度较LinkedList慢但查找快。选择时需根据操作需求和性能考虑。
12 2
|
3天前
|
存储 算法 Java
Java 集合框架
5月更文挑战第10天
|
4天前
|
SQL 缓存 Java
Java一分钟之-Hibernate:ORM框架实践
【5月更文挑战第15天】Hibernate是Java的ORM框架,简化数据库操作。本文列举并解决了一些常见问题: 1. 配置SessionFactory,检查数据库连接和JDBC驱动。 2. 实体类需标记主键,属性映射应匹配数据库列。 3. 使用事务管理Session,记得关闭。 4. CRUD操作时注意对象状态和查询结果转换。 5. 使用正确HQL语法,防止SQL注入。 6. 根据需求配置缓存。 7. 懒加载需在事务内处理,避免`LazyInitializationException`。理解和避免这些问题能提升开发效率。
19 0
|
4天前
|
XML Java 数据库连接
Java一分钟之MyBatis:持久层框架基础
【5月更文挑战第15天】MyBatis是Java的轻量级持久层框架,它分离SQL和Java代码,提供灵活的数据库操作。常见问题包括:XML配置文件未加载、忘记关闭SqlSession、接口方法与XML映射不一致、占位符使用错误、未配置ResultMap和事务管理不当。解决这些问题的关键在于正确配置映射文件、管理SqlSession、避免SQL注入、定义ResultMap以及确保事务边界。遵循最佳实践可优化MyBatis使用体验。
12 2
Java一分钟之MyBatis:持久层框架基础
|
4天前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
12 1