移除集合效率高还是add高_List、set集合接口分析

一、List接口详解

01cb68f9ec9f504369d82ad73183fb23.png

1、List接口有三个实现类,ArrayList、LinkedList、Vector

2、三个实现类的异同点:

(1)ArrayList: 作为list接口的主要实现类;线程不安全,效率高底层使用Object[]存储

(2)LinkedList: 对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双 向链表存储

(3)Vector: 作为list接口的古老实现类;线程安全的,效率低;底层使用Object[]存储

相同点:

三个类都是实现了list接口,存储数据特点相同:存储有序的、可重复的数据

3、ArrayList的源码分析:

(1)jdk 1.7下的情况:

ArrayList list = new ArrayList(); // 底层创建了长度是10的Object[]数elementDate

list.add(123); //elementDate[0] = new Tnteger(123);

.....

list.add(111); // 如果此次的添加导致底层elementDate数组容量不够,则扩容。默认情况下,扩容为原来的容量的1.5倍,同时需要将原来数组中的数据复制到新的数组中

结论: 建议开发中使用带参的构造器: ArrayList list = new ArrayList(int capacity)

(2)jdk1 1.8下的情况:

ArrayList list = new ArrayList(); // 底层Object[] elementDate初始化为{}并没有创建长度为10的数组

list.add(123); // 第一次调用add()方法,底层才创建了长度为10的数组,并将数据123添加到elementDate[]数组中, 后续的添加和扩容操作和jdk 1.7一样

(3) jdk7中的ArrayList的对象的创建类似于单例模式中的饿汉式,而jdk8中的ArrayList的对象的创建类似于单例模式中的懒汉式,延迟了数组的创建,节省内存。

4、ArrayList中常用的方法

增:add(Object obj)

删:remove(int index) / remove(Object obj)

改:set(int index, Object ele)

查: get(int index)

插:add(int index, Object obj)

获取长度: size()

遍历:① Iterator迭代器方式

② 增强for循环

③ 普通的循环

5、LinkedList的源码分析:

LinkedList list = new LinkedList(); // 内部声明了Node类型的first和last属性,默认值为null

list.add(123); //将123封装到Node中,创建了Node对象

其中,Node定义为:体现了LinkdList的双向链表的说法

     private static class Node<E> {*           E item;*           Node<E> next;*           Node<E> prev;**           Node(Node<E> prev, E element, Node<E> next) {*               this.item = element;*               this.next = next;*               this.prev = prev;*         }*     }

6、Vector的源码分析:jdk7和jdk8中通过Vector()构造器创建对象时,底层都创建了长度为10的数组,在扩容方面,默认扩容为原来数组长度的2倍。

7、List接口中常用的方法

