杨校老师课堂之Java基础集合专题知识点整理

简介: 杨校老师课堂之Java基础集合专题知识点整理

集合操作

1.ArrayList类、LinkedList类使用及分析

  • java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为 查询数据、遍历数据,所以 ArrayList 是最常用的集合。
  • 在教学及开发过程中,发现很多新人在编码时非常随意地去使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。
  • java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合 【LinkedList是一个双向链表】

图解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。

LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList 的特有方法即可。在开发时,LinkedList集合也可以作为堆栈。

import java.util.LinkedList;
 
public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList<String> link = new LinkedList<String>();
        //添加元素
        link.addFirst("abc1");
        link.addFirst("abc2");
        link.addFirst("abc3");
        System.out.println(link);
        // 获取元素
        System.out.println(link.getFirst());
        System.out.println(link.getLast());
        // 删除元素
        System.out.println(link.removeFirst());
        System.out.println(link.removeLast());
        //判断集合是否为空
        while (!link.isEmpty()) {
            //弹出集合中的栈顶元素
            System.out.println(link.pop()); 
        }
        System.out.println(link);
    }
}

2.HashSet、TreeSet 使用

简介:

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

特点:

List 接口不同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复

派生类:

Set 集合有多个子类,这里我们介绍其中的 java.util.HashSet 、 java.util.LinkedHashSet 这两个集合。

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

java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持。

举个栗子:

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

什么是哈希表呢?

JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。 但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。

JDK1.8开始,哈 希表存储采用数组+链表+红黑树实现当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找 时间。 简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示。

图解哈希表:

总而言之,JDK1.8引入红黑树大程度优化了HashMap的性能,那么对于我们来讲保证HashSet集合元素的唯一, 其实就是根据对象的hashCode和equals方法来决定的。

如果我们往集合中存放自定义的对象,那么保证其唯一, 就必须复写hashCode和equals方法建立属于当前对象的比较方式。

3.HashMap、TreeMap 类使用及分析

现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等, 这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即 java.util.Map 接 口。 我们通过查看

特点:

  • Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

派生类:

  • 通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合。

HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需 要重写键的hashCode()方法、equals()方法。

  • LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链 表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的 hashCode()方法、equals()方法。

Map接口中的常用方法:

public V put(K key, V value)                把指定的键与指定的值添加到Map集合中。

public V remove(Object key) :             把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值

public V get(Object key)                      根据指定的键,在Map集合中获取对应的值。

public Set keySet() :                            获取Map集合中所有的键,存储到Set集合中。

public Set> entrySet() :                        获取到Map集合中所有的键值对对象的集合(Set集合)

举个栗子:

import java.util.HashMap;
 
public class HashMapDemo {
    public static void main(String[] args) {
        //创建 map对象
        HashMap<String, String> map = new HashMap<>();
        //添加三个企业及其创始人到map集合
        map.put("腾讯", "马化腾");
        map.put("国美", "黄光裕");
        map.put("乐视", "贾跃亭");
        System.out.println(map);
        // 想要移出 key为乐视的元素
        System.out.println("从map中移出企业的创始人是:" + map.remove("乐视"));// 贾跃亭
        // 查看移出后、剩余哪些元素
        System.out.println("剩余的元素有:" + map); {腾讯=马化腾, 国美=黄光裕}
        // 想要查看 国美的创始人 是谁
        System.out.println("腾讯的创始人:"+ map.get("腾讯")); // 马化腾
        System.out.println("国美的创始人:"+ map.get("国美")); // 黄光裕
        // 想要查看 美团的创始人 是谁 ?  但是再map中没有存储过、因此会打印出null
        System.out.println("美团的创始人:"+ map.get("美团"));
    }
}

Map集合遍历键找值方式:

  • 键找值方式:即通过元素中的键,获取键所对应的值
  • 分析步骤:
  • 1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示: keyset()
  • 2. 遍历键的Set集合,得到每一个键。
  • 3. 根据键,获取键所对应的值。方法提示: get(K key) 

