java集合的一些用法


前言

集合是JAVA中必不可少的用法,在编写JAVA程序时除了用数据库之外一般都是用集合来保存数据的,各个集合有其各自的特点。


一、Collection

1、定义

Collection 接口是在整个 Java 类集中保存单值的最大操作父接口,里面每次操作的时候都只能保存一个对象的数据。 此接口定义在 java.util 包中

2、常用操作

方法作用
public boolean add(E e)把给定的对象添加到当前集合中 。
public void clear()清空集合中所有的元素。
public boolean remove(E e)把给定的对象在当前集合中删除。
public boolean contains(E e)判断当前集合中是否包含给定的对象。
public boolean isEmpty()判断当前集合是否为空。
public int size()返回集合中元素的个数。
public Object[] toArray()把集合中的元素,存储到数组中。

3、List接口

(1)定义

在整个集合中 List 是 Collection 的子接口,里面的所有内容都是允许重复的。 并且其里面的内容是有序的,所谓的有序就是可以通过下标来对集合进行操作。

(2)常用方法

方法作用
public void add(int index, E element)将指定的元素,添加到该集合中的指定位置上。
public E get(int index)返回集合中指定位置的元素。
public E remove(int index)移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新 前的元素。

(3)ArrayList

ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用 多的功能为查询数据、遍历数据,所以 ArrayList 是最常用的集合。方法的话则上面都已经提供了。扩容的话是原来的1.5倍。

(4)LinkedList

LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合。LinkedList是一个双向链表。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。下列方法作为了解即可。

方法作用
void addFirst(E e):将指定元素插入此列表的开头。
addLast(E e):将指定元素添加到此列表的结尾。
E getFirst():返回此列表的第一个元素。
E getLast():返回此列表的后一个元素。
E removeFirst():移除并返回此列表的第一个元素。
E removeLast():移除并返回此列表的后一个元素。
E pop()从此列表所表示的堆栈处弹出一个元素。
void push(E e)将元素推入此列表所表示的堆栈。
boolean isEmpty():如果列表不包含元素,则返回true。

(5)Vector

此类与 ArrayList 类一样,都是 AbstractList 的子类。所以,此时的操作只要是 List 接口的子类就都按照 List 进行操作。 其底层是数组,线程是安全的。同步来进行处理的,所以性能较低。扩容的话为原容量的 2倍

4、set接口

Set 接口也是 Collection 的子接口,与 List 接口最大的不同在于,Set 接口里面的内容是不允许重复的。并且其里面的内容是无序的,即不可以通过下标来对数组进行操作。 Set 接口并没有扩充任何的 Collection 接口中的内容,所以使用的方法全部都是 Collection 接口定义而来的。

(1)HashSet

HashSet 属于散列的存放类集,里面的内容是无序存放的,HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证 元素唯一性的方式依赖于: hashCode 与 equals 方法。
默认初始容量为16,加载因子为0.75:即当 元素个数超过容量长度的0.75倍 时,进行扩容。扩容增量:原容量的 1 倍

HashSet集合存储数据的结构(哈希表)

在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一 个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率 较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转 换为红黑树,当每一个桶里面的数少于6个时会从红黑树转化为链表,这样大大减少了查找时间。

(2)TreeSet

与 HashSet 不同的是,TreeSet 本身属于排序的子类,即不可以通过下标来对数组进行操作。但其内容的话则是按照自然顺序来进行排列的。底层是二叉树结构的。如果要比较的话可以通过重写Compare方法来对TreeSet来进行排列。

关于 TreeSet 的排序实现,如果是集合中对象是自定义的或者说其他系统定义的类没有实现 Comparable 接口,则不能实现 TreeSet 的排序,会报类型转换(转向 Comparable 接口)错误。 换句话说要添加到 TreeSet 集合中的对象的类型必须实现了 Comparable 接口。

不过TreeSet 的集合因为借用了 Comparable 接口,同时可以去除重复值,而 HashSet 虽然是 Set 接口子类,但是对于没有复写 Object 的 equals 和 hashCode 方法的对象,加入了 HashSet 集合中也是不能去掉重复值的。

二、Map

Map 接口,里面的所有内容都按(key,value )的形式保存,也称为二元偶对象。

1、常用方法

