Java集合:List集合

List集合

List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。

List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。

JDK API中List接口的实现类常用的有:ArrayList、LinkList和Vector。

List集合里添加了一些根据索引来操作集合元素的方法

一、ArrayList

ArrayList是List接口的典型实现类,本质上,ArrayList是对象引用的一个变长数组。

ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括null在内的所有元素。除了实现List接口外,此类还提供了一些方法来操作内部用来存储列表的数组的大小。

每个ArrayList实例都有一个初始容量,该容量用来储存列表元素的数组大小。默认初始容量为10。

ArrayList底层采用数组实现。数组都有一个重大的缺陷,这就是从数组的中间位置删除一个元素要付出很大的代价,其原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动。在数组中间位置插入一个元素也是如此(数据的copy)。

注:Arrays.asList(…) 方法返回的 List 集合既不是 ArrayList 实例,也不是 Vector 实例。 Arrays.asList(…)返回值是一个固定长度的 List 集合。

1.ArrayList的存取实现

1.1存储:

ArrayList提供了一下添加元素的方法

**add(E element)**方法,将指定的元素添加到列表的尾部

**add(int index, E element)**方法,将指定的元素插入此列表的指定位置,如果当前位置有元素,则向右移动当前位于该位置的元素以及所有后续元素(将其索引值加1)

**set(int index, E element)**方法,替换数组中已经存在的元素内容

**addAll(Collection<? extends E> c)**方法,按照指定Collection的迭代器所返回的元素顺序,将该Collection中的所有元素添加到此列表的尾部。

**addAll(int index, Collection<? extends E> c)**方法,从指定的位置开始,将指定collection中的所有元素插入到此列表中

1.2读取

**get(int index)**方法,获取指定位置上的元素

2.总结

  • ArrayLlist内部是由数组来实现的。在存放数据的数组长度不够时,会进行扩容,即增加数组长度。扩展为原来的1.5倍。
  • 由于是数组来实现,所以,优点是查找元素很快。可以通过下标查找元素,查找效率高。缺点是每次添加和删除元素都会进行大量的数组元素移动。长度不够会扩容。效率底下。
  • ArrayList每次的增、删、改操作都伴随着数组的复制和元素的移动。这意味着新的内存空间的开辟。

二、LinkedList

LinkedList其实也就是我们在数据结构中的链表,这种数据结构有这样的特性:

  • 分配内存空间不是必须是连续的;
  • 插入、删除操作很快,只要修改前后指针就OK了,时间复杂度为O(1);
  • 访问比较慢,必须得从第一个元素开始遍历,时间复杂度为O(n);

在Java中,LinkedList提供了丰富的方法,可以模拟链式队列,链式堆栈等数据结构,为用户带来了极大的方便,下面看看这些方法的用法:

add:

boolean add(E e):在链表后添加一个元素,如果成功,返回true,否则返回falsevoid addFirst(E e):在链表头部插入一个元素; 
addLast(E e):在链表尾部添加一个元素; 
void add(int index, E element):在指定位置插入一个元素。

remove:

E remove();移除链表中第一个元素; 
boolean remove(Object o):移除链表中指定的元素; 
E remove(int index):移除链表中指定位置的元素; 
E removeFirst():移除链表中第一个元素,与remove类似; 
E removeLast():移除链表中最后一个元素; 
boolean removeFirstOccurrence(Object o):移除链表中第一次出现所在位置的元素; 
boolean removeLastOccurrence(Object o):移除链表中最后一次出现所在位置的元素;

get:

E get(int index):按照下边获取元素; 
E getFirst():获取第一个元素; 
E getLast():获取最后一个元素;

push、pop、poll:

void push(E e):与addFirst一样,实际上它就是addFirst; 
E pop():与removeFirst一样,实际上它就是removeFirst; 
E poll():查询并移除第一个元素;

push,pop的操作已经很接近stack的操作了。如果链表为空的时候,poll返回null,而pop则产生异常。

peek:

E peek():获取第一个元素,但是不移除; 
E peekFirst():获取第一个元素,但是不移除; 
E peekLast():获取最后一个元素,但是不移除

offer:

boolean offer(E e):在链表尾部插入一个元素; 
boolean offerFirst(E e):与addFirst一样,实际上它就是addFirst; 
boolean offerLast(E e):与addLast一样,实际上它就是addLast;

