Java常用的集合类(一)

一、概述

          在Java开发中,集合的使用几乎随处可见。对Java集合概念良好的理解和对一些集合常用类的熟练使用,对算法的设计和业务开发过程中数据的处理都有莫大的帮助。

二、集合的概念

 集合:就是一种容器,用于保存一组元素,与数组相比较具有以下的特点。

 数组:1、长度固定,不可更改   

             2、须保存相同类型的元素

 集合:1、长度可变,自动扩容

             2、可保存不同类型的元素。

Java集合可分为Collection和Map两种体系,Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字/值对。

三、Collection体系 

Collection之下主要包含常用的List和Set两个接口以及其派生出来的实现类,List和Set主要有以下其特点及其它们的区别。

(1)List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。

(2)集合中的对象不按特定的方式排序,并且没有重复对象。

3、1  List

  List接口包含ArrayList和LinkedList两个常用的连个实现类。其特点、效率区别须从数据结构中的数组和链表来理解。

(1)ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
(2)对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
(3)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

List的API

 void add(String item) 
将指定的项目添加到滚动列表的末尾。  
void add(String item, int index) 
将指定的项目添加到由索引指示的位置的滚动列表中。  
void addActionListener(ActionListener l) 
添加指定的动作侦听器以从此列表接收动作事件。  
void addItem(String item) 
已弃用 
换成add(String) 。  
void addItem(String item, int index) 
已弃用 
换成add(String, int) 。  
void addItemListener(ItemListener l) 
添加指定的项目侦听器以从该列表接收项目事件。  
void addNotify() 
创建列表的对等体。  
boolean allowsMultipleSelections() 
已弃用 
从JDK 1.1版开始,由isMultipleMode() 。  
void clear() 
已弃用 
截至JDK 1.1版,由removeAll() 。  
int countItems() 
已弃用 
从JDK 1.1版开始,替换为getItemCount() 。  
void delItem(int position) 
已弃用 
替换为remove(String)和remove(int) 。  
void delItems(int start, int end) 
已弃用 
从JDK 1.1版开始,未来不会公开使用。 这种方法只能作为一个包私有方法保留。  
void deselect(int index) 
取消选择指定索引处的项目。  
AccessibleContext getAccessibleContext() 
获取 AccessibleContext与此相关 List 。  
ActionListener[] getActionListeners() 
返回在此列表中注册的所有动作侦听器的数组。  
String getItem(int index) 
获取与指定索引关联的项目。  
int getItemCount() 
获取列表中的项目数。  
ItemListener[] getItemListeners() 
返回在此列表中注册的所有项目侦听器的数组。  
String[] getItems() 
获取列表中的项目。  
<T extends EventListener>
T[] getListeners(类<T> listenerType) 
返回当前注册为 FooListener的所有对象的数组,此 List 。  
Dimension getMinimumSize() 
确定此滚动列表的最小大小。  
Dimension getMinimumSize(int rows) 
获取具有指定行数的列表的最小尺寸。  
Dimension getPreferredSize() 
获取此滚动列表的首选大小。  
Dimension getPreferredSize(int rows) 
获取具有指定行数的列表的首选尺寸。  
int getRows() 
获取此列表中的可见行数。  
int getSelectedIndex() 
获取列表中所选项目的索引,  
int[] getSelectedIndexes() 
获取列表中选定的索引。  
String getSelectedItem() 
获取此滚动列表中选定的项目。  
String[] getSelectedItems() 
获取此滚动列表中选定的项目。  
Object[] getSelectedObjects() 
在对象数组中获取此滚动列表中选定的项目。  
int getVisibleIndex() 
获取最后通过方法 makeVisible可见的项目的索引。  
boolean isIndexSelected(int index) 
确定是否选择了此滚动列表中的指定项目。  
boolean isMultipleMode() 
确定此列表是否允许多个选择。  
boolean isSelected(int index) 
已弃用 
从JDK 1.1版开始,由isIndexSelected(int) 。  
void makeVisible(int index) 
使指定索引处的项目可见。  
Dimension minimumSize() 
已弃用 
从JDK 1.1版开始,替换为getMinimumSize() 。  
Dimension minimumSize(int rows) 
已弃用 
从JDK 1.1版开始,由getMinimumSize(int) 。  
protected String paramString() 
返回表示此滚动列表状态的参数字符串。  
Dimension preferredSize() 
已弃用 
从JDK 1.1版开始,替换为getPreferredSize() 。  
Dimension preferredSize(int rows) 
已弃用 
截至JDK 1.1版,由getPreferredSize(int) 。  
protected void processActionEvent(ActionEvent e) 
通过将此组件发送到任何已注册的 ActionListener对象来处理此组件上发生的操作事件。  
protected void processEvent(AWTEvent e) 
在此滚动列表中处理事件。  
protected void processItemEvent(ItemEvent e) 
通过将它们发送到任何已注册的 ItemListener对象来处理在此列表上发生的项目事件。  
void remove(int position) 
从此滚动列表中移除指定位置的项目。  
void remove(String item) 
从列表中删除项目的第一次出现。  
void removeActionListener(ActionListener l) 
删除指定的动作侦听器,使其不再从此列表中接收到动作事件。  
void removeAll() 
从此列表中删除所有项目。  
void removeItemListener(ItemListener l) 
删除指定的项目监听器,使其不再从此列表中接收项目事件。  
void removeNotify() 
删除此列表的对等体。  
void replaceItem(String newValue, int index) 
使用新的字符串替换滚动列表中指定索引处的项目。  
void select(int index) 
选择滚动列表中指定索引处的项目。  
void setMultipleMode(boolean b) 
设置确定此列表是否允许多个选择的标志。  
void setMultipleSelections(boolean b) 
已弃用 
从JDK 1.1版开始,替换为setMultipleMode(boolean)  