442b2c076f92e0b11ae0e12aab8c90f5.png
 public class ArrayListTest {/*** void add(int index, Object ele):在index位置插入ele元素* boolean addAll(int index, Collection eles):从index位置开始将eles中 的所有元素添加进来* Object get(int index):获取指定index位置的元素* int indexOf(Object obj):返回obj在集合中首次出现的位置* int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置* Object remove(int index):移除指定index位置的元素,并返回此元素* Object set(int index, Object ele):设置指定index位置的元素为ele* List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex 位置的子集合*/public static void test01() {ArrayList list = new ArrayList();list.add(123);list.add(456);list.add("MM");list.add(false);System.out.println(list);  // [123, 456, MM, false]//1、void add(int index, Object ele):在index位置插入ele元素list.add(1, "aaa");System.out.println(list); // [123, aaa, 456, MM, false]//2、boolean addAll(int index, Collection eles):从index位置开始将eles中 的所有元素添加进来List<Integer> list1 = Arrays.asList(1, 2, 3);list.addAll(list1);System.out.println(list.size()); // 8//3、Object get(int index):获取指定index位置的元素System.out.println(list.get(1));}public static void test02() {ArrayList list = new ArrayList();list.add(123);list.add(456);list.add("MM");list.add(false);//4、int indexOf(Object obj):返回obj在集合中首次出现的位置.如果不存在,返回-1int indexOf = list.indexOf(456);System.out.println(indexOf);//5、Object remove(int index):移除指定index位置的元素,并返回此元素Object remove = list.remove(0);System.out.println(remove);  // 返回删除的数据System.out.println(list);    // [456, MM, false]//6、Object set(int index, Object ele):设置指定index位置的元素为elelist.set(1, "CC");System.out.println(list);  // [456, CC, false]}/*** ArrayList中三种遍历方式:* 1、使用迭代器;* 2、for增强;* 3、普通for循环*/public static void test03() {ArrayList list = new ArrayList();list.add(123);list.add(456);list.add("MM");list.add(false);//1、使用迭代器Iterator iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}System.out.println("**************");//2、for增强for (Object obj : list) {System.out.println(obj);}System.out.println("**************");//3、普通for循环for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}}

二、set接口

1、set接口的特点:存储无序的、不可重复的数据

2、set接口的几个实现类:

(1)HashSet: 作为Set接口的主要实现类;线程不安全的:可以存储null值;HashSet底层:数组 + 链表的结构

-- LinkedHashSet: 作为HashSet的子类:遍历其内部数据时,可以按照添加的顺序遍历

(2) TreeSet: 可以按照添加对象的指定属性,进行排序。

3、set接口的特点:存储无序的、不可重复的数据说明

以HashSet为例说明:

(1)无序性: 不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加的,而是根据数据的哈希值

(2)不可重复性:保证添加的元素按照equals判断时,不能反悔true,即:相同的元素只能添加一个

public void test1(){Set hashSet = new HashSet();hashSet.add("123");hashSet.add(false);hashSet.add(567);hashSet.add(new User("Tom",23));hashSet.add(new User("Tom",23));hashSet.add(98);Iterator iterator = hashSet.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}

4、LinkedHashSet使用

作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个数据和后一个数据

优点:对于频繁的遍历操作,LinkedHashSet效率高于HashSet

5、Set接口中的添加方法的执行过程:(以HashSet为例)

向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素

如果此位置上没有其他元素,则元素a添加成功。 --- 情况1

如果此位置上有其他元素b(或以链表形式存在的多个元素)。则比较元素a与元素b的hash值:

如果hash值不相同,则元素a添加成功。 --- 情况2

如果hash值相同,进而需要调用元素a所在类的equals()方法:

equals()返回true,则元素a添加失败

equals()返回false,则元素a添加成功 --- 情况3

对于添加成功的情况2和情况3而言:元素a与已经存在指定索引位置上数据以链表的方式存储。

jdk 7: 元素a放在数组中,指向原来的元素

jdk 8: 原来的元素在数组中,指向元素a

总结:七上八下

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

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

相关文章

代码实践

闭包举例&#xff1a; function closure(){var innerVariable inner;function innerFn(){ return innerVariable;}return innerFn(); } var innerVariable defined in outer; var outerVariable closure(); console.log(outerVariable); 测试字符串是否回文&#xff1a; …

python 读取excel太慢_Python 读取excel并转换为字典

方法一&#xff1a;利用利用xlrd读取excel文件其实整个过程比较简单&#xff0c;利用xlrd读取excel文件&#xff0c;再把读取到的数据转换为dict即可。1.安装 xlrdpip install xlrd2.读取文件&#xff0c;并进行格式转换导入的excel表格的格式是这样的&#xff1a;解析后的格式…

windows上编译zlib-1.2.8

MSVC编译 使用VS&#xff08;x86&#xff09;命令行工具进入到zlib根目录&#xff0c;执行 nmake -f win32/Makefile.msc ,在根目录下生成&#xff1a;zlib.lib(静态库) zdll.lib(动态库的导入库) zlib1.dll(动态库) 。必要的头文件有zlib.h和zconf.h 默认生成的是release版的…

大表与大表join数据倾斜_技术分享|大数据技术初探之Spark数据倾斜调优

侯亚南数据技术处支宸啸数据技术处在大数据计算中&#xff0c;我们可能会遇到一个很棘手的问题——数据倾斜&#xff0c;此时spark任务的性能会比预期要差很多&#xff1a;绝大多数task都很快执行完成&#xff0c;但个别task执行极慢或者报OOM(内存溢出)。数据倾斜调优&#xf…

NYOJ 289 苹果(01背包)

苹果 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述ctest有n个苹果&#xff0c;要将它放入容量为v的背包。给出第i个苹果的大小和价钱&#xff0c;求出能放入背包的苹果的总价钱最大值。 输入有多组测试数据&#xff0c;每组测试数据第一…

磁盘剩余空间策略_MySQL磁盘消耗迅猛掌握这点就够了,包你事半功倍

Part1:写在最前当一张单表10亿数据量的表放在你面前&#xff0c;你将面临着什么&#xff1f;Part2:背景介绍为了提升数据库资源利用率&#xff0c;一个实例中&#xff0c;在不互相影响&#xff0c;保证业务高效的前提下&#xff0c;我们会将同一个大业务下的不同小业务放在一个…

Date Picker控件:

Date Picker控件&#xff1a; 中文&#xff1a;日期/时间选取器UIDatePicker有一个实例方法setDate:animated&#xff0c;以编程的方式选择日期。UIDatePicker有四种模式&#xff08;model&#xff09;&#xff1a;Time&#xff08;只选时间&#xff09;Date&#xff08;只选日…

logback日志pattern_@Slf4j 实现日志输入到外部文件

添加一个配置文件\src\main\resources\logback-spring.xml<?xml version"1.0" encoding"UTF-8"?><configuration scan"true" scanPeriod"10 seconds"> <contextName>logbackcontextName> <prope…

C++ Prime:sizeof运算符

sizeof运算符的结果部分地依赖于其作用的类型&#xff1a; 对char或者类型为char的表达式执行sizeof运算结果得1&#xff1b; 对引用类型执行sizeof运算得到被引用对象所占空间的大小&#xff1b; 对指针执行sizeof运算得到指针本身所占空间的大小&#xff1b; 对解引用指针执行…

前驱和后驱什么意思_为什么只有豪车才敢用后驱

为什么只有豪车才敢用后驱https://www.zhihu.com/video/1156959599864147968一般的家用车&#xff0c;基本上都是前驱为主&#xff0c;前驱够用&#xff0c;成本还低。但前驱满足不了豪华车的运动需求&#xff0c;所以豪华车后驱才是王道。有人这个时候肯定要跳出来不服了&…

leetcode 第五题 Longest Palindromic Substring (java)

Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. time255ms accepted 暴力遍历 public String longes…

思科光传输功率查询_常见的6款40G QSFP+光模块型号介绍及应用

近些年来&#xff0c;云计算和大数据在我国兴起一股热潮&#xff0c;为了提供足够的带宽&#xff0c;许多接入交换机已经发展到可以连接40G以太网的核心交换机。互连数据传输的快速发展&#xff0c;离不开40G光模块&#xff0c;因为它可以提供足够的带宽&#xff0c;以确保数据…

sigquit信号默认忽略吗_老妹儿,你真的搞懂了 Shell 信号吗?

作者&#xff1a;李振良OK链接&#xff1a;https://blog.51cto.com/lizhenliang/1899347哈喽&#xff0c;各位新来的小伙伴们&#xff0c;大家好&#xff01;由于公众号做了改版&#xff0c;为了保证公众号的资源能准时推送到你手里&#xff0c;大家记得将咱们的公众号 加星标置…

wget 命令用法详解

wget是在Linux下开发的开放源代码的软件&#xff0c;作者是Hrvoje Niksic&#xff0c;后来被移植到包括Windows在内的各个平台上。它有以下功能和特点&#xff1a; &#xff08;1&#xff09;支持断点下传功能&#xff1b;这一点&#xff0c;也是网络蚂蚁和FlashGet当年最大的卖…

datetimepicker不可以选择当天之前_专访吴京:网上《战狼3》的消息我都不知道,大家可以选择不信...

搜狐娱乐讯 (哈麦/文)在2017爆火的《战狼2》之后&#xff0c;吴京演了《祖宗十九代》《流浪地球》《老师好》《银河补习班》《攀登者》《我和我的祖国》《我和我的家乡》《金刚川》八部电影&#xff0c;但是计划中的《战狼3》一直没有动静。不过&#xff0c;关于《战狼3》&…

机器人蛮王_盖伦:吊打我老婆,蛮王:我也是,他:被老婆打的不敢出塔

相遇就是缘分&#xff0c;你点开了我的文章&#xff0c;小编感到万分荣幸&#xff0c;感谢各位朋友。既然看到了我的文章&#xff0c;就说明我们还是有缘&#xff0c;希望大家可以帮我点点左上角的蓝色字体&#xff0c;小编给大家鞠躬了&#xff01;LOL如此好玩的原因&#xff…

栈 详解

官方定义是这样的&#xff1a;栈&#xff08;Stack&#xff09;是一个后进先出的线性表&#xff0c;它要求只在表尾进行删除和插入操作。 栈是一种重要的线性结构&#xff0c;可以这样讲&#xff0c;栈是线性表的一种具体表现形式&#xff0c;但是它在操作上有一些特殊的要求和…

android serialport new 软件退出_基于Android9.0,了解Android启动流程

先记住四个进程和三种方式。**四个进程**1.Launcher进程2.system_server进程3.App进程4.Zygote进程**三种方式**1.Binder方式2.Socket方式3.Handler方式点击桌面APP图标&#xff0c;Launcher调用startActivitySafely&#xff08;Launcher进程&#xff09;java/*** Default laun…

Objective-C 学习笔记

超类 即父类&#xff0c;通过 [super setName: "a"] 可以调用超类方法 复合 是指一个对象由其他多个对象组成 对象初始化 interface Car : NSObject (Engine *engine; ) endimplementation Car - (id) init {  //因init方法可能返回不同的对象&#xff0c;所以需要…

【转】使用命令行方式创建和启动android模拟器

原文网址&#xff1a;http://blog.csdn.net/tiandinilv/article/details/8953001 1、Android模拟器介绍 Android中提供了一个模拟器来模拟ARM核的移动设备。Android的模拟器是基于QEMU开发的&#xff0c;QEMU是一个有名的开源虚拟机项目&#xff08;详见http://bellard.org/qem…