Java集合类运用
Posted 金石不渝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合类运用相关的知识,希望对你有一定的参考价值。
java语法核心
集合类
最常用的集合类是 List 、Set和Map
1、List集合
1.1List概念
一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。
1.2List常用方法:
public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
public E get(int index):返回集合中指定位置的元素。
public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
2、List的子类
(1) ArrayList集合
该集合是动态数组结构。素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。
常用方法
- add() ——将指定元素添加到此集合的末尾或者在此集合中的指定位置插入指定元素
- addAll() ——将指定集合中的所有元素添加到此集合中,从指定位置开始
- clear() ——删除集合 中所有元素
- contains() ——判断此集合是否包含某个元素
- forEach() ——增强for循环
- get() ——返回此集合中指定下标的元素
- indexOf() ——获取指定元素在此集合中第一次出现的下标,未找到则返回 -1
- lastIndexOf() ——获取指定元素在此集合中最后一次出现的下标,未找到则返回 -1
- isEmpty() ——判断集合元素是否为空
- iterator() ——迭代器
- listIterator() ——迭代器
- remove() ——删除该集合中指定下标的元素/删除集合中第一次出现的指定元素
- removeAll() ——从该集合中删除指定集合中包含的所有元素
- retainAll() ——保留此集合在指定集合包含的所有元素
- removeIf() ——删除满足调教的所有元素
- set() ——将指定下标的元素替换成新元素
- size() ——获取此集合的元素个数
- sort() ——使用提供的 Comparator 对此集合进行排序toArray() ——以原顺序返回一个包含此列表所有元素的数组
(2) LinkedList集合
该集合数据存储的结构是链表结构。方便元素添加、删除的集合。
常用方法
- public void addFirst(E e):将指定元素插入此列表的开头。
- public void addLast(E e):将指定元素添加到此列表的结尾。
- public E getFirst():返回此列表的第一个元素。
- public E getLast():返回此列表的最后一个元素。
- public E removeFirst():移除并返回此列表的第一个元素。
- public E removeLast():移除并返回此列表的最后一个元素。
- public E pop():从此列表所表示的堆栈处弹出一个元素。
- public void push(E e):将元素推入此列表所表示的堆栈。
- public boolean isEmpty():如果列表不包含元素,则返回true。
2、Set集合
2、1 Set概念
包含重复元素的集合。更确切地说,是不同时包含使得e1.equals(e2)成立的e1和e2(因为e1与e2的equals()逻辑可以由使用者自己定义)。并且最多包含一个空元素。这个接口是数学集合的一个抽象建模。
2、2 Set子类
(1)HashSet集合
HashSet集合存储数据的结构(哈希表),对于允许空元素(即null);是不允许重复存储数据;且存储的数据是无序的;线程不安全的。
常用方法有:
- add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false。
- size():返回Set集合中的元素个数。
- remove(Object obj): 删除Set集合中的元素,删除成功返回true,否则返回false。
- isEmpty():如果Set不包含元素,则返回 true ,否则返回false。
- clear(): 移除此Set中的所有元素。
- iterator():返回在此Set中的元素上进行迭代的迭代器。
- contains(Object o):如果Set包含指定的元素,则返回 true,否则
- 返回false。
遍历的方法有:
例如借助iterator方法进行Set遍历:
import java.util.HashSet;
import java.util.Iterator;
public class Test
public static void main(String[] args)
HashSet<String> set = new HashSet<String>();
set.add("Hash");
set.add("set");
Iterator<String> ite =set.iterator();
while(ite.hasNext())
System.out.println(ite.next());
加强for循环遍历Set集合:
import java.util.HashSet;
public class Test
public static void main(String[] args)
HashSet<String> set = new HashSet<String>();
set.add("hash");
set.add("set");
for (String name : set) //使用foreach进行遍历。
System.out.println(name);
(2)TreeSet集合
TreeSet类是实现Set接口的3个使用的类之一,是 Set 集合的实现类,因此它也具有元素唯一性和无序性,它的底层数据结构是 TreeMap 树结构,它确保元素的唯一性是通过 Compareable 接口的 compareto 方法,另外,它既是无序的,又是有序的。无序指的是存储元素顺序和输出顺序不同,有序指的是遍历集合时,输出的所有元素是有序的。
常用的方法有:
- add(E e)如果指定的元素尚不存在,则将其添加到此集合中。
- addAll() 将指定集合中的所有元素添加到此集合中。
- remove() 如果存在,则从该集合中移除指定的元素。
- size() 返回此集合中的元素数(其基数)。
- isEmpty() true如果此set不包含任何元素,则返回
- contains() true如果此set包含指定的元素,则返回。
(3)LinkedHashSet集合
LinkedHashSet是HashSet的有序版本,它跨所有元素维护一个双向链接的List。当需要维护迭代顺序时,就使用这个类。当遍历HashSet时,顺序是不可预测的,而LinkedHashSet允许我们按插入元素的顺序遍历元素。当使用迭代器循环使用LinkedHashSet时,元素将按插入的顺序返回。
常用方法有:
-
equals() 用于验证对象与HashSet是否相等并比较它们。只有当两个HashSet都包含相同的元素时,该列表才会返回true,无论顺序如何。
-
hashcode() 返回此集合的散列代码值。
-
removeAll(collection) 此方法用于删除集合中存在于集合中的所有元素。如果该集合因调用而发生更改,则此方法返回true。
-
addAll(collection) 此方法用于将上述集合中的所有元素追加到现有集合。元素是随机添加的,不遵循任何特定的顺序。
-
containsAll(collection) 此方法用于检查集合是否包含给定集合中的所有元素。如果集合包含所有元素,则该方法返回true;如果缺少任何元素,则返回false。
-
retainAll(collection) 此方法用于保留集合中给定集合中提到的所有元素。如果该集合因调用而发生更改,则此方法返回true。
-
toArray() 此方法用于形成与Set的相同元素的数组。
-
toString() Java HashSet的toString()方法用于返回HashSet集合元素的字符串表示形式。
下面是它的特点有:
- LinkedHashSet类只包含HashSet这样的唯一元素。
- LinkedHashSet类提供了所有可选的集操作,并允许有空元素。
- LinkedHashSet类是非同步的。
- LinkedHashSet类维护插入顺序。
(4)HashSet、TreeSet、LinkedHashSet三者之间的比较
4、1HashSet与TreeSet的区别
1、HashSet与TreeSet接口的一点不同,HashSet 保存的数据是无序的,TreeSet保存的数据是有序的,所以如果要想保存的数据有序应该使用TreeSet子类。
2、利用TreeSet保存自定义类对象的时候,自定义所在的类一定要实现Comparable接口,如果没有实现这个接口那么就无法区分大小关系,而且在TreeSet中如果要进行排序,那么就要将所有的字段都进行比较,就是说在TreeSet中是依靠comparato()方法返回的是不是0来判断是不是重复元素的。
3、如果是HashSet子类,那么其判断重复数据的方式不是依靠的comparable接口而是Object类之中的两个方法:(1)取得对象的哈希码 hashCode();(2)对象比较:equals(); 这俩个方法均不需要自己编写,在eclipse里面可以使用右键source 选择自动生成。就像生成Getter 和Setter 方法一样。
总结:TreeSet 依靠的是Comparable 来区分重复数据;
HashSet 依靠的是hashCode()、equals()来区分重复数据
Set 里面不允许保存重复数据。
4、2TreeSet 和 LinkedHashSet 都是 Java 中的集合类,它们各自有不同的特点和用途
- TreeSet
TreeSet 是基于红黑树数据结构实现的有序集合类。它继承自 AbstractSet,实现了NavigableSet 和 SortedSet 接口。TreeSet 中的元素会按照元素的自然顺序(升字)排序,或者按照用户提供的 Comparator 进行排序
TreeSet 的主要特点如下:
内部有序: TreeSet 内部使用红黑树实现,因此元素是有序的,可以进行快速的有序操作,例如查找、删除、插入等。
不允许重复元素: TreeSet 不允许插入重复的元素,插入相同元素会被忽略可以自定义排序方式: TreeSet 可以根据用户提供的 Comparator 对元素进行排序,如果没有提供 Comparator 则按照元素的自然顺序排序。 - LinkedHashSet
LinkedHashSet 是基于哈希表和链表数据结构实现的有序集合类。它继承自HashSet,实现了 Set 接口。LinkedHashSet 与 HashSet 的区别在于,它使用链表维护元素插入的顺序,因此可以保持插入顺序。
LinkedHashSet 的主要特点如下:
有序: LinkedHashSet 中的元素按照插入顺序排序,因此可以保证元素的有序性.不允许重复元素: 与 HashSet 相同,LinkedHashSet 也不允许插入重复的元素,插入相同元素会被忽略。
遍历效率高: LinkedHashSet 在遍历时可以利用链表结构快速访问元素,因此遍历效率较高。
因此,如果需要一个有序集合且不允许插入重复元素,可以使用 TreeSet; 如果需要个有序集合且需要保持插入顺序,可以使用 LinkedHashSet。但是需要注意,LinkedHashSet 的插入和查询效率可能不如 TreeSet,因为它是基于哈希表实现的哈希冲突的情况下查询效率可能会受到影响
3、Map集合
3、1 Map概念
Map是一个接口,我们不能直接创建对象,可以通过多态的形式创建对象,Map中有两个
参数,一个是K表示键,一个是V表示值,且一个键有且对应一个值,Map中不能包含重复的
键,若是有重复的键添加,则会以最后一次的键为准,而其他的键会被覆盖。集合都在
java.util包下,所以需要导包。
常用的方法有
- public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
- public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
- public V get(Object key): 根据指定的键,在Map集合中获取对应的值。
- boolean containsKey(Object key): 判断集合中是否包含指定的键。
- public Set keySet(): 获取Map集合中所有的键,存储到Set集合中。
- public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
3、2 Map子类
(1)HashMap集合
存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
使用 HashMap
定义的 Map
集合是无序存放的。
遍历的方法:
1、增强for循环
Set keyset = hashMap.keySet();
for(Object key:keyset)
System.out.println(key+"-"+hashMap.get(key));
2、使用迭代器
Iterator iterator = keyset.iterator();
while(iterator.hasNext())
Object key = iterator.next();
System.out.println(key+"-"+hashMap.get(key));
3、通过entrySet
Set set = hashMap.entrySet();
for(Object key:set)
Map.Entry entry = (Map.Entry) key;
System.out.println(entry.getKey()+"-"+entry.getValue());
(2)TreeMap集合
TreeMap 是一个有序的key-value集合,非同步,基于红黑树(Red-Black tree)实现,每个key-value作为红黑树的一个节点。
TreeMap存储时会进行排序的,会根据key来对key-value键值对进行排序,其中排序方式也是分为两种,一种是默认排序(按key的升序),一种是定制排序,具体取决于使用的构造方法。
TreeMap基于红黑树实现,而红黑树是一种自平衡二叉查找树,所以 TreeMap 的查找操作流程和二叉查找树一致。二叉树的查找流程是这样的,先将目标值和根节点的值进行比较,如果目标值小于根节点的值,则再和根节点的左孩子进行比较。如果目标值大于根节点的值,则继续和根节点的右孩子比较。在查找过程中,如果目标值和二叉树中的某个节点值相等,则返回 true,否则返回 false。TreeMap 查找和此类似,只不过在 TreeMap 中,节点(Entry)存储的是键值对<k,v>。在查找过程中,比较的是键的大小,返回的是值,如果没找到,则返回null。TreeMap 中的查找方法是get,具体实现在getEntry方法中。
方法和上面同;
遍历也是;
(3)LinkedHashMap集合
HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,因此在遍历的时候会比HashMap效率要低。
不过也有例外情况,当HashMap容量很大,实际存储的数据较少时,遍历起来可能会比LinkedHashMap要慢,因
为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
HashMap和 LinkedHashMap使用场景
一般情况下,在Map 中插入、删除和定位元素,HashMap 是最好的选择。如果需要元素输出的顺序和输入的相
同,就需要选择LinkedHashMap了。
以上是关于Java集合类运用的主要内容,如果未能解决你的问题,请参考以下文章