强化基础-Java-集合

news2024/11/28 11:38:51

这块的知识点比较零碎也是看到了就过来记录一点,可能是之前没有特别注意的,会持续补充

集合

1 通用实现

  • List
  • Set
  • SortedSet(如果表达是有序的,返回签名使用有序set来表达)
  • NavigableSet(since 1.6)
  • Queue (since 1.5)
  • Deque(since 1.6)
  • SortedMap
  • NavigableMap(since 1.6)
    在这里插入图片描述
    Map允许为空的的value
    ConcurrentHashMap value 不允许为空,如果value为空在查询数据时会产生歧义,到底是值为空还是线程不可见

2 并发实现

  • ConcurrentMap(since 1.5)
  • ConcurrentNavigableMap(since 1.6)
  • BlockingQueue
  • TransferQueue
  • BlockingDeque
  • LinkedBlockingQueue
  • ArrayBlockingQueue
  • PriorityBlockingQueue
  • DelayQueue
  • SynchronousUqueu
  • LinkedBlockingDeque
  • LinkedTransferQueue
  • CopyOnWriteArrayList
  • CopyOnWriteArraySet
  • ConcurrentSkipListSet
  • ConcurrentSkipListMap

3 遗留实现

  • Vector
    vector 是数组实现线程安全的,他也是实现了List,一般对标的是ArrayList
    如果在一个方法里面使用vector 几乎没有同步的消耗,因为它不存在资源竞争。
  • Stack
  • Hashtable
  • Enumeration
  • BitSet
    这里Vector,Stack,Hashtable都是线程安全的

Collection 顶层接口

这里只对值得记录的知识点做一个记录,其它平时比较熟悉的基础知识这里不再记录。

  • int size();
public interface Collection<E> extends Iterable<E> {
    // 这个size最多为Integer.MAX_VALUE
    int size();
}

为什么不用Long类型呢?
因为Long和double 是非线程安全的,有两个四字节,高位和地位。
补充知识:

// 这两个都是true
System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE + 2 == Integer.MIN_VALUE + 1);

Object[] toArray() 与 T[] toArray(T[] a) 的区别

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
// 区别转换为对象数组
Object[] one = list.toArray();
System.out.println("length : " + one.length);
Arrays.stream(one).forEach(System.out::println);
System.out.println("========>");
// 允许我们指定输出的类型,并且如果我们指定的数组比真实数据多,后面的空间全赋值为null
Integer[] two = list.toArray(new Integer[10]);
// 并且如果我们指定了数组的长度我们的长度以指定的数组为准
System.out.println("length : " + two.length);
Arrays.stream(two).forEach(System.out::println);
System.out.println("========>");
// 如果我们指定的数组长度小于原始,它会以原始的数据为准,也就是说不会少数据
Integer[] three = list.toArray(new Integer[3]);
System.out.println("length : " + three.length);
Arrays.stream(three).forEach(System.out::println);

为什么Collection里面有add 队列里面还有自己的add方法呢?
我们看到这个约束其实是不一样的,集合可能是只读的,所以有UnsupportedOperationException异常。
在这里插入图片描述

在这里插入图片描述

Set 与 Map

1 set是map key 的实现,Set底层调用Map实现。

// 我们还可以看到如果是set其实他的value都是指向同一个对象
private static final Object PRESENT = new Object();
public HashSet() {
   map = new HashMap<>();
}

2 treeSet底层用了TreeMap

public TreeSet() {
    this(new TreeMap<E,Object>());
}

3 LinkedHashMap

// 有一个这个属性 其实就是实现的LRU算法
final boolean accessOrder;

在插入元素以后:

//执行了这个方法 LinkedHashMap 是有实现的
afterNodeInsertion()
// 而HashMap没有实现这个方法里面是空的什么也没有做
void afterNodeInsertion(boolean evict) { }

为什么HashSet不能保证有序?

