java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)
说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了):
| 数组 | 长度固定 | 既可以存储基本数据类型,也能存储引用数据类型 | 一个数组中的元素类型必一致 |
| 集合 | 长度可变 | 只能存储引用数据类型 | 一个集合中的元素类型可以是任意的引用类型 |
一.集合概述
|
Collection<E> 父接口 |
List<E> 子接口 |
ArrayList<E>类 |
| Vector<E>类 | ||
| LinkedList<E>类 | ||
|
Set<E> 子接口 |
HashSet<E>类 | |
| TreeSet<E>类 |
(List特点:存入顺序和取出顺序一致,存储的元素可以重复)
(Set特点:元素的顺序无序且唯一,即无序性和唯一性)
二.ArrayList类:
(底层是Object数组)
1.一些基本的方法
(1)增:add及其重载;
(2)删:remove(index)移除指定下标的元素,remove(Object)移除指定对象的元素,clear()移除所有;
(3)改:set(index,Object);
(4)查:contains();依据equals方法来判断是否包含该元素
(5)输出:for循环+size()+get(index)方法;
特殊注意:
(1). set返回的该位置上原先的元素。
(2). remove(Object): 移除此列表中首次出现的指定元素(如果存在)。
对以上方法的例子如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package day09;import java.util.ArrayList;/* * ArrayList类基本方法的使用 * 其他方法请参考API文档 */public class Diffrent { public static void main(String[] args) { ArrayList list=new ArrayList(); list.add("one"); list.add(1); list.add("two"); list.add("four"); list.add(2, new String("three"));//在下标为2处添加元素 list.remove(4);//移除下标为4的元素 System.out.println(list.set(1, "two"));//set方法的返回值是下标原来的元素 1 System.out.println(list.contains("two"));//返回类型为Boolean值 true System.out.println(list.contains(new String("three")));//这是要说明的一点 //indexOf方法返回下标,若不存在返回-1 System.out.println(list.indexOf("one"));//0 System.out.println(list.indexOf("two"));//1 System.out.println(list.indexOf("three"));//2 System.out.println(list.indexOf(1));//-1 //重写了toString方法 System.out.println(list); //输出方法 for(int i=0;i<list.size();i++){ Object oo=list.get(i); System.out.println(oo); } }} |
2.Vector类
(与ArrayList的用法基本一致,这里就不过于多说,只是简单说一下两者的一点区别)如下:
| ArrayList | Vector | |
| 推出时间 | JDK1.2版本以后 | JDK1.0版本就有 |
| 线程安全性 | 非线程安全(不支持多线程) | 线程安全 |
| 效率 | 相对较低 | 效率高 |
| 输出方法 | for,Iterator | for,Iterator |
(Vector的相关例子就不在赘述了)
3.LinkedList类
(底层是双向链表)
(与ArrayList的用法也基本一致,这里也之强调一下两者之间的区别,LinkedList的相关方法见API文 档即可)
| ArrayList类 | LinkedList类 |
| 底层是Object数组 | 底层是双向链表 |
| 经常用于查询操作 | 经常用于频繁的增加或删除操作 |
4.为了更好的学习集合,我们先引入两个小知识点——泛型和迭代器
(1)泛型:为了规范元素类型,避免强制类型转换
(2)迭代器Iterator:用于取出集合中的元素,可以成为打印集合元素的一种方式
以下是两个知识点的例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package day09;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/* * 这个类说明了泛型和迭代器的作用 * 程序简单易懂,但很重要 */public class Example { public static void main(String[] args) { List<String> list=new ArrayList<String>(); list.add("one"); list.add("two"); list.add("three"); //用迭代器+for循环的方式输出集合中的内容 Iterator<String> it=list.iterator(); while(it.hasNext()){ String s=it.next(); System.out.println(s); } //这种方法很常用,底层也是迭代器 for(String s:list){ System.out.println(s); } }} |
(3)关于迭代器Iterator应特别注意的地方:
a.若在循环里再定义迭代器,会造成死循环,因为hasNext()不移动指针;
b.用Syso(it.next())输出,结果是只有偶数下标才输出,因为next()方法移动指针;
(当元素总个数为奇数时还会产生NoSuchElementException异常)
c.每一个迭代器只能迭代一次
三.HashSet类(底层是Hash表)
前面在和List中的类做比较时我们已经知道,Set中的类其元素都是无序且唯一的,那么是用什么机制来保证元素的无序性和唯一性呢?答案是:hashCode()和equals()方法来保证
1.通过比较HashSet和ArrayList来说明Set的无序性与唯一性
| add()增加元素时 | 判断元素是否存在或者删除元素时 | |
| HashSet类 | 依据hashCode()和equals() | 依据hashCode()和equals() |
| ArrayList类 | 都不依据 | 只依据equals() |
四.TreeSet类(底层是二叉树)
TreeSet与HashSet都是实现Se的类,但是TreeSet独特指出是可以完成自动排序,要求存入其中的元素具有可比较性,依据的是compareTo方法。
比较可以有两种方式:
1. 类 implments Comparable接口,重写compareTo方法。
2. 更灵活的方式:让TreeSet本身具有可比较性:构造中传入一个Comparator的对象,重写compare方法。(这种方式的例子代码如下:)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package day09;import java.util.Comparator;import java.util.Iterator;import java.util.Set;import java.util.TreeSet;public class TestComparator { public static void main(String[] args) { //用于构造方法中的匿名内部类 Set<Person> set = new TreeSet<Person>(new Comparator<Person>(){ public int compare(Person o1, Person o2) { //根据年龄比较 return o1.getAge()-o2.getAge(); } }); Person p1 = new Person("张非",20); Person p2 = new Person("李斯",30); Person p3 = new Person("张非",20); Person p4 = new Person("王剑",25); Person p5 = new Person("赵敏",23); set.add(p1); set.add(p2); set.add(p3); set.add(p4); set.add(p5); Iterator<Person> it = set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }} |
java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)的更多相关文章
- Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 [ 转载 ]
Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 @author Trinea 原文链接:http://www.trinea.cn/android/arrayl ...
- Java基础系列 - JAVA集合ArrayList,Vector,HashMap,HashTable等使用
package com.test4; import java.util.*; /** * JAVA集合ArrayList,Vector,HashMap,HashTable等使用 */ public c ...
- Java中ArrayList,Vector,LinkedList,HashMap,HashTable,HashSet对比及总结
1.所有的集合的父类都是Collection的接口 2.Set List Map 区别 A 在Set里面:无法添加元素的顺序,所以Set里面的元素不能重复 B 在List中:有索引号,类似于数组, ...
- java并发系列(三)-----ReentrantLock(重入锁)功能详解和应用演示
1. ReentrantLock简介 jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock.虽然在性能上ReentrantLock和synchronize ...
- Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- ArrayList, LinkedList, Vector - dudu:史上最详解
ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...
- ArrayList Vector LinkedList(一)
ArrayList Vector LinkedList 区别与用法 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素, ...
- java集合系列之LinkedList源码分析
java集合系列之LinkedList源码分析 LinkedList数据结构简介 LinkedList底层是通过双端双向链表实现的,其基本数据结构如下,每一个节点类为Node对象,每个Node节点包含 ...
- Java集合框架之LinkedList浅析
Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...
随机推荐
- Vue进阶篇
前引 今天是2018年12月30,虽不是2018年的最后一天,但是却是自己在2018年写的最后一篇博客了,昨天下班在地铁上闲来无事,翻起了关注的一些公众号发的技术博文,里面就提到写博客的重要性,其实这 ...
- [Linux][Ubuntu18.04.1] nginx+php+MySQL环境搭建
说在前面 今天在腾讯云的CVM服务器搭建了一下环境[主机:标准型S2,Unbuntu18.04的LST版本] 采用了nginx服务器(Nginx 静态处理性能比 Apache高3倍以上,不过apach ...
- 基于vue2.0的后管系统(配置篇)
一些项目依赖package.json { "name": "frontend", "description": "tssp bas ...
- js封装插件【组件】三种方式,含es6新特性。
1.先来说一下我使用到的es6的Object.assign.在jq里合并对象用的是extend方法,用来处理默认参数和传入参数做合并.es6里为我们提供了Object.assign,但是ie下全部撂倒 ...
- css写无缝滚动
html结构: <div class="authority"> <ul> <li> <img src="./images/rep ...
- 洛谷P1486 [NOI2004]郁闷的出纳员 [STL,平衡树]
题目传送门 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...
- 在phpWeChat里生成一个临时二维码(非微信二维码)
phpWeChat作为支持Pc+H5开发的管理系统,内置一套二维码生成API,访问地址: 您的域名/api/qrcode/index.php?data=二维码数据 以下为使用示例 使用时有一点需要注意 ...
- property staticmathod classmethod 反射
使用@property 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻 ...
- FastReport.Net使用:[8]交叉表一
1.绘制报表标题,交叉表可以直接放在标题栏内. 2.拖动一交叉表控件到标题栏内. 3.设置交叉表的行列信息. 将Tabel中的[科室名称]列拖到交叉表的列上以创建列,将Tabel中的[姓名]列拖到交叉 ...
- Eigen学习笔记2:C++矩阵运算库Eigen介绍
Eigen常规矩阵定义 1.使用 Eigen的使用在官网上有详细的介绍,这里对我学习过程中用到的基本操作进行介绍.首先是矩阵的定义.在矩阵类的模板参数共有6个.一般情况下我们只需要关注前三个参数即可. ...