ArrayList与LinkedList实现方式及遍历方式类似

public class FunctionClass {
    public static void main(String[] args) {
        //1、Collection接口对象,默认泛型为Object
        List arr=new ArrayList();
        LinkedList link=new LinkedList();
        //2、调用常用方法
        arr.add(1);
        arr.add("hell");
        arr.add(false);

        link.add("hello");
        link.add("test");
        link.add(1);
        //3、通过下标获取对应元素
       // System.out.println(arr.get(0));
        // 遍历可以迭代器或是for,在开发过程主要还是for遍历的方法吧
//        Iterator iterable=arr.iterator();
//          while (iterable.hasNext()){
//           System.out.println(iterable.next());
//        }
        
        Iterator iterableLink=link.iterator();
        while (iterableLink.hasNext())
        {
            System.out.println(iterableLink.next());
        }
    }
}

3、1  Set

Set一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1e2,并且最多包含一个 null 元素。其包含常用的子类HashSet与TreeSet。

HashSet有以下特点

(1)保证元素的排列顺序,顺序有可能发生变化

(2) 不是同步的

(3)集合元素可以是null,但只能放入一个null

(4)当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。

HashSet的API

boolean add(E e) 
将指定的元素添加到此集合(如果尚未存在)。  
void clear() 
从此集合中删除所有元素。  
Object clone() 
返回此 HashSet实例的浅层副本:元素本身不被克隆。  
boolean contains(Object o) 
如果此集合包含指定的元素,则返回 true 。  
boolean isEmpty() 
如果此集合不包含元素,则返回 true 。  
Iterator<E> iterator() 
返回此集合中元素的迭代器。  
boolean remove(Object o) 
如果存在,则从该集合中删除指定的元素。  
int size() 
返回此集合中的元素数(其基数)。  
Spliterator<E> spliterator() 
在此集合中的元素上创建late-binding和故障快速 Spliterator 。 

HashSet基本使用及遍历

public class FunctionClass {
    public static void main(String[] args) {
        //Set集合  无序、不允许重复,只允许一个null
        Set set=new HashSet();
        //添加元素
        set.add("hello");
        set.add(1);
        set.add("word");
        //遍历,其属于collection接口的子类,故可以使用其迭代器
        Iterator ite=set.iterator();
        while(ite.hasNext())
        {
            System.out.println(ite.next());
        }
    }
}

    TreeSet

    TreeSet类型是J2SE中唯一可实现自动排序的类型,是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。

TreeSet的API