public class TT {
    public static void main(String[] args) {
        // 不能保证有序
        Set<String> values = new HashSet<>();
        values.add("a");
        values.add("b");
        values.add("c");
        values.forEach(System.out::println);
        values.clear();
        values.add("1");
        values.add("2");
        values.add("3");
        values.forEach(System.out::println);
        // 上面的这两个场景之所以能保证有序是因为这些例子都是 ASCII码
        // 字符数组底部就是一个char数组
        // char 的 hash 转换为了int
        public static int hashCode(char value) {
            return (int)value;
        }
        // String hash 按照下面规则进行计算所以看起来是有序的样子
        public int hashCode() {
            int h = hash;
            if (h == 0 && value.length > 0) {
                char val[] = value;

                for (int i = 0; i < value.length; i++) {
                    h = 31 * h + val[i];
                }
                hash = h;
            }
            return h;
        }
       
    }
}

设计贴士:

// 这里之所以要设计为传对象是兼容多维数组
public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

List有两种实现(ArrayList 是数组实现,LinkedList)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1562522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024 年最值得阅读的 ChatGPT 书籍

自ChatGPT问市以来&#xff0c;其全球风靡之势标志着生成式人工智能新纪元的到来。尽管在ChatGPT之前&#xff0c;大型语言模型(LLM)已存在&#xff0c;但其便捷访问和用户友好界面无疑将LLM的应用推向了新高度。至2024年&#xff0c;ChatGPT持续作为热门话题&#xff0c;本文旨…

Qt加载.css/.qss文件设置控件的QSS样式(支持程序运行时修改且立即生效类似换肤效果)

初学Qt时要想通过QSS修改控件QWidget&#xff0c;QPushButton等原生基础控件的样式&#xff0c;一般都是直接在.ui文件中直接添加qss&#xff0c;或者在代码中通过setStyleSheet(QString qss)来设置。当程序很大时&#xff0c;很多地方需要复用样式时会非常麻烦&#xff0c;qss…

CCIE-12-IPSec-VPN-RemoteAccess

目录 实验条件网络拓朴实验目的 开始配置1. R2 Ping R3确定基础网络是通的2. 配置R23. 配置R53. 验证 实验条件 网络拓朴 实验目的 为R2和R3建立IPSec VPN R4可以ping通R5 开始配置 R2&#xff1a;模拟需要远程访问网络的网关 R4&#xff1a;模拟需要远程访问网络内的目标主…

问题2-前端json数组数据转换成csv文件

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>将 JSON 数据导出为 CSV 文件</title> …

node.js的模块化 与 CommonJS规范

一、node.js的模块化 (1)什么是模块化&#xff1f; 将一个复杂的程序文件依据一定的规则拆分成为多个文件的过程就是模块化 在node.js中&#xff0c;模块化是指把一个大文件拆分成独立并且相互依赖的多个小模块&#xff0c;将每个js文件被认为单独的一个模块&#xff1b;模块…

【蓝桥杯】积木

积木 题目描述 小明用积木搭了一个城堡。 为了方便&#xff0c;小明在搭的时候用的是一样大小的正方体积本&#xff0c;搭在了一个 n 行 m 列的方格图上&#xff0c;每个积木正好占据方格图的一个小方格。 当然&#xff0c;小明的城堡并不是平面的&#xff0c;而是立体的。…

mac如何检测移动硬盘 mac硬盘检测工具 Tuxera怎么用 Tuxera NTFS官网

在工作学习中&#xff0c;我们都绕不开用移动硬盘来拷贝存储一些文件。但是在使用过程中&#xff0c;我们经常遇到“mac检测不到移动硬盘”“移动硬盘不存在”等问题&#xff0c;今天本文就带大家了解下mac如何检测移动硬盘&#xff0c;mac硬盘检测工具。 一、mac如何检测移动…

C++ —— C++11新增语法

目录 一&#xff0c;列表初始化 1.1 这是什么&#xff1f; 1.2 initializer_list 1.3 在容器的运用 1.4 STL中的变化 二&#xff0c;右值引用和左值引用 2.1 是什么&#xff1f; 2.2 这两个东西有啥关系&#xff1f; 2.3 有啥用&#xff1f; 三&#xff0c;*移动构…

