说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,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(2new 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());
        }
    }
}

转自:http://wangzhaoli.blog.51cto.com/7607113/1257601

java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)的更多相关文章

  1. Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 [ 转载 ]

    Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 @author Trinea 原文链接:http://www.trinea.cn/android/arrayl ...

  2. Java基础系列 - JAVA集合ArrayList,Vector,HashMap,HashTable等使用

    package com.test4; import java.util.*; /** * JAVA集合ArrayList,Vector,HashMap,HashTable等使用 */ public c ...

  3. Java中ArrayList,Vector,LinkedList,HashMap,HashTable,HashSet对比及总结

    1.所有的集合的父类都是Collection的接口 2.Set List Map 区别 A  在Set里面:无法添加元素的顺序,所以Set里面的元素不能重复 B  在List中:有索引号,类似于数组, ...

  4. java并发系列(三)-----ReentrantLock(重入锁)功能详解和应用演示

    1. ReentrantLock简介 jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock.虽然在性能上ReentrantLock和synchronize ...

  5. Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  6. ArrayList, LinkedList, Vector - dudu:史上最详解

    ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...

  7. ArrayList Vector LinkedList(一)

    ArrayList Vector LinkedList 区别与用法 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素, ...

  8. java集合系列之LinkedList源码分析

    java集合系列之LinkedList源码分析 LinkedList数据结构简介 LinkedList底层是通过双端双向链表实现的,其基本数据结构如下,每一个节点类为Node对象,每个Node节点包含 ...

  9. Java集合框架之LinkedList浅析

    Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...

随机推荐

  1. vue 条件渲染与列表渲染

    本文是对官方文档的整理 因为 v-if 是一个指令,所以必须将它添加到一个元素上.但是如果想切换多个元素呢?此时可以把一个 <template> 元素当做不可见的包裹元素,并在上面使用 v ...

  2. go中操作json

    package main import ( "encoding/json" "fmt" ) type Server struct { ServerName st ...

  3. ServiceWorker pwa缓存

    index.js if ( navigator.serviceWorker ) { console.log("cache index") window.addEventListen ...

  4. 安装Caffe时出现的错误

    一.error MSB3073类错误 一般是由于CommonSettings.props配置出现错误. 第一处是你安装CUDA的版本号,第二次是你安装cudnn的路径. 也可参照http://blog ...

  5. Python之路【第五篇】: 函数、闭包、装饰器、迭代器、生成器

    目录 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之可迭代对象 函数之迭代器 函数之生成器 面向过程的程序设计思想 一.函数进阶之函数对象 1. 函数对象 秉承着 ...

  6. 【Python初级】由生成杨辉三角代码所思考的一些问题

    杨辉三角定义如下: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / \ ...

  7. Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果

    Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明 ...

  8. c++源文件后缀名问题

    VC里用cpp作后缀名, 在GCC里默认采用C.cc.cxx作为后缀名 .cpp, .h (VS file).cc, .h (GCC file)   C中: 头文件后缀名: .h 源文件后缀名: .c ...

  9. 加密url

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 可以采用 https 证书 双向 加密验证. 加密到 JNI 里面,还是可以通过抓包工具 ...

  10. 我的OI生涯番外篇

    番外篇 转眼间我学oi已经一年了,可回头想想这一年来的收获也没有什么,大部分时间都荒废掉了. 下半年开学后,学物竞的王洋转来了我们电竞,虽然他之前是我的同班同学但也没怎么交流过. 这下我们又成为了oi ...