一篇文章带你入门java集合

目录
  • 一、简介
    • 1、java集合框架图
    • 2、集合框架体系
    • 3、Set和List的区别
  • 二、ArrayList
    • 1、定义
    • 2、用实例了解ArrayList
  • 三、LinkedList
    • 1、语法
    • 2、示例
  • 四、HashSet
    • 1、定义
    • 2、语法
    • 3、示例
  • 五、HashMap
    • 1、定义
    • 2、语法
    • 3、示例
  • Java HashMap 方法
  • 六、Iterator(迭代器)
    • 1、定义
    • 2、示例
  • 七、List和数组互转
  • 总结

一、简介

1、java集合框架图

从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

  • 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。

2、集合框架体系

3、Set和List的区别

1)Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素

2)Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素

3)List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector>

二、ArrayList

1、定义

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。

ArrayList 继承了 AbstractList ,并实现了 List 接口。

ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.ArrayList; // 引入 ArrayList 类
ArrayList<E> objectName =new ArrayList<>();  // 初始化

2、用实例了解ArrayList

    @Test
	public void listTest(){
		List<Integer> list = new ArrayList<Integer>();
		//增加元素
		list.add(1);
		list.add(9);
		list.add(8);
		list.add(4);
		list.add(5);
		list.add(3);
		//访问
		System.out.println("list新增完元素访问:");
		for(int s : list){
			System.out.print(s+" ");
		}
		System.out.println();
		//用set方法修改
		list.set(2, 10);
		//访问
		System.out.println("list修改完元素访问:");
		for(int s : list){
			System.out.print(s+" ");
		}
		System.out.println();
		list.remove(2);
		//访问
		System.out.println("list删除完元素访问:");
		for(int s : list){
			System.out.print(s+" ");
		}
		System.out.println();
		//当前list大小
		System.out.println("list当前数据元素个数:"+list.size());
		//排序
		Collections.sort(list);//默认升序
		//访问
		System.out.println("list排序完元素访问:");
		for(int s : list){
			System.out.print(s+" ");
		}
		System.out.println();
	}

结果:

list新增完元素访问:
1 9 8 4 5 3
list修改完元素访问:
1 9 10 4 5 3
list删除完元素访问:
1 9 4 5 3
list当前数据元素个数:5
list排序完元素访问:
1 3 4 5 9

Java ArrayList 常用方法列表如下:

方法 描述
add() 将元素插入到指定位置的 arraylist 中
addAll() 添加集合中的所有元素到 arraylist 中
clear() 删除 arraylist 中的所有元素
clone() 复制一份 arraylist
contains() 判断元素是否在 arraylist
get() 通过索引值获取 arraylist 中的元素
indexOf() 返回 arraylist 中元素的索引值
removeAll() 删除存在于指定集合中的 arraylist 里的所有元素
remove() 删除 arraylist 里的单个元素
size() 返回 arraylist 里元素数量
isEmpty() 判断 arraylist 是否为空
subList() 截取部分 arraylist 的元素
set() 替换 arraylist 中指定索引的元素
sort() 对 arraylist 元素进行排序
toArray() 将 arraylist 转换为数组
toString() 将 arraylist 转换为字符串
ensureCapacity() 设置指定容量大小的 arraylist
lastIndexOf() 返回指定元素在 arraylist 中最后一次出现的位置
retainAll() 保留 arraylist 中在指定集合中也存在的那些元素
containsAll() 查看 arraylist 是否包含指定集合中的所有元素
trimToSize() 将 arraylist 中的容量调整为数组中的元素个数
removeRange() 删除 arraylist 中指定索引之间存在的元素
replaceAll() 将给定的操作内容替换掉数组中每一个元素
removeIf() 删除所有满足特定条件的 arraylist 元素
forEach() 遍历 arraylist 中每一个元素并执行特定操作

三、LinkedList

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。

链表可分为单向链表和双向链表。

一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接

一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。

Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。

与 ArrayList 相比,LinkedList 的增加和删除对操作效率更高,而查找和修改的操作效率较低。

以下情况使用 ArrayList :

