一.Java类集合基本认识
在编程中经常需要集中存放多个数据,从我们的认识里,数组是一个很好的选择,前提是我们需要事先知道我们需要操作数据的数量。数组需要初始化长度,而且一旦指定数组长度,后面不可以改变。如果我们需要在编程中保存或者操作一组动态增长的数据,便可以使用Java集合类
集合类主要负责动态保存,储存数据,因此集合也可以成为数据的容器。集合类主要位于java.util包下,我们可以从数学的角度来理解集合
二.集合体系
如上图:接口:是代表集合的抽象数据类型,Collection、List、Set、Map 。
实现(类):是集合接口的具体实现,如ArrayList、LinkedList、HashSet、HashMap
算法:是实现集合接口的对象里的方法执行的一些常规的计算,例如:搜索和排序
集合框架定义了一些接口,如下:
接口 | 接口描述 |
---|---|
Collection | Collection 是最基本的集合接口,Collection 接口存储一组不唯一,无序的对象。 |
List | List接口是一个有序的 Collection,存储一组不唯一,有序(插入顺序)的对象 |
Set | Set 具有与 Collection 完全一样的接口,不保存重复的元素。存储一组唯一,无序的对象 |
Map | Map 接口存储一组键值对象,提供key(键)到value(值)的映射。 |
Set | Set 具有与 Collection 完全一样的接口,不保存重复的元素。存储一组唯一,无序的对象 |
Set和List的区别:
1.Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
2.Set检索效率低,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
3.List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,会引起其他元素位置改变 ,ArrayList,LinkedList,Vector
三.集合的遍历
我们会将数组里的数遍历出来,集合也可以,数组一般采用for循环或者增强for,这两个方法也可以用在集合中,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator 接口或ListIterator接口
1.遍历 ArrayList
public class JiheTest1 {
public static void main(String[] args) {
List<String> list= new ArrayList<String>();
list.add("zhang");
list.add("jia");
list.add("xiao");
list.add("ge");
//第一种方法使用foreach遍历List
for (String str:list) {
System.out.println(str);
}
第二种,把集合变为数组相关的内容遍历
String[] atrArry = new String[list.size()];
list.toArray(atrArry);
for (int i = 0; i < atrArry.length; i++) {
System.out.println(atrArry[i]);
}
第三种遍历方式,使用迭代器遍历
Iterator<String> ite = list.iterator();
while (ite.hasNext()) { //来判断下一个元素有值
System.out.println(ite.next());
}
}
}
分析:三种方法都是用来遍历ArrayList集合,第三种方法是采用迭代器的方法,该方法可以不用担心在遍历的过程中会超出集合的长度,比较方便些
2.遍历 LinkedList
public class LinkedList {
public static void main(String[] args) {
//LinkedList经常用在增删操作较多
List<String> list = new java.util.LinkedList<String>();
list.add("zhang");
list.add("jia");
list.add("xiao");
list.add("ge");
list.add("zhang");
//Iterator 遍历输出
/*Iterator迭代器,有三种方法
*next():获得序列的下一个元素
*hasNext():序列中是否还有元素
*remove():将迭代器新返回的元素删除*/
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String string = (String) it.next();
System.out.println(string);
}
}
}
java提供的List就是一个"线性表接口",ArrayList(基于数组的线性表)、LinkedList(基于链的线性表)是线性表的两种典型实现
3.遍历 HashSet,可以和上面的LinkedList进行对比
public class HashSetTest {
public static void main(String[] args) {
Collection<String> list = new HashSet<String>();//打印结果zhang,jia,zhang 但是Set集合不允许重复
list.add("zhang");
list.add("jia");
list.add("zhang");
/*Iterator迭代器,有三种方法
*next():获得序列的下一个元素
*hasNext():序列中是否还有元素
*remove():将迭代器新返回的元素删除*/
Iterator<String> Ite = list.iterator();
while (Ite.hasNext()) {
String string = (String) Ite.next();
System.out.println(string);
}
}
}
遍历 Map
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("1","zhang");
map.put("2", "jiao");
map.put("3", "xiao");
map.put("4", "ge");
//第一种遍历,普遍使用,二次取值
System.out.println("通过Map.keySet遍历key和value");
for (String key: map.keySet()) {
System.out.println("key="+key+"and value="+map.get(key));
}
//第二种
System.out.println("通过Map.entrySet使用iterator遍历key和value");
Iterator<Map.Entry<String, String>> it =map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第三种:推荐,尤其是容量大时
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第四种
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
}
Map 和 Set 集合的关系
都有几个类型的集合。HashMap 和 HashSet ,都采哈希表算法;TreeMap 和 TreeSet 都采用 红-黑树算法;LinkedHashMap 和 LinkedHashSet 都采用 哈希表算法和红-黑树法
还有:ArrayList和LinkedList区别:
1.ArrayList 是 List 接口的一种实现,它是使用数组来实现的。
2.LinkedList 是 List 接口的一种实现,它是使用链表来实现的。
3.ArrayList 遍历和查找元素比较快。LinkedList 遍历和查找元素比较慢。
4.ArrayList 添加、删除元素比较慢。LinkedList 添加、删除元素比较快。