【java笔记】java中的常用容器

news/2024/9/28 11:12:12 标签: 容器, list, queue, map, set

本文参考了知乎作者“Hello浩辰”的Java容器详解Ⅰ——概述和菜鸟教程的相关文章。

一、常用容器

img

java容器分为两大部分:Collection和Map。Collection是单个元素的集合,又可以分为List、Queue和Set。Map用来存储一组键值对,又可以分为HashMap和TreeMap。

二、List列表

List的特点就是所有的元素是可以重复的。

1. ArrayList

ArrayList是一个可以动态增长的数组, ArrayList由于底层是使用数组实现的,所以随机访问速度快,插入删除较慢。

(1) 常用方法:

  • add():添加元素
  • addAll():将集合中的所有元素添加到ArrayList中
  • clear():清空元素
  • contains():判断元素是否在ArrayList中
  • get():根据索引获取元素
  • remove():根据索引删除元素
  • size():返回ArrayList大小
  • set():根据索引修改元素

(2) 实例:

package ecnu.cn;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

public class MyTest {

    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        // 增加元素
        sites.add("Zhihu");
        sites.add("Google");
        sites.add("Taobao");
        sites.add("Runoob");
        sites.add("Temp");
        // 修改元素
        sites.set(2, "Tianmao");
        // 删除元素
        sites.remove(4);
        // 获取元素
        System.out.println("下标为1的元素:" + sites.get(1));
        // 获取大小
        System.out.println("size: " + sites.size());
        // 判断元素是否存在
        System.out.println("Taobao是否存在:"+sites.contains("Taobao"));

        // 使用迭代器遍历
        Iterator<String> it = sites.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + "  ");
        }
        System.out.println("\n");

        // 普通遍历
        for (int i = 0; i < sites.size(); i++) {
            System.out.print(sites.get(i) + " ");
        }

        // 排序
        Collections.sort(sites);
        // 遍历
        for (String site : sites) {
            System.out.print(site + " ");
        }
        System.out.println("\n");

        // 清空
        sites.clear();
        System.out.println("size: " + sites.size());
    }
}

(3) 使用场景:

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

2. LinkedList

LinkedList是使用双向链表实现的,在列表中插入和删除速度快,但是查找需要遍历整个链表,速度较慢。使用LinkedList可以实现很多队列、栈的数据结构。

(1) 常用方法:

  • add():添加元素
  • addFirst():在头部添加元素
  • addLast:在尾部添加元素
  • addAll():将集合中的所有元素添加到LilnkedList中
  • clear():清空元素
  • contains():判断元素是否在LilnkedList中
  • get():根据索引获取元素
  • getFirst():获取头部元素
  • getLast():获取尾部元素
  • remove():根据索引删除元素
  • removeFirst():删除头部元素
  • removeLast():删除尾部元素
  • size():返回LilnkedList大小
  • set():根据索引修改元素

(2) 实例:

package ecnu.cn;

import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;

public class MyTest {

    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<>();
        // 增加元素
        sites.add("Zhihu");
        sites.add("Google");
        sites.add("Taobao");
        // 在头部添加
        sites.addFirst("Runoob");
        // 在尾部添加
        sites.addLast("Temp");
        // 修改元素
        sites.set(2, "Tianmao");

        // 普通遍历
        // size()获取大小
        for (int i = 0; i < sites.size(); i++) {
            // 获取元素
            System.out.print(sites.get(i) + " ");
        }
        System.out.println("\n");

        // 删除元素
        sites.remove(4);
        // 删除头部元素
        sites.removeFirst();
        // 删除尾部元素
        sites.removeLast();
        // 获取first元素
        System.out.println("First:" + sites.getFirst());
        // 获取last元素
        System.out.println("Last: "+sites.getLast());
        // 判断元素是否存在
        System.out.println("Taobao是否存在:"+sites.contains("Taobao"));

        // 使用迭代器遍历
        Iterator<String> it = sites.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + "  ");
        }
        System.out.println("\n");


        // 排序
        Collections.sort(sites);
        // 遍历
        System.out.println("排序后:");
        for (String site : sites) {
            System.out.print(site + " ");
        }
        System.out.println("\n");

        // 清空
        sites.clear();
        System.out.println("size: " + sites.size());
    }
}

(3) 使用场景:

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

3. Vector

Vector是一个已经被弃用的类,因为他是线程同步的,而我们平时使用的时候都是非同步的,使用同步的坏处就是会在一个记录上加锁,防止多个程序访问同一条数据导致数据不同步。这样会导致访问速度变慢。

三、Queue队列

队列是一个满足“先进先出”的数据结构。

1. LinkedList

LinkedList提供了方法支持队列操作,并且实现了Queue接口,所以LinkedList是队列的一种实现,可以通过LinkedList向上转型为Queue。

2. PriorityQueue

PriorityQueue是优先级队列。

四、Set集合

集合中的元素不可以重复。

1. HashSet

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

  • HashSet 允许有 null 值。

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

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

  • HashSet 实现了 Set 接口。

(1) 常用方法

  • add():添加元素
  • addAll():将集合中的所有元素添加到HashSet中
  • clear():清空元素
  • contains():判断元素是否在HashSet中
  • remove():根据索引删除元素
  • size():返回HashSet大小

(2) 实例

package ecnu.cn;

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;

public class MyTest {