其他:

boolean contains(Object o) 如果此列表包含指定的元素方法返回true。
E element() 此方法返回此列表的头部
E set(int index,E element) 此方法替换在与指定元素在此列表中指定位置的元素。
subList(int index, int index) 方法是在给定的ArrayList集合中获取给定下标的子集合。注意范围是[)

三、Vector

Vector 可实现自动增长的对象数组。

java.util.vector提供了向量类(Vector)以实现类似动态数组的功能。
创建了一个向量类的对象后,可以往其中随意插入不同类的对象,即不需顾及类型也不需预先选定向量的容量,并可以方便地进行查找。

对于预先不知或者不愿预先定义数组大小,并且需要频繁地进行查找,插入,删除工作的情况,可以考虑使用向量类。

向量类提供了三种构造方法:

public vector() 
public vector(int initialcapacity,int capacityIncrement) 
public vector(int initialcapacity)

使用第一种方法系统会自动对向量进行管理,若使用后两种方法,则系统将根据参数,initialcapacity设定向量对象的容量(即向量对象可存储数据的大小),当真正存放的数据个数超过容量时。系统会扩充向量对象存储容量。

参数capacityincrement给定了每次扩充的扩充值。当capacityincrement为0的时候,则每次扩充一倍,利用这个功能可以优化存储。

在Vector类中提供了各种方法方便用户的使用:

1.插入功能

(1)public final synchronized void adddElement(Object obj)

将obj插入向量的尾部。obj可以是任何类型的对象。对同一个向量对象,亦可以在其中插入不同类的对象。但插入的应是对象而不是数值,所以插入数值时要注意将数组转换成相应的对象。

(2)public final synchronized void setElementAt(Object obj,int index)

将index处的对象设置成obj,原来的对象将被覆盖。

(3)public final synchronized void insertElementAt(Object obj,int index)

在index指定的位置插入obj,原来对象以及此后的对象依次往后顺延。

2.删除功能

(1)public final synchronized void removeElement(Object obj)

从向量中删除obj,若有多个存在,则从向量头开始试,删除找到的第一个与obj相同的向量成员。

(2)public final synchronized void removeAllElements();

删除向量所有的对象

(3)public fianl synchronized void removeElementAt(int index)

删除index所指的地方的对象

3.查询搜索功能

(1)public final int indexOf(Object obj)

从向量头开始搜索obj,返回所遇到的第一个obj对应的下标,若不存在此obj,返回-1.

(2)public final synchronized int indexOf(Object obj,int index)

从index所表示的下标处开始搜索obj.

(3)public final int lastIndexOf(Object obj)

从向量尾部开始逆向搜索obj.

(4)public final synchornized int lastIndex(Object obj,int index)

从index所表示的下标处由尾至头逆向搜索obj.

(5)public final synchornized firstElement()
  获取向量对象中的首个obj

(6)public final synchornized Object lastElement()
  获取向量对象的最后一个obj

4.其他功能

(1)public final int size();
此方法用于获取向量元素的个数。它们返回值是向量中实际存在的元素个数,而非向量容量。可以调用方法capacity()来获取容量值。

(2)public final synchronized void setSize(int newsize);
此方法用来定义向量的大小,若向量对象现有成员个数已经超过了newsize的值,则超过部分的多余元素会丢失。

程序中定义Enumeration类的一个对象Enumeration是java.util中的一个接口类,

(3)public final synchronized Enumeration elements();

此方法将向量对象对应到一个枚举类型。java.util包中的其他类中也都有这类方法,以便于用户获取对应的枚举类型。

在Enumeration中封装了有关枚举数据集合的方法。
  方法 hasMoreElement() 来判断集合中是否还有其他元素。

​ 方法 nextElement() 来获取下一个元素

PS:同时也有一个结论 Vector是有序的,可以重复的。

四、ArrayList、LinkedList、Vector的底层实现和区别

List 有序, 可重复, 有索引。三者均为可伸缩数组

ArrayList:底层数据结构是数组结构。 线程不安全的。 所以ArrayList的出现替代了Vector, 但是查询的速度很快。默认扩充为原来的1.5倍。

LinkedList:底层是链表数据结构。 线程不安全的, 同时对元素的增删操作效率很高。但查询慢