频繁访问列表中的某一个元素。只需要在列表末尾进行添加和删除元素操作。

以下情况使用 LinkedList :

你需要通过循环迭代来访问列表中的某些元素。需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。

1、语法

// 引入 LinkedList 类
import java.util.LinkedList;
LinkedList<E> list = new LinkedList<E>();   // 普通创建方法
或者
LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表

2、示例

    @Test
	public void linkListTest(){
		LinkedList<Integer> nums = new LinkedList<Integer>();
		//添加
		nums.add(3);
		nums.add(5);
		nums.add(1);
		nums.add(8);
        System.out.println(nums);
        // 使用 addFirst() 在头部添加元素
        nums.addFirst(0);
        System.out.println(nums);
        nums.addLast(20);
        System.out.println(nums);
        //移除首位
        nums.removeFirst();
        System.out.println(nums);
        // 使用 getFirst() 获取头部元素
        System.out.println(nums.getFirst());
        //for循环迭代
        for (int size = nums.size(), i = 0; i < size; i++) {
            System.out.println(nums.get(i));
        }
	}

结果:

[3, 5, 1, 8]
[0, 3, 5, 1, 8]
[0, 3, 5, 1, 8, 20]
[3, 5, 1, 8, 20]
3
3
5
1
8
20

方法 描述
public boolean add(E e) 链表末尾添加元素,返回是否成功,成功为 true,失败为 false。
public void add(int index, E element) 向指定位置插入元素。
public boolean addAll(Collection c) 将一个集合的所有元素添加到链表后面,返回是否成功,成功为 true,失败为 false。
public boolean addAll(int index, Collection c) 将一个集合的所有元素添加到链表的指定位置后面,返回是否成功,成功为 true,失败为 false。
public void addFirst(E e) 元素添加到头部。
public void addLast(E e) 元素添加到尾部。
public boolean offer(E e) 向链表末尾添加元素,返回是否成功,成功为 true,失败为 false。
public boolean offerFirst(E e) 头部插入元素,返回是否成功,成功为 true,失败为 false。
public boolean offerLast(E e) 尾部插入元素,返回是否成功,成功为 true,失败为 false。
public void clear() 清空链表。
public E removeFirst() 删除并返回第一个元素。
public E removeLast() 删除并返回最后一个元素。
public boolean remove(Object o) 删除某一元素,返回是否成功,成功为 true,失败为 false。
public E remove(int index) 删除指定位置的元素。
public E poll() 删除并返回第一个元素。
public E remove() 删除并返回第一个元素。
public boolean contains(Object o) 判断是否含有某一元素。
public E get(int index) 返回指定位置的元素。
public E getFirst() 返回第一个元素。
public E getLast() 返回最后一个元素。
public int indexOf(Object o) 查找指定元素从前往后第一次出现的索引。
public int lastIndexOf(Object o) 查找指定元素最后一次出现的索引。
public E peek() 返回第一个元素。
public E element() 返回第一个元素。
public E peekFirst() 返回头部元素。
public E peekLast() 返回尾部元素。
public E set(int index, E element) 设置指定位置的元素。
public Object clone() 克隆该列表。
public Iterator descendingIterator() 返回倒序迭代器。
public int size() 返回链表元素个数。
public ListIterator listIterator(int index) 返回从指定位置开始到末尾的迭代器。
public Object[] toArray() 返回一个由链表元素组成的数组。
public T[] toArray(T[] a) 返回一个由链表元素转换类型而成的数组。

四、HashSet

1、定义

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。

HashSet 允许有 null 值。

HashSet 是无序的,即不会记录插入的顺序。

HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。

HashSet 实现了 Set 接口。

2、语法

import java.util.HashSet; // 引入 HashSet 类
HashSet<String> sites = new HashSet<String>();