举个栗子:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
 
/*
第三种方法:打印 键值对
 */
public class HashMapDemo {
    public static void main(String[] args) {
        // 1. 创建 map对象
        HashMap<String, String> map = new HashMap<>();
        // 2. 添加三个企业及其创始人到map集合
        map.put("腾讯", "马化腾");
        map.put("国美", "黄光裕");
        map.put("乐视", "贾跃亭");
        // 3. 将双列集合map集合转换为单列集合set
        Set<Map.Entry<String, String>> set = map.entrySet();
        // 4. 通过单列集合set,调用foreach
       for(Map.Entry<String, String> founder : set ){
           System.out.println(founder);
       }
    }
}
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
 
/*
    第四种方法:打印 键值对
 */
public class HashMapDemo {
    public static void main(String[] args) {
        // 1. 创建 map对象
        HashMap<String, String> map = new HashMap<>();
        // 2. 添加三个企业及其创始人到map集合
        map.put("腾讯", "马化腾");
        map.put("国美", "黄光裕");
        map.put("乐视", "贾跃亭");
        // 3. 将双列集合map集合转换为单列集合set
        Set<Map.Entry<String, String>> set = map.entrySet();
        // 4. 通过单列集合set,调用迭代器
        Iterator<Map.Entry<String, String>> iterator = set.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> founder = iterator.next();
            System.out.println(founder);
        }
    }
}
/*
    需求:打印 键值对
*/
public class HashMapDem {
    public static void main(String[] args) {
        // 1. 创建 LinkedHashMap 类型的 linkedHashMap 对象
        LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
        // 2. 添加三个企业及其创始合
        linkedHashMap.put("腾讯", "马化腾");
        linkedHashMap.put("乐视", "贾跃亭");
        linkedHashMap.put("国美", "黄光裕");
        // 3.,取出元素。键找值方式
        Set<Map.Entry<String, String>> set = linkedHashMap.entrySet();
        for (Map.Entry<String, String> founder : set) {
            System.out.println(founder.getKey() + "的创始人是:" + founder.getValue());
        }
    }
}

4.其它常用集合类介绍

Collections类

  • java.utils.Collections 是集合工具类,用来对集合进行操作。部分方法如下:

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

public static void shuffle(List list)                                                  打乱顺序 :打乱集合顺序

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

public static void sort(List list,Comparator )                               将集合中元素按照指定规则排序

举个栗子:

import java.util.ArrayList;
import java.util.Collections;
 
public class CollectionsDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        // 原始方法是 一个一个添加!
        //list.add(12);
        //list.add(14);
        //list.add(15);
        //list.add(1000);
        //采用工具类 一次完成多个元素添加到集合中
        Collections.addAll(list, 5,29,32, 1,2);
        System.out.println(list);
        //排序方法
        Collections.sort(list);
        System.out.println(list);
    }
}

5.JUnit基本使用

JUnit 是一个 Java 编程语言的单元测试框架

使用方法:

1. 创建一个类 ,命名规范为:XxxTest

public class UserLoginTest {
 
}

2. 创建一个方法,方法名称命名规范为:testXzz

    public  void testLogin(){
        
    }

3. 在方法上一行加入annotation(注解):@Test

import org.junit.Test;
 
public class UserLoginTest {
 
    @Test
    public  void testLogin(){
 
    }
}
添加之后,会要求导入一个包。
运行方式:双击选中方法名称,右键run testLogin() 即可/或 选中 run Junit
 
注:
 
    单元测试方法的权限修饰符必须采用 public
    单元测试方法的返回值类型必须采用 void
    单元测试方法上一行必须引入@Test注解

目录
相关文章
|
24天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
34 3
|
5天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
11 2
|
4天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
9天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
9天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
9天前
|
Java 开发者
|
21天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
48 5
|
22天前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
48 3
|
9天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
10 0
|
14天前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
22 0