    public static void main(String[] args) {
        HashSet<String> sites = new HashSet<>();
        // 增加元素
        sites.add("Zhihu");
        sites.add("Google");
        sites.add("Taobao");
        sites.add("Runoob");
        sites.add("Temp");

        // 删除元素
        sites.remove(4);
        // 判断元素是否存在
        System.out.println("Taobao是否存在:"+sites.contains("Taobao"));

        // 使用迭代器遍历
        Iterator<String> it = sites.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + "  ");
        }
        System.out.println("\n");


        // 遍历
        for (String site : sites) {
            System.out.print(site + "  ");
        }
        System.out.println("\n");

        // 清空
        sites.clear();
        System.out.println("size: " + sites.size());
    }
}

2. TreeSet

TreeSet底层使用的是红黑树。

五、Map映射

Map是使用键值对存储的一种结构,所以在处理列如单词统计等方面是杀手锏。

1. HashMap

HashMap更适合查找、删除、插入。

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

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

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

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

(1) 常用方法

  • clear():清空HashMap
  • size():获取大小
  • put():添加键值对
  • putAll():将所有键值对添加到HashMap中
  • containKey():是否包含key
  • containValue():是否包含value
  • get():根据key获取value
  • keySet():获取key的集合
  • values():获取所有value

(2) 实例

package ecnu.cn;

import java.util.HashMap;
import java.util.Iterator;

public class MyTest {

    public static void main(String[] args) {
        HashMap<Integer, String> sites = new HashMap();
        // 增加元素
        sites.put(1, "Zhihu");
        sites.put(2, "Google");
        sites.put(3, "Taobao");
        sites.put(4, "Runoob");
        sites.put(5, "Temp");

        // 删除元素
        sites.remove(4);
        // 是否包含key
        System.out.println("是否包含为5的key:"+sites.containsKey("5"));
        // 是否包含value
        System.out.println("是否包含为Taobao的value:"+sites.containsValue("Taobao"));

        // 遍历
        // 获取所有key的集合
        for (Integer key : sites.keySet()) {
            // 根据key获取value
            System.out.println("key: " + key + "  value: " + sites.get(key));
        }
        System.out.println();

        // 遍历所有的值
        for (String value : sites.values()) {
            System.out.print(value + "  ");
        }
        System.out.println("\n");

        // 清空
        sites.clear();
        System.out.println("size: " + sites.size());
    }
}

2. TreeMap

TreeMap更适合遍历。


http://www.niftyadmin.cn/n/968274.html

相关文章

【java笔记】Java中的Stream流操作

本文摘自菜鸟教程。 流Stream可以让你以一种声明的方式处理数据&#xff0c;这种风格将要处理的元素集合看作一种流&#xff0c; 流在管道中传输&#xff0c; 并且可以在管道的节点上进行处理&#xff0c; 比如筛选&#xff0c; 排序&#xff0c;聚合等。 -------------------…

【java笔记】java中的CountDownLatch线程同步工具

本文摘自简书用户“码农历险记”的文章。 CountDownLatch是一个同步工具类&#xff0c;它允许一个或多个线程一直等待&#xff0c;直到其他线程执行完后再执行。 1. CountDownLatch原理 CountDownLatch是通过一个计数器来实现的&#xff0c;计数器的初始化值为线程的数量。每…

wordpress批量翻译中文固定链接到英文

很多朋友采用文章标题作为固定链接&#xff0c;如果没有安装别名翻译插件&#xff0c;就会导致固定链接是中文的&#xff0c;很不美观。很多人是后来才知道安装插件的&#xff0c;那么以前的很多旧文章固定链接怎么办呢&#xff1f;接下来就为大家介绍一款支持批量翻译固定链接…

【java笔记】java中的线程池ThreadPoolExecutor的原理和使用

本文摘自简书作者“juconcurrent”的文章java线程池的使用。 线程池顾名思义就是存放线程的池子&#xff0c;本质是一种对象池&#xff0c;用来管理线程资源。线程池的使用避免了每次使用线程时重复的创建线程&#xff0c;而是从线程池中取出一个线程来执行任务&#xff0c;执行…

查看电脑端口占用情况

方法一&#xff1a;在运行中输入cmd&#xff0c;进入命令行&#xff0c;然后输入netstat -ano 就可以查看电脑各个端口的事情情况了&#xff0c;后面的pid是对应的进程的id&#xff0c;可以在Task Manager&#xff08;CtrlAtlDel呼唤出)点View->Select Columns找到&#xff…

【java笔记】java中线程池之ForkJoinPool的原理及使用

本文参考自CSDN作者 YourBatman 的ForkJoinPool线程池的使用以及原理和知乎作者 欣然 的文章高并发之Fork/Join框架使用及注意事项。 ForkJoinPool 主要用于实现“分而治之”的算法&#xff0c;特别是分治之后递归调用的函数&#xff0c;例如 quick sort 等。ForkJoinPool 最适…

通过SQL Server 2008 访问Oracle 10g

之前写过一篇关于SQL Server 访问MySQL 数据库的文章&#xff0c;最近正好又遇到需要访问Oracle 的情况&#xff0c;将配置过程记录下来也供大家参考。 准备工作 事先在需要访问Oracle 数据库的主机上完成以下工作&#xff1a; 1. 安装SQL Server 数据库&#xff1a;SQL Server…

【java笔记】java中ThreadLocal的原理和使用

本文参考了文章一针见血ThreadLocal和文章ThreadLocal作用、场景、原理。 1. 概念 ThreadLocal并不是一个Thread&#xff0c;而是Thread的局部变量&#xff0c;也许把它命名为ThreadLocalVariable更容易让人理解一些。 ThreadLocal是解决线程安全问题一个很好的思路&#xff0…