Vector:底层数据结构是数组结构。 jdk1.0版本。 线程安全的。 无论增删还是查询都非常慢。默认扩充为原来的2倍。

Vector 和 ArrayList都是基于存储元素的Object[ ] array来实现的。

LinkedList是采用双向列表来实现的。

1、 线程同步,Vector线程安全,ArrayList线程不安全。

2、 效率问题,Vector效率低,ArrayList效率高。

3、 增长数量,Vector以1.5倍增长,ArrayList以2倍增长。

List集合子类Vector这个类已经不常用了, 我就说里面的一个方法, Elements方法, 这个方法的返回值是枚举接口, 里面有两个方法, 判断和获取。此接口Enumeration的功能与 Iterator 接口的功能是重复的。Enumeration的名称和方法的名称过程, 书写很麻烦。 所以被Iterator所取代。

ArrayList是实现了基于动态数组的数据结构,LinkedList基于双线链表的数据结构。

ArrayList可以随机定位对于新增和删除操作add和remove,LinedList比较占优势

具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。

Vector与ArrayList唯一的区别是,Vector是线程安全的,即它的大部分方法都包含有关键字synchronized,因此,若对于单一线程的应用来说,最好使用ArrayList代替Vector,因为这样效率会快很多(类似的情况有StringBuffer线程安全的与StringBuilder线程不安全的);而在多线程程序中,为了保证数据的同步和一致性,可以使用Vector代替ArrayList实现同样的功能。

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

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

相关文章

MySQL为什么要set names

大家都知道SET NAMES x相当于SET character_set_client x;SET character_set_results x;SET character_set_connection x; 以下从MySQL5.0官方文档上摘录了相关内容&#xff0c;并翻译&#xff0c;说明了相关系统变量的用处&#xff1a; What character set is the statem…

MySql日期处理系列-常用的日期推算处理

以下都是我平时用的一些日期推算处理方法&#xff0c;方法并不一定是最有效率的.全部均通过测试!转载请注明来自[phpchina.com] #title: 常用的日期推算处理#auther: 小强(占卜师) #date: 2007-12-25 #取得当前日期set dtCURDATE();select dt; #当前日期这个月的第一天selec…

Java集合:Set集合

一、Set接口的特点 一个不包含重复元素的collection。更确切地讲&#xff0c;Set不包含满足e1.equals(e2)的元素对 e1和e2&#xff0c;并且最多包含一个null元素。 Set集合由Set接口和Set接口的实现类组成&#xff0c;Set接口继承了Collection接口&#xff0c;因此包含了Coll…

谈谈我对MYSQL乱码的解决办法

经常更换虚拟主机,而各个服务商的MYSQL版本不同,当导入数据后,总会出现乱码等无法正常显示的问题,查了好多资料,总结出自己的一点技巧: WINDOWS 下导入应该这样使用MYSQL的命令在DOS命令下进入mysql的bin目录下,输入mysql -uroot -p密码 数据库名称<要恢复的数据库, 例如我们…

Java集合:Map集合

一、简述 public interface Map<K,V>将键映射到值的对象。一个映射不能包含重复的键&#xff1b;每个键最多只能映射到一个值。 注意&#xff1a;Map中的集合不能包含重复的键&#xff0c;值可以重复。每个键只能对应一个值。 Map集合是键值对形式存储值的&#xff0c…

用离线编辑器Zoundry写zblog日志

Zoundry是免费的离线网志发布工具&#xff0c;由于家里的网络很差&#xff0c;写了一半的日志经常因为掉线而丢失&#xff0c;这样一款软件的确是很必要的。今天下载试用了一下&#xff0c;感觉的确不错。使用起来也很简单&#xff1a; 1.下载并安装zoundry软件&#xff1a;现…

MySQL:基本命令

一、数据库操作 1、查询数据库&#xff0c;命令如下: SHOW DATABASES;2、我们可以在登陆 MySQL 服务后&#xff0c;使用 create 命令创建数据库&#xff0c;命令格式: CREATE DATABASE 数据库名;3、使用 drop 命令删除数据库&#xff0c;命令格式&#xff1a; drop databas…

CentOS 5打造全功能Web服务器

