美文网首页Java 杂谈
Java笔记——容器学习笔记

Java笔记——容器学习笔记

作者: 振礼硕晨 | 来源:发表于2018-12-30 14:20 被阅读12次

容器的作用

首先我们开门见山,说一下什么是容器。日常生活中的容器,比如箱子、盒子等,是用来存放我们的日常用品的,Java中的容器与此类似,也是用来存放东西的,即程序中的对象。

你可能会问:在Java中为什么非要使用容器呢?Java中的数组也可以用来存放对象,而且使用数组还非常的方便。

如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构,使用数组就足够了。

然而,一般情况下,我们并不知道要创建多少对象,或者以何种方式创建对象。数组显然只能创建固定长度的对象,为了使程序变得更加灵活与高效,Java类库提供了一套完整的容器类,具备完善的方法来解决上述问题。

容器的类别

容器主要分为两种类型: CollectionMap 。Collection用以保存单一的元素,Map保存关联键值对。具体的层次结构如下图所示:

Collection下有两个子接口,分别是List和Set。List的特点是:元素有序、可重复。Set的特点是元素无序、不可重复。这个两个接口下又有很多的实现类,常见的几个如上图所示。

Map有很多实现类,常用的几个如上图所示。

Collection实现类用法总结

ArrayList

ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。

和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。

下面列出一些常用的方法:

方法 方法简介
add(Object obj); 插入一个对象
add(int i,Object obj); 在指定位置插入对象
addAll(Conllection c); 将容器c中的对象添加进来
addAll(int i,Collection c); 将容器c中的对象添加到指定位置
set(int i,Object newObj); 修改指定位置的对象
remove(int i); 将指定位置的对象从容器中移除,但是该对象没有被删除
removeAll(Collection c); 将容器c中的对象从容器中全部删除
remove(Object obj); 将对象从容器中移除,但是该对象没有被删除
clear() 将容器中的对象全部移除
get(int i) 获取指定索引出的对象
contains(Object obj) 查询列表中是否包含指定对象,包含返回true
containsAll(Collection c) 查询列表中是否包含指定的多个元素,全部包含返回true
indexOf(Object obj) 查询指定元素第一次出现的下标,返回下标索引,没有钙元素返回-1
lastIndexOf(Object obj) 查询指定元素最后一次出现的下标,返回下标索引,没有钙元素返回-1
isEmpty() 判断列表是否为空,为空返回true
iterator() 返回一个迭代器,可以用来遍历list,后面会讲到

LinkedListList

LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用。有以下特点:

  • 与ArrayList对比,LinkedList插入和删除操作更加高效,随机访问速度慢;
  • 可以作为栈、队列、双端队列数据结构使用;
  • 非同步,线程不安全;
  • 与ArrayList、Vector一样,LinkedList的内部迭代器存在“快速失败行为”;
  • 支持null元素、有顺序、元素可以重复;

下面列出一些常用的方法:

方法 方法简介
LinkedList() 构造一个空链表
LinkedList(Collection col) 复制一个容器
add(Object obj); 插入一个对象
add(int i,Object obj); 在指定位置插入对象
getFirst() 获取第一个元素
getLast() 获取最后一个元素
subList(int fromIndex, int toIndex) 从链表中子表,返回的类型是List类型
addFirst() 链表头部添加元素
addLast() 链表尾部添加元素
removeFirst() 移除链表的第一个元素
removeLast 移除链表的最后一个元素
clear() 清空链表中的元素

Vector

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

java.util.vector提供了向量类(Vector)以实现类似动态数组的功能。

创建了一个向量类的对象后,可以往其中随意插入不同类的对象,即不需顾及类型也不需预先选定向量的容量,并可以方便地进行查找。

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

因为Vector中的方法和前面的ArrayList、LinkedList类似,这里就不一一列举。

Collection容器的遍历

使用迭代器进行遍历

迭代器(iterator)有时又称为游标(cursor),提供一种方法遍历容器内的各个元素,而又不暴露容器中的内部细节。迭代器是为遍历容器而生,用以方便的实现对容器内元素的遍历操作。下面提供几个实例:

使用迭代器遍历ArrayList

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