智乃想考一道鸽巢原理

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

【御控物联】JavaScript JSON结构转换(14):对象To数组——规则属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

实验:基于Red Hat Enterprise Linux系统的创建磁盘和磁盘分区(一)

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 fdisk [参数] [设备] 1. 为虚拟机添加1块大小为3-5G的硬盘nvme&#xff0c;将该硬盘划分1个主分区和两个逻辑分区分别为600MB。 partprobe [选项] [设备] 2. 将主分区格式化为ext4文件系统并挂载到/自己名字命名…

【Go】十五、接口、多态、断言

文章目录 1、接口的引入2、接口3、接口的注意点4、多态5、断言6、Type Switch 1、接口的引入 以日常生活中打招呼为例&#xff0c;定义接口规范&#xff0c;各国人为打招呼为具体的实现 package main import "fmt"//接口的定义&#xff1a;定义规则、定义规范&…

3. WiFi基本原理

1. WiFi简介 WiFi的全称是Wireless Fidelity。它是一种无线网络通信技术&#xff0c;由Wi-Fi联盟拥有&#xff0c;目的是改善基于IEEE 802.11标准的无线网络产品之间的互通性&#xff0c;允许电子设备在没有物理连接的情况下进行高速数据传输。此外&#xff0c;WiFi也被视为IE…

手搓Docker-Image-Creator(DIC)工具(03):实现alpine+jre的镜像

此篇博客将介绍如何使用 Docker 创建一个alpine3.10-jre1.8.0_401 的 Docker 镜像&#xff0c;并使用 Docker 运行起来。将用到 Dockerfile 的 COPY 命令、RUN 命令、ENV 命令&#xff0c;最终实现基于单一应用的 Dockerfile 构建镜像和运行。 紧急修改&#xff1a;代码我是在m…

代码随想录第27天| 39. 组合总和

39. 组合总和 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 带你学透回溯算法-组合总和&#xff08;对应「leetcode」力扣题目&#xff1a;39.组合总和&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 给你一个 无重复元…

理解 SQL 数据添加:从基础到实践

引言&#xff1a; 在现代软件开发中&#xff0c;数据库是不可或缺的一部分。而 SQL 作为结构化查询语言的代表&#xff0c;广泛应用于数据库管理系统中&#xff0c;为我们提供了强大的数据管理和查询能力。 主题&#xff1a; 我们将从基础的 SQL INSERT INTO 语句开始&…

使用Pollard_rho算法分解质因数

分解质因数的朴素算法 最简单的算法即为从 [2, sqrt&#xff08;N&#xff09;] 进行遍历。 vector<int> breakdown(int N) {vector<int> result;for (int i 2; i * i < N; i) {if (N % i 0) { // 如果 i 能够整除 N&#xff0c;说明 i 为 N 的一个质因子。…

鸿蒙原生应用开发-网络管理Socket连接(一)

一、简介 Socket连接主要是通过Socket进行数据传输&#xff0c;支持TCP/UDP/TLS协议。 二、基本概念 Socket&#xff1a;套接字&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 TCP&#xff1a;传输控制协议(Transmission Control Protocol)。是一…

HarmonyOS 应用开发之Worker

Worker主要作用是为应用程序提供一个多线程的运行环境&#xff0c;可满足应用程序在执行过程中与主线程分离&#xff0c;在后台线程中运行一个脚本操作耗时操作&#xff0c;极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。 Worker运作机制 图1 Worker运作机制示意…

联通iccid 19转20 使用luhn 算法的计算公式

联通iccid 19转20 使用luhn 算法的计算公式 第一次对接iccid 才知道 使用的是luhn 算法 19转20位 文章来源于 文章来源 当时也是一脸懵逼 的状态&#xff0c;然后各种chatgpt 寻找&#xff0c;怎么找都发现不对&#xff0c;最后看到这片java的文章实验是正确的&#xff0c;因…