转&#xff1a;主要做为历史记录&#xff0c;以后用。另外很少见这么好的编译的文章&#xff0c;其实我不推荐用编译安装。但这个文章不错.V3.0 2007年11月11日 将搭建教程划分阶段以适应不同需要。加入程序优化&#xff0c;程序安全&#xff0c;加入memcache&#xff0c;squid…

MySQL:查询条件

查询条件 1、使用 WHERE 子句从数据表中读取数据的通用语法&#xff1a; SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....查询语句中你可以使用一个或者多个表&#xff0c;表之间使用逗号**,** 分割&#x…

linux下的ImageMagick安装

检查系统有无安装ImageMagick官方网址是&#xff1a; www.imagemagick.org 从官方不好下载&#xff0c;提供 sourceforge的下载地址&#xff1a; imagemagick.sourceforge.net shell> rpm -qa | grep ImageMagick 没有就开始安装ImageMagickshell> rpm -Uvh ImageMagi…

MySQL:进阶应用

一、进阶应用 1、可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。 JOIN 按照功能大致分为如下三类&#xff1a; INNER JOIN&#xff08;内连接,或等值连接&#xff09;&#xff1a;获取两个表中字段匹配关系的记录。**LEFT JOIN&#xff08;左连…

Hive-常用操作

一. 数据库操作 1、创建数据库 //用户可以用 IF NOT EXISTS 选项来忽略这个异常。create database [ if not exists ] myhive ;2、创建数据库并指定hdfs存储位置 create database myhive2 location /myhive2;3、修改数据库&#xff0c;可以使用alter database 命令来修改数据…

linux下nmap工具的使用

nmap NMap&#xff0c;也就是Network Mapper&#xff0c;是Linux下的网络扫描和嗅探工 具包&#xff0c;其基本功能有三个&#xff0c;一是探测一组主机是否在线&#xff1b;其次是扫描主机端口&#xff0c;嗅探所提供的网络服务&#xff1b;还可以推断主机所用的操作系统 。N…

Hive-分区分桶概述

一、分区 简介 为了对表进行合理的管理以及提高查询效率&#xff0c;Hive可以将表组织成“分区”。 分区是表的部分列的集合&#xff0c;可以为频繁使用的数据建立分区&#xff0c;这样查找分区中的数据时就不需要扫描全表&#xff0c;这对于提高查找效率很有帮助。 分区是…

定时提醒你休息的脚本

本文来源于阿里西西WEB开发社区http://www.alixixi.com收集整理&#xff0c;欢迎访问。 定时弹窗提醒功能脚本..把以下代码存为.vbs运行即可. 以下是引用片段&#xff1a;set WshShell WScript.CreateObject("WScript.Shell") ’对话框标题 alerttitle "你的…

Hive-分区分桶操作

在大数据中&#xff0c;最常用的一种思想就是分治&#xff0c;我们可以把大的文件切割划分成一个个的小的文件&#xff0c;这样每次操作一个小的文件就会很容易了&#xff0c;同样的道理&#xff0c;在hive当中也是支持这种思想的&#xff0c;就是我们可以把大的数据&#xff0…

ubuntu好文收集

ubuntu全程配置手册 http://ljlau.blogdriver.com/ljlau/1220277.html ubuntu下向系统日志写记录 http://linux0818.bokee.com/viewdiary.14153197.html aptitude 使用快速参考 http://linuxtoy.org/archives/aptitude_quick_reference.html

Flume简单介绍

在一个完整的离线大数据处理系统中&#xff0c;除了HDFSMapReduceHive组成分析系统的核心之外&#xff0c;还需要数据采集、结果数据导出、任务调度等不可或缺的辅助系统&#xff0c;而这些辅助工具在hadoop生态体系中都有便捷的开源框架&#xff0c;在此&#xff0c;我们首先来…

linux系统优化篇之---top

top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。下面详细介绍它的使用方法。 top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48Tasks: 29 total, 1 running, 28 sleeping, …

Flume安装部署

1.安装部署 1、解压tar -zxvf apache-flume-1.9.0-bin.tar.gz 2、改名mv apache-flume-1.9.0-bin flume-1.9.0 3、配置环境变量 vi /etc/profile,source /etc/profile #flume export FLUME_HOME/usr/local/apps/flume-1.9.0 export PATH$PATH:$FLUME_HOME/bin4、将conf下的…