boolean add(E e) 
将指定的元素添加到此集合(如果尚未存在)。  
boolean addAll(Collection<? extends E> c) 
将指定集合中的所有元素添加到此集合中。  
E ceiling(E e) 
返回此集合中最小元素大于或等于给定元素,如果没有此元素,则返回 null 。  
void clear() 
从此集合中删除所有元素。  
Object clone() 
返回此 TreeSet实例的浅拷贝。  
Comparator<? super E> comparator() 
返回用于对该集合中的元素进行排序的比较器,或null,如果此集合使用其元素的natural ordering 。  
boolean contains(Object o) 
如果此集合包含指定的元素,则返回 true 。  
Iterator<E> descendingIterator() 
以降序返回该集合中的元素的迭代器。  
NavigableSet<E> descendingSet() 
返回此集合中包含的元素的反向排序视图。  
E first() 
返回此集合中当前的第一个(最低)元素。  
E floor(E e) 
返回此集合中最大的元素小于或等于给定元素,如果没有这样的元素,则返回 null 。  
SortedSet<E> headSet(E toElement) 
返回此集合的部分的视图,其元素严格小于 toElement 。  
NavigableSet<E> headSet(E toElement, boolean inclusive) 
返回该集合的部分的视图,其元素小于(或等于,如果 inclusive为真) toElement 。  
E higher(E e) 
返回严格大于给定元素的该集合中的最小元素,如果没有此元素则返回 null 。  
boolean isEmpty() 
如果此集合不包含元素,则返回 true 。  
Iterator<E> iterator() 
以升序返回该集合中的元素的迭代器。  
E last() 
返回此集合中当前的最后(最高)元素。  
E lower(E e) 
返回这个集合中最大的元素严格小于给定的元素,如果没有这样的元素,则返回 null 。  
E pollFirst() 
检索并删除第一个(最低)元素,或返回 null如果该集合为空。  
E pollLast() 
检索并删除最后一个(最高)元素,如果此集合为空,则返回 null 。  
boolean remove(Object o) 
如果存在,则从该集合中删除指定的元素。  
int size() 
返回此集合中的元素数(其基数)。  
Spliterator<E> spliterator() 
在此集合中的元素上创建late-binding和故障切换 Spliterator 。  
NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) 
返回该集合的部分的视图,其元素的范围从 fromElement到 toElement 。  
SortedSet<E> subSet(E fromElement, E toElement) 
返回此集合的部分的视图,其元素的范围从 fromElement (含)到 toElement ,排他。  
SortedSet<E> tailSet(E fromElement) 
返回此组件的元素大于或等于 fromElement的部分的视图。  
NavigableSet<E> tailSet(E fromElement, boolean inclusive) 
返回此集合的部分的视图,其元素大于(或等于,如果 inclusive为真) fromElement 。 

TreeSet的基本使用和遍历

public class FunctionClass {
    public static void main(String[] args) {
        //Set集合  无序、不允许重复,只允许一个null
        Set set=new TreeSet();
        //添加元素
        set.add("hello");
        set.add("woed");
        set.add("hell");
        //遍历,其属于collection接口的子类,故可以使用其迭代器
        Iterator ite=set.iterator();
        //输出的结果会排序
        while(ite.hasNext())
        {
            System.out.println(ite.next());
        }
    }
}

四、Map体系

Interface Map<K,V>参数类型

K - 由此地图维护的键的类型

V - 映射值的类型

将键映射到值的对象。 地图不能包含重复的键; 每个键可以映射到最多一个值。

Map接口它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap。基本的实现都基本类似,各个存在的特点

(1)HashMap:此实现提供了所有可选的地图操作,并允许null的值和null键,此实现提供了所有可选的地图操作,并允许null的值和null键。 ( HashMap类大致相当于Hashtable ,除了它是不同步的,并允许null)。这个类不能保证地图的顺序; 特别是,它不能保证订单在一段时间内保持不变。HashMap非线程安全,请注意,此实现不同步。 如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,那么它必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅改变与实例已经包含的密钥相关联的值不是结构修改。)这通常通过对自然地封装映射的一些对象进行同步来实现。 如果没有这样的对象存在,地图应该使用Collections.synchronizedMap方法“包装”。
(2)Hashtable:该类实现了一个哈希表,它将键映射到值。 任何非null对象都可以用作键值或值。与新的集合实现不同, Hashtable是同步的。 如果不需要线程安全的实现,建议使用HashMap代替Hashtable 。 如果需要线程安全的并发实现,那么建议使用ConcurrentHashMap代替Hashtable
(3)LinkedHashMap:哈希表和链表实现的Map接口,具有可预测的迭代次序。 这种实现不同于HashMap,它维持于所有条目的运行双向链表。 此链接列表定义迭代排序,通常是将键插入到地图(插入顺序 )中的顺序 。 请注意,如果将键重新插入到地图中,则插入顺序不受影响。 (A键k被重新插入到地图m如果当m.containsKey(k)将返回true之前立即调用m.put(k, v)被调用。)LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。
(4)TreeMap:TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。如果使用排序的映射,建议使用TreeMap。在使用TreeMap时,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException类型的异常。

