必须掌握的ArrayList,LinkedList,HashMap,HashTable,Collection,Colections

news2024/11/19 1:36:03

人的自由并不在于可以做他想做的事,而在于可以不做他不想做的事。
在这里插入图片描述

ArrayList和linkedList的区别

Array数组是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的

Array获取数据的时间复杂度是o(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有数据(删除数据以后,需要把后面所有的数据前移)

缺点:数组初始化时必须指定初始化长度,否则会报错

int[] a = new int[4]; // 推荐使用int[]这种方式初始化
int[] b = new int[]{1,2,3,4}
int c[] = {23,24,25,26}; // 长度:4 索引范围:[0,3]
  • List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection
  • List有两个重要的实现类:ArrayList和LinkedList
  • ArrayList:可以看作是能够自动增长容量的数组
  • ArrayList的toArrayList方法返回一个数组
  • ArrayList的asList方法返回的是一个列表
  • ArrayList底层的实现是Array,数组扩容实现
  • LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能,但在get和set方面弱于ArrayList,当然这些对比都是指数据量很大或者操作很频繁

HashMap和HashTable的区别

1、两者父类不同

HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类,不过他们都实现了map,Cloneable(可复制),Serializable(可序列化)这三个接口

2、对外提供的接口不同

HashTable比HashMap多提供了elments()和contains()两个方法

elments()方法继承自HashTable的父类Dictionnary,用于返回此HashTable中的value的枚举

contains()方法判断了该HashTable是否包含传入的value,他的作用与containsValue()一致,事实上,contansValue()就只是调用了contains()方法

3、对null的支持不同

HashTable:key和value都不能为null

HashMap:key可以为null,但是这样的key只能有一个,因为必须保证key的唯一性,可以有多个key值对应的value为null

4、安全性不同

HashMap是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自己处理多线程的问题

HashTable是线程安全的,他每个方法上都有synchronized关键字,因此可直接用于多线程中

虽然HashMap是线程不安全的,但是他的效率远远高于HashTable,这样设计是合理的,因为大部分的使用场景都是单线程。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap

ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为 ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。

5、初始容量大小和每次扩容量大小不同

6、计算hash值的方法不同

Collection与Collections的区别

Collection是集合类的上级接口,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack;

Collections是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种 集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的 Collection框架。
在这里插入图片描述

二分查找

题目:最长递增子序列

难度:🌟🌟🌟

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/longest-increasing-subsequence

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

请先思考!!!!

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

答答答答答答答答答答答

案案案案案案案案案案案

往往往往往往往往往往往

下下下下下下下下下下下

翻翻翻翻翻翻翻翻翻翻翻

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

class Solution {
    public int lengthOfLIS(int[] nums) {
        // 先定义一个一摸一样的空数组dp
        int[] dp = new int[nums.length];
        // 解题思路就是先将第一个数放到dp中,然后一次判断后面的数字,
        // 如果比他小就替换,如果比他大就放到下一个位置中,循环此操作
        int res = 0;
        for(int num : nums){
            int i = 0;
            int j = res;
            while(i < j){
                int m = (i + j) >> 1;
                if(dp[m] < num){
                    i = m + 1;
                }else {
                    j = m;
                }
            }
            dp[i] = num;
            if(res == j){
                res++;
            }
        }
        return res;
    }
}

题解:

思路就是先将第一个数放到dp中,然后一次判断后面的数字,如果比他小就替换,如果比他大就放到下一个位置中,循环此操作,如下:

第一次将nums[0]放到dp[0]里

nums:

108415116207

dp:

100000000

第二次比较dp[0]和nums[1] 10 > 8 所以将dp[0]的值替换成nums[1]

dp:

80000000

第三次比较dp[0]和nums[2] 8 > 4 所以将dp[0]的值替换成nums[2]

dp:

40000000

第四次比较dp[0]和nums[3] 4 > 1 所以将dp[0]的值替换成nums[3]

dp:

10000000

第五次比较dp[0]和nums[4] 1< 5。所以dp的下标++ 将nums[4]放到dp[1]中

dp:

15000000

第六次比较dp[1]和nums[5] 5 < 11所以dp的下标++ 将nums[5]放到dp[2]中

dp:

151100000

第七次比较dp[2]和nums[6] 11 > 6所以将dp[2]的值替换成nums[6]

dp:

15600000

。。。

最终得到的数据

dp:

15670000

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

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

相关文章

南卡OE系列再添新成员,造型犀利有型,性能强劲动听!

科技的快速发展让消费者对智能互联、操作体验、设计审美、安全健康等需求越发高涨&#xff0c;蓝牙耳机也正在由功能性向舒适性方向发展。如何提高蓝牙耳机的舒适度、拥有更舒适的听歌体验&#xff0c;成为蓝牙耳机品牌和消费者共同努力的方向。 Nank南卡&#xff1a;更专业的骨…

【Linux】单机版QQ之管道中的命名管道

还记得上一篇的匿名管道吗&#xff1f; 文章目录 前言一、命名管道总结 前言 命名管道是什么呢&#xff1f; 管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信。 如果我们想在不相关的进程之间交换数据&#xff0c;可以使用FIFO文…

一百零七、MySQL数据库的数据备份与数据恢复

MySQL数据库的数据备份与恢复主要有3种方法&#xff0c;前两种都是MySQL dump命令&#xff0c;第三种则是用Navicat工具直接备份。相比而言&#xff0c;第三种方法更加简单&#xff01; 1 方法一&#xff08;MySQL dump命令&#xff09; 1.1 登录MySQL [roothurys22 ~]# mysq…

Maya云渲染如何使用,Maya云渲染流程实操!

Maya 是一款专业的 3D 软件&#xff0c;用于创建逼真的角色和大片的效果&#xff0c;Maya可以加速工作流程&#xff0c;帮助您专注于创造力并按时完成任务。也可以为角色和场景添加精美的细节&#xff0c;并提供让客户满意的优质作品。更有无数业内顶级艺术家依靠 Maya来创作更…

【Halcon】新建程序 读取图片 路径设置

文章目录 1 新建程序2 读取一张图片3 图片路径4 图片格式读取报错5 快速添加 绝对路径 1 新建程序 点击新程序图标&#xff0c;即可新建&#xff1b; 程序另存为&#xff0c;会弹出保存路径 2 读取一张图片 read_image(Image,fabrik)此时工程路径下并没有图片&#xff1b; …

SpringBoot2 集成 ELK 实现日志收集

目录 一 简介 二 ELK 各组件作用 三 ELK 各组件安装 四 Spring Boot2 集成 logstash 一 简介 ELK 即 Elasticsearch、Logstash、Kibana 组合起来可以搭建线上日志系统&#xff0c;本文主要讲解使用ELK 来收集 SpringBoot2 应用产生的日志。 二 ELK 各组件作用 Elasticsea…

基于FPGA和Matlab实现的FFT功能验证

一 、FFT设计验证思路 1、基于Matlab与FPGA的混频sin信号的FFT验证&#xff0c;分别在Matlab和FPGA开发环境上实现相同的FFT功能设计。 2、Matlab平台开发&#xff0c;使用自带的fft函数与相关操作函数&#xff0c;绘制出混频sin信号&#xff0c;经过fft功能处理后的频谱图。 3…

2022 ios APP最新开发测试教程

转载&#xff1a;2022 ios APP最新开发测试教程1.本文详细介绍最新的在windows上进行ios app开发编译打包安装到手机测试的完整流程。介绍ios开发经常遇到的问题和解决方法&#xff0c;包括ios开发证书&#xff0c;ios开发描述文件等。http://kxdang.com/topic/appuploader/ios…

IP报文结构

文章目录 IP报文结构分片 IP报文结构 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. 4位头部长度(header length): 类似于TCP4位首部长度&#xff0c;通常填的是0101&#xff08;十进制5&#xff09; 16位总长度(total length): IP数据报整体占多少个字节.这用…

大数据企业应用合作解决方案案例

打造产教融合的就业育人的综合服务平台&#xff0c;给予十余年的数据智能产业实践经验&#xff0c;专注于大数据和人工智能方向。 目前合作的企业案例包括&#xff1a;信访大数据平台解决方案、工业废水处理解决方案、找齐远程监控解决方案、道路运输安全、广电用户服务大数据解…

VS2019 c++ cmake项目 打包并使用 (lib\dlll)

背景 最近项目中经常调用第三方库、带头文件、lib和dll的库&#xff0c;需要使用cmake进行项目管理&#xff0c;之前一直比较糊涂这方面&#xff0c;在这里做一个整理总结 编译汇编过程 静态链接方式&#xff1a; 把lib里面编译好的东西&#xff08;函数、变量等&#xff09…

【Yolo】YoloV5训练自定义模型

【Yolo】Jetson Orin Nano下部署 YoloV5 上一篇博文主要记录了在Jetson Orin Nano下部署YoloV5环境&#xff0c;并运行了yoloV5n.pt模型&#xff0c;本篇在上一篇的基础上&#xff0c;进一步记录如何训练自己的目标模型&#xff0c;我们以一根口香糖盒子为训练对象进行说明。 …

Kali Linux 操作系统安装详细步骤——基于 VMware 虚拟机

1. Kali 操作系统简介 Kali Linux 是一个基于 Debian 的 Linux 发行版&#xff0c;旨在进行高级渗透测试和安全审计。Kali Linux 包含数百种工具&#xff0c;适用于各种信息安全任务&#xff0c;如渗透测试&#xff0c;安全研究&#xff0c;计算机取证和逆向工程。Kali Linux 由…

学习笔记(4)页面开发

目录 1&#xff0c;页面开发1.1&#xff0c;标签类1.2&#xff0c;资源引用1.3&#xff0c;页面跳转 2&#xff0c;开发规范2.1&#xff0c;应用生命周期2.2&#xff0c;页面生命周期&#xff1a;2.3&#xff0c;条件编译 3&#xff0c;注意事项 1&#xff0c;页面开发 1.1&am…

真实业务场景使用-模板模式+策略模式组合

模板和策略设计模式一般是使用最频繁的设计模式&#xff0c;模板的场景主要是处理一系列相同的流程&#xff0c;将这些流程放到模板里&#xff0c;每个流程里的处理可能有一些不一样的地方&#xff0c;则可以抽象出一个方法&#xff0c;由每一个有实际意义的子类实现。 策略模…

从供应链角度看进销存:区别与联系

供应链和进销存是两个紧密相关的概念&#xff0c;它们都涉及到企业在商品贸易中的运作过程。虽然它们有一些相似之处&#xff0c;但是它们也有一些显著的区别。本文将从几个方面探讨供应链和进销存的区别。 一、概念定义 供应链的定义&#xff1a;供应链是一系列的活动&#…

WPF 多媒体MediaElement 的使用(一)

本章讲述MediaElement的简单使用&#xff1a; WPF 中对于多媒体的支持非常完整&#xff0c;可以使用MediaElement 为应用程序添加媒体播放控件&#xff0c;以完成播放音频、视频功能。MediaElement 属于UIElement&#xff0c;同时也支持鼠标及键盘的操作。 想以交互方式停止、…

通达信N字形态选股公式,突破前期高点发出信号

行情经历一波上涨之后回调&#xff0c;然后再次上涨&#xff0c;形态类似于字母N&#xff0c;这就是N字形态。该形态在不同的分析方法中均有描述&#xff0c;如123法则、波浪理论等&#xff0c;只是名称不同而已。 本文的N字形态选股公式&#xff0c;以突破前期波段高点发出信号…

2023年留学基金委(CSC)青年骨干教师出国研修项目解读及建议

5月4日&#xff0c;国家留学基金委&#xff08;CSC&#xff09;公布了2023年青年骨干教师出国研修项目通知&#xff0c;知识人网小编现将其选派工作流程、选派办法、申请材料及说明原文转载并加以解读、提出建议。 知识人网解读及建议 一、2023年的通知精神与往年相比&#xf…

MySQL索引、事务与存储引擎

数据库索引 是一个排序的列表&#xff0c;存储着索引值和这个值对应的物理地址&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09;无需对整个表进行扫描&#xff0c;而是先通…