public class TestArrayList {
    public static void main(String[] args) {
        
        List list = new ArrayList();
        list.add(new Date());
        list.add(1, "fengzhen");
        list.add(666);


        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

使用迭代器遍历LinkedList

import java.util.Iterator;
import java.util.LinkedList;

public class TestLinkedList {
    public static void main(String[] args) {

        LinkedList list01 = new LinkedList();
        list01.add("fengzhen");
        list01.add("Tom");
        list01.addFirst("Jack");
        list01.add("Jane");
        list01.add("Kim");


        Iterator iterator01 = list01.iterator();
        while (iterator01.hasNext()) {
            System.out.println(iterator01.next());
        }
    }
}

使用迭代器遍历Vector

import java.util.Iterator;
import java.util.Vector;

public class TestVector {

    public static void main(String[] args) {

        Vector v = new Vector();
        v.add("fengzhen");
        v.add(5555);
        v.add(1, 6);


        Iterator i = v.iterator();
        while (i.hasNext()) {
            System.out.println(i.next());
        }
    }
}

使用增强for循环进行遍历

使用增强for循环进行遍历也可以对Collection容器进行遍历,实例如下:

for (Object item : list) {
    System.out.println(item);
}

Map实现类用法总结

Map接口是java定义的一种键值对映射的数据结构接口,其实现类有四种:HashMap、LinkedHashMap、
Hashtable、TreeMap。

HashMap

Hashmap是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是 完全随机的

HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null(HashSet的实现就是在hashmap的值为空的情况下)。

HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

下面给出一些HashMap常用的方法:

方法 方法简介
put(key, value) 添加键值对元素
get(key) 去的键对应的值
isEmpty() 是否为空
containsKey() 是否含有键
containsValue() 是否含有值
remove(key) 删除该键对应的元素
remove(key, value) 删除该键值对对应的元素
keySet() 输出所有的键
values() 输出所有的值

LinkedHashMap

LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。

也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

LinkedHashMap的常用方法与HashMap的方法基本无异,这里就不一一列出,多看看源码进行学习。

Map容器的遍历

Map容器的遍历有很多方法,这里主要列出了使用迭代器进行遍历的方法:

import java.util.*;

public class TestHashMap {

    public static void main(String[] args) {

        HashMap myMap = new HashMap();
        myMap.put("a", "fengzhen");
        myMap.put("b", "Jack");
        myMap.put("c", 666);
        myMap.put("d", new Date());


        /**
         * 方法一:使用迭代器遍历
         */
        Iterator mapIterator01 = myMap.entrySet().iterator();
        while (mapIterator01.hasNext()) {
            System.out.println(mapIterator01.next());
        }


        /**
         * 方法二:使用的迭代器另一种方式遍历
         */
        Iterator mapIterator02 = myMap.entrySet().iterator();
        while (mapIterator02.hasNext()) {
            Map.Entry entry = (Map.Entry) mapIterator02.next();
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
    }
}

相关文章

  • Java笔记——容器学习笔记

    容器的作用 首先我们开门见山,说一下什么是容器。日常生活中的容器,比如箱子、盒子等,是用来存放我们的日常用品的,J...

  • 《Java并发编程实战》学习笔记--并发容器类

    《Java并发编程实战》学习笔记--同步容器类前面介绍了同步容器类,下面来说说并发容器类。 同步容器类:将所有对容...

  • Java 学习笔记(13)——lambda 表达式

    title: Java 学习笔记(11)——lambda 表达式tags: [Java 基础, 学习笔记, 函数式...

  • nio

    参考文章 Java Nio Java NIO学习笔记 - NIO客户端时序图 Java NIO学习笔记 - NIO...

  • java io

    参考Java IO学习笔记(一):File类Java IO学习笔记(二):RandomAccessFile类Jav...

  • Java学习日记

    title: Java学习笔记date: 2018-05-18 12:00:00tags: Java 学习笔记 P...

  • Java 学习笔记(10)——容器

    之前学习了java中从语法到常用类的部分。在编程中有这样一类需求,就是要保存批量的相同数据类型。针对这种需求一般都...

  • Office Onenote 笔记容器的使用

    Onenote笔记容器的学习 笔记容器的性质 容器是Onenote结构中没有被特别提起的部分,其实是非常重要的。O...

  • Thinking in Java——容器篇学习笔记

    写在前面:这是一篇菜鸟的学习笔记。 容器的简图 不包含抽象类和遗留构件 Java 容器类类库的用途是“保存对象”。...

  • Java8学习笔记目录

    Java8学习笔记 -- 接口的默认方法与静态方法 Java8学习笔记 -- Lambda表达式,Function...

网友评论

    本文标题:Java笔记——容器学习笔记

    本文链接:https://www.haomeiwen.com/subject/dohflqtx.html