方法作用
void clear()清空 Map 集合中的内容
boolean containsKey(Objectkey)判断集合中是否存在指定的 key
boolean containsValue(Objectvalue)判断集合中是否存在指定的 value
Set<Map.Entry<K,V>>entrySet()将 Map 接口变为 Set 集合
V get(Objectkey)根据 key 找到其对应的 value
boolean isEmpty()判断是否为空
SetkeySet()将全部的 key 变为 Set 集合
Collectionvalues()将全部的 value 变为 Collection 集合
V remove(Objectkey)根据 key 删除内容

2、HashMap

加载因子为0.75:即当元素个数超过容量长度的0.75倍 时,进行扩容,扩容增量:原容量的 1 倍

//替换内容,并取值
Map<Integer, String> map = new HashMap<Integer, String>(); 
map.put(1, "张三A"); 
map.put(1, "张三B"); // 新的内容替换掉旧的内容 
map.put(2, "李四"); 
map.put(3, "王五"); 
String val = map.get(6); System.out.println(val);

//取出所有的key,并进行遍历
public static void main(String[] args) {
 Map<String, String> map = new HashMap<String, String>(); 
 map.put("ZS", "张三"); 
 map.put("LS", "李四"); 
 map.put("WW", "王五"); 
 map.put("ZL", "赵六"); 
 map.put("SQ", "孙七"); 
 Set<String> set = map.keySet(); // 得到全部的key 
 Iterator<String> iter = set.iterator();
  while (iter.hasNext()) { 
  	String i = iter.next(); // 得到key
  	System.out.println(i + " --:> " +         
  	map.get(i)); 
  } 
}

3、Hashtable

Hashtable 是一个最早的 keyvalue 的操作类,本身是在 JDK1.0的时候推出的。其基本操作与 HashMap 是类似的。 本身都是以 Map 为操作标准的,所以操作的结果形式 都一样。但是Hashtable 中是不能向集合中插入 null 值的。
加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容,扩容增量:2*原数组长度+1
在这里插入图片描述

3、TreeMap

TreeMap 子类是允许 key 进行排序的操作子类,其本身在操作的时候将按照 key 进行排序

Map<String, String> map = new TreeMap<String, String>(); 
map.put("ZS", "张三"); 
map.put("LS", "李四"); 
map.put("WW", "王五"); 
map.put("ZL", "赵六"); 
map.put("SQ", "孙七"); 
Set<String> set = map.keySet(); // 得到全部的key 
Iterator<String> iter = set.iterator(); 
while (iter.hasNext()) { 
	String i = iter.next(); // 得到key 
	System.out.println(i + " --:> " + map.get(i)); 
}


三、Iterator

Iterator 属于迭代输出,基本的操作原理:是不断的判断是否有下一个元素,有的话,则直接输出。
在这里插入图片描述

1、一般的使用方法

Iterator<String> iter = all.iterator(); 
while (iter.hasNext()) {// 判断是否有下一个元素 
	String str = iter.next(); // 取出当前元素 
	System.out.print(str + "、"); 
}
在使用 Iterator 输出的时候有一点必须注意,
在进行迭代输出的时候如果要想删除当前元素,
则只能使用 Iterator 接口中的 remove()方法,
而不能使用集合中的 remove()方法。否则将出现未知的错误。 所以在使用迭代时最好不要对集合进行操作。

2、Map集合的输出

在 Collection 接口中,可以使用 iterator()方法为 Iterator 接口实例化,并进行输出操作,但是在 Map 接口中并没有此 方法的定义,所以 Map 接口本身是不能直接使用 Iterator 进行输出的。

如果此时非要使用 Iterator 进行输出的话,则可以按照如下的步骤进行:
1、 使用 Map 接口中的 entrySet()方法将 Map 接口的全部内容变为 Set 集合
2、 可以使用 Set 接口中定义的 iterator()方法为 Iterator 接口进行实例化
3、 之后使用 Iterator 接口进行迭代输出,每一次的迭代都可以取得一个 Map.Entry的实例
4、 通过 Map.Entry进行 key 和 value 的分离

Set<Map.Entry<String, String>> set = map.entrySet();// 变为Set实例 
Iterator<Map.Entry<String, String>> iter = set.iterator(); 
while (iter.hasNext()) { 
	Map.Entry<String, String> me = iter.next(); 
	System.out.println(me.getKey() + " --> " + me.getValue()); 
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值