Map接口的API

void clear() 
从该地图中删除所有的映射(可选操作)。  
default V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 
尝试计算指定键的映射及其当前映射的值(如果没有当前映射, null )。  
default V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) 
如果指定的键尚未与值相关联(或映射到 null ),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非 null 。  
default V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 
如果指定的密钥的值存在且非空,则尝试计算给定密钥及其当前映射值的新映射。  
boolean containsKey(Object key) 
如果此映射包含指定键的映射,则返回 true 。  
boolean containsValue(Object value) 
如果此地图将一个或多个键映射到指定的值,则返回 true 。  
Set<Map.Entry<K,V>> entrySet() 
返回此地图中包含的映射的Set视图。  
boolean equals(Object o) 
将指定的对象与此映射进行比较以获得相等性。  
default void forEach(BiConsumer<? super K,? super V> action) 
对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。  
V get(Object key) 
返回到指定键所映射的值,或 null如果此映射包含该键的映射。  
default V getOrDefault(Object key, V defaultValue) 
返回到指定键所映射的值,或 defaultValue如果此映射包含该键的映射。  
int hashCode() 
返回此地图的哈希码值。  
boolean isEmpty() 
如果此地图不包含键值映射,则返回 true 。  
Set<K> keySet() 
返回此地图中包含的键的Set视图。  
default V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) 
如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。  
V put(K key, V value) 
将指定的值与该映射中的指定键相关联(可选操作)。  
void putAll(Map<? extends K,? extends V> m) 
将指定地图的所有映射复制到此映射(可选操作)。  
default V putIfAbsent(K key, V value) 
如果指定的键尚未与某个值相关联(或映射到 null )将其与给定值相关联并返回 null ,否则返回当前值。  
V remove(Object key) 
如果存在(从可选的操作),从该地图中删除一个键的映射。  
default boolean remove(Object key, Object value) 
仅当指定的密钥当前映射到指定的值时删除该条目。  
default V replace(K key, V value) 
只有当目标映射到某个值时,才能替换指定键的条目。  
default boolean replace(K key, V oldValue, V newValue) 
仅当当前映射到指定的值时,才能替换指定键的条目。  
default void replaceAll(BiFunction<? super K,? super V,? extends V> function) 
将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。  
int size() 
返回此地图中键值映射的数量。  
Collection<V> values() 
返回此地图中包含的值的Collection视图。  

Map接口的一些基本使用方法

public class FunctionClass {
    public static void main(String[] args) {
        List list=new ArrayList();
        list.add("hello");
        list.add("word");
       //创建对象
      Map map=new HashMap();
      //调用常用方法
        map.put("number",10);
        //因为键码必须唯一,故20覆盖掉10
        map.put("number",20);
        map.put("count",list.size());
        map.put("data",list);
        System.out.println(map.containsValue(20));//判断是否包含键值等于20的数据
      //  System.out.println(map.entrySet());//获取所有关系
        System.out.println(map.keySet());
        System.out.println(map);//直接显示结果
        //Map方式的遍历
        Set set=map.entrySet();//entrySet()返回此地图中包含的映射的Set视图。
        //借助迭代器遍历,方式一
        Iterator iterator=set.iterator();
        while (iterator.hasNext())
        {
            //获取每一对的关系
            Map.Entry entry=(Map.Entry) iterator.next();
            System.out.println(entry.getKey()+":"+entry.getValue());
        }
        //借助迭代器遍历,方式二
        Set keyset=map.keySet();//获取所有的键码
        for(Object object:keyset)
        {
            //根据键码取值
            System.out.println(object+":"+map.get(object));
        }

    }
}}
发布了7 篇原创文章 · 获赞 2 · 访问量 212

猜你喜欢

转载自blog.csdn.net/suiyuanxiangyu/article/details/103931930