3、示例

    @Test
	public void setTest(){
		Set<Integer> nums = new HashSet<Integer>();
		//添加
		nums.add(3);
		nums.add(5);
		nums.add(5);
		nums.add(5);
		nums.add(1);
		nums.add(8);
        System.out.println(nums);
        //判断元素是否存在
        System.out.println(nums.contains(8));
        nums.remove(1);  // 删除元素,删除成功返回 true,否则为 false
        System.out.println(nums);
        //计算大小
        System.out.println(nums.size());
        for (int i : nums) {//访问
            System.out.println(i);
        }
        //清除
        nums.clear();
        System.out.println(nums);
	}

结果:

[1, 3, 5, 8]
true
[3, 5, 8]
3
3
5
8
[]

五、HashMap

1、定义

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。

HashMap 是无序的,即不会记录插入的顺序。

HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。

HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。

2、语法

import java.util.HashMap; // 引入 HashMap 类
HashMap<Integer, String> Sites = new HashMap<Integer, String>();

3、示例

    @Test
	public void mapTest(){
		 // 创建 HashMap 对象 Sites
        HashMap<String, String> sites = new HashMap<String, String>();
        // 添加键值对
        sites.put("one", "Google");
        sites.put("two", "Runoob");
        sites.put("three", "Taobao");
        sites.put("four", "Zhihu");
        System.out.println(sites);
        //访问-根据key
        System.out.println(sites.get("four"));
        //删除
        sites.remove("four");
        System.out.println(sites);
        //计算大小
        System.out.println(sites.size());
        // 输出 key 和 value
        for (String i : sites.keySet()) {
            System.out.println("key: " + i + " value: " + sites.get(i));
        }
        // 返回所有 value 值
        for(String value: sites.values()) {
          // 输出每一个value
          System.out.print(value + ", ");
        }
	}

结果:

{four=Zhihu, one=Google, two=Runoob, three=Taobao}
Zhihu
{one=Google, two=Runoob, three=Taobao}
3
key: one value: Google
key: two value: Runoob
key: three value: Taobao
Google, Runoob, Taobao,

Java HashMap 方法

hashmap

Java HashMap 常用方法列表如下:

方法 描述
clear() 删除 hashMap 中的所有键/值对
clone() 复制一份 hashMap
isEmpty() 判断 hashMap 是否为空
size() 计算 hashMap 中键/值对的数量
put() 将键/值对添加到 hashMap 中
putAll() 将所有键/值对添加到 hashMap 中
putIfAbsent() 如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。
remove() 删除 hashMap 中指定键 key 的映射关系
containsKey() 检查 hashMap 中是否存在指定的 key 对应的映射关系。
containsValue() 检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace() 替换 hashMap 中是指定的 key 对应的 value。
replaceAll() 将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
get() 获取指定 key 对应对 value
getOrDefault() 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach() 对 hashMap 中的每个映射执行指定的操作。
entrySet() 返回 hashMap 中所有映射项的集合集合视图。
keySet() 返回 hashMap 中所有 key 组成的集合视图。
values() 返回 hashMap 中存在的所有 value 值。
merge() 添加键值对到 hashMap 中
compute() 对 hashMap 中指定 key 的值进行重新计算
computeIfAbsent() 对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
computeIfPresent() 对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。

六、Iterator(迭代器)

1、定义

Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。

Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。

2、示例

    @Test
	public void iteratorTest(){
		List<Integer> list = new ArrayList<Integer>();
		//增加元素
		list.add(1);
		list.add(9);
		list.add(8);
		list.add(4);
		list.add(5);
		list.add(3);
		Iterator<Integer> it = list.iterator();
		while(it.hasNext()){
			int i = it.next();
			System.out.print(i+" ");
		}
	}

结果:

1 9 8 4 5 3

七、List和数组互转

    @Test
	public void arrToListTest(){
		List<Integer> list = new ArrayList<Integer>();
		//增加元素
		list.add(1);
		list.add(9);
		list.add(8);
		list.add(4);
		list.add(5);
		list.add(3);
		Object[] arr = list.toArray();
		for(Object o : arr){
			System.out.print(o+" ");
		}
		System.out.println();
		List<Object> ll = Arrays.asList(arr);
		System.out.println(ll);
	}

结果:

1 9 8 4 5 3
[1, 9, 8, 4, 5, 3]

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • java 用redisTemplate 的 Operations存取list集合操作

    java redisTemplate 的 Operations存取list集合 一 .存取为list类型 @RestController @RequestMapping("/test") @Slf4j public class TestController { @Autowired private RedisTemplate redisTemplate; @ApiOperation("redis-savelist") @PostMapping("/redi

  • Java面试题冲刺第十一天--集合框架篇(2)

    目录 面试题1:说一下 HashMap 的实现原理? 正经回答: 深入追问: 追问1:如何实现HashMap的有序? 追问2:那TreeMap怎么实现有序的? 追问3:put方法原理是怎么实现的? 追问4:HashMap扩容机制原理 追问5:HashMap在JDK1.8都做了哪些优化? 追问6:链表红黑树如何互相转换?阈值多少? 面试题2:HashMap是线程安全的吗? 正经回答: 追问1:你是如何解决这个线程不安全问题的? 总结 面试题1:说一下 HashMap 的实现原理? 正经回答: 众所

  • Java集合案例之斗地主游戏

    本文实例为大家分享了Java集合案例之斗地主游戏的具体代码,供大家参考,具体内容如下 题目要求: 通过自制54张扑克牌,发给3人,留下3张底牌,分别显示不同人的手牌与底牌达到斗地主的游戏需求 算法思想: 1.4种花色,每种13张牌,使用for嵌套循环,产生52张牌再加入大小王 创建牌与花色: String[] hs = {"♠", "♥", "♣", "♦"}; String[] number = {"3"

  • Java实现RedisUtils操作五大集合(增删改查)

    前排提示,我在这个工具类加了@Component注解,如果在springboot的项目使用,记得通过@Autowired注入使用. import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.*; import org.springframework.stereotype.Component; import java.io.Serializabl

  • Java中forEach使用lambda表达式,数组和集合的区别说明

    1.数组怎么使用lambda 数组不能直接在forEach中使用lambda表达式 PartnerType[] values = PartnerType.values(); //提示Cannot resolve method 'forEach(<method reference>) values.forEach(System.out::println);//错误使用 想要使用必须转换,如下 (1)转成list (2)转成steam PartnerType[] values = PartnerT

  • 一篇文章带你入门java集合

    目录 一.简介 1.java集合框架图 2.集合框架体系 3.Set和List的区别 二.ArrayList 1.定义 2.用实例了解ArrayList 三.LinkedList 1.语法 2.示例 四.HashSet 1.定义 2.语法 3.示例 五.HashMap 1.定义 2.语法 3.示例 Java HashMap 方法 六.Iterator(迭代器) 1.定义 2.示例 七.List和数组互转 总结 一.简介 1.java集合框架图 从上面的集合框架图可以看到,Java 集合框架主要包

  • 一篇文章带你入门java面向对象

    目录 一.继承 示例: 二.重载 三.接口 1.接口与类相似点: 2.接口与类的区别: 3.语法 四.枚举 1.定义 2.迭代枚举元素 3.在 switch 中使用枚举类 总结 一.继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为 本章就以人.学生.老师作为例子.学生和老师都继承人这个对象,都有人的特征和行为,人就是父类,老师和学生就是子类 示例: 人类: package com.zhouzy.base.t7;

  • 一篇文章带你入门Java修饰符

    目录 定义 分类 访问控制修饰符 非访问控制修饰符 修饰符的使用说明 修饰类 修饰方法 访问控制修饰符 非访问控制修饰符 修饰变量 总结 定义 Java修饰符:修饰符用来定义类.方法或者变量,通常放在语句的最前端. 分类 主要分为2类: 访问控制修饰符 非访问控制修饰符 访问控制修饰符 可以使用访问控制符来保护对类.变量.方法和构造方法的访问.分为以下4中权限:private,default,protected,public. 权限说明: 修饰符 当前类 同包 子类(不同包) 不同包(其他类)

  • 一篇文章带你入门Java字面量和常量

    目录 引言 概念 字面量 字面量的分类 常量 总结 引言 ♀ 小AD:哥,前两天我没有闪现到刺客脸上了吧 ♂ 明世隐:在这方面做的有进步. ♀ 小AD:明哥教的好,通过学习Java关键字,游戏水平也得到了提升,一举两得,舒服. ♂ 明世隐:可是你看到残血还是上头啊,是了多少次,你说? ♀ 小AD:5.6次吧 ♂ 明世隐:岂止5.6,起码10次. ♀ 小AD:这不是看到200金币,经不住诱惑吗 ♂ 明世隐:关爱残血,你学哪里去了,游戏中就不能多一些人间的关爱吗?你就不能关爱一下放暑假的小弟弟小妹妹

  • 一篇文章带你入门Java接口

    目录 什么是接口: 关键字: 创建接口代码展示: 如何实现接口呢: 实现接口代码展示: 具体代码实现: 接口继承和类继承的区别: 总结 什么是接口: 接口是一系列方法的声明,是一些方法特征的集合 注意: 在接口中只有方法名,没有方法体! 关键字: interface(创建接口), implement(实现接口) 创建接口代码展示: public interface 接口名 { // 没有任何具体的实现 void 方法名(); //只有方法名,注意是; } 这样仅仅是创建了一个接口. 如何实现接口

  • 一篇文章带你入门Java继承

    目录 Java中继承 什么是继承: 为什么要用继承: 学习总结: 继承关键字:extends 总结 Java中继承 什么是继承: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 为什么要用继承: 可以去掉重复代码,方便后期维护 举个列子,大家应该都玩过英雄联盟,每个英雄都是一个类,如果说不用继承的话每次都要重复定义每个英雄的成员属性,如下图我举了一个MF,一个EZ的列子 public class MissFortu

  • 一篇文章带你入门Java封装

    目录 什么是封装 如何实现封装 代码展示 构造方法 注意点: 代码展示 总结 封装的优点 什么是封装 Java中的封装是将数据(变量)和作用于数据(方法)的代码作为一个单元包装在一起的机制. 在封装中,类的变量将从其他类隐藏,并且只能通过当前类的方法访问. 如何实现封装 可以分为两步: 第一步:将类的变量声明为private. 第二步:提供公共set和get方法来修改和获取变量的值. 代码展示 public class User { private String name; private in

  • 一篇文章带你入门Java数据结构

    目录 1.逻辑结构和物理结构 2.顺序结构,链式结构,栈,队列,二叉树 二叉树 普通二叉树: 满二叉树: 完全二叉树: 平衡二叉树: 排序二叉树: 二叉树的遍历: 总结 1.逻辑结构和物理结构 逻辑结构:    集合: 数据与数据之间没有任何关系 线性: 一对一关系 树型: 一对多关系 图型: 多对多关系 物理结构: 顺序结构(数组): 链式结构(链表): 2.顺序结构,链式结构,栈,队列,二叉树 顺序结构: 可扩容数组,底层用数组实现,顺序排列,标号连续,内存空间连续 优缺点: 查询速度快,在

  • 一篇文章带你入门Java基本概念

    目录 Java基本概念 一.JRE(Java运行时环境) 二.JDK(Java开发工具) 三.Java源代码文件(.class) 四.Java字节码文件(.java) 五.Java虚拟机(JVM) 六.跨平台运行 七.JDK与JRE.JVM的关系? 八.几个结论 总结 Java基本概念 JDK包含了不少Java开发相关命令.如,javac.java.javap.javaw.javadoc.虽然现在的Java开发都使用IDE完成,基本上不会直接使用这些命令.但是理解这些命令的用法,可以让我们更加扎

  • 一篇文章带你入门Java运算符

    目录 算数运算符(Arithmetic operator) 关系运算符(Relational operator) 逻辑运算符(Logical operator) 赋值运算符(Assignment Operators) 三元运算符(Ternary operator) 运算符优先级 标识符的命名规则和规范 关键字定义和特点 保留字 总结 运算符时一种特殊的符号,用以表示数据的运算,赋值和比较等. 算数运算符 赋值运算符 关系运算符 逻辑运算符 位运算符 三元运算符 算数运算符(Arithmetic

随机推荐