- 集合的基本概念
集合类主要负责保存,盛装其他数据
类集合也被称为容器类
Java所有的集合都位于java.util包下
提供统一的架构,集合接口,以及操作算法
- 集合和数组的区别
数组的长度是固定的,而集合的长度是可变的
数组只能储存同种数据类型的数据(包括基本数据类型和对象引用类型)
集合可以储存不同数据类型的对象的引用(但不能储存基本数据类型)
保存一个编译时无法确定具体的数量,动态增长的数据,就应该选择java的集合类进行设计
- 集合的分类
集合主要从Collection和Map两个接口
Iterator:迭代器,是java集合的顶层接口
Collection又分别被List和Set继承
List分为3个子类,ArrayList,LinkList和VectorList
Set分为2个子类,HashSet和TreeSet
Map分为2个子类,HashMap和TreeMap
- Iterator(迭代器)
除了Map集合系列,都能通过迭代器来对集合中的元素进行遍历
Iterator存在于java.util包中
不论Collection的实际类型如何,他都支持一个Iterator()方法
- Iterator常用方法
Iterator it = collection.iterator();//获得一个迭代器
while(it.hasNext()){
Object obj = it.next();//得到一下个元素
}
常用的集合类
- ArrayList
ArrayList是java中的有序链表类,实现了动态数组,即长度可变
他允许所有元素,包括null
每个ArrayList实例的容量可随着不断添加新元素而自动增加
- ArrayList常用方法
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();//创建ArrayList列表
list.add("Tom");//往列表添加数据
list.add("Jack");
list.add("Joe");
list.add(2,"Rose");//往指定位置添加2表示数组的下标位置,下标位置从0开始算
System.out.println("此ArrayList包含的数据:"+list);
int pos=list.indexOf("Rose");//查询下标的位置
System.out.println("Rose的位置是:" + pos);
boolean check = list.isEmpty();//判断列表中是否有值,有值为false,没有值为true
System.out.println("判定此ArrayList是否为空:" + check);
int size = list.size();//查看ArrayList列表的长度
System.out.println("此ArrayList的长度是:" + size);
boolean elememt = list.contains("George");//判断列表中是否包含某个值
System.out.println("判定此ArrayList是否包含George"+elememt);
String item = list.get(0);//获取指定位置的值
System.out.println("0的位置的元素是:"+ item);
//使用普通for循环方式遍历集合
System.out.println("用普通for循环方式遍历集合");
for (int i = 0; i < list.size(); i++) {
System.out.println("索引位置:"+i+"的元素:" + list.get(i));
}
//使用foreach循环方式遍历集合
System.out.println("用普通for循环方式遍历集合");
for (String str : list) {
System.out.println("元素是:"+str);
}
//使用迭代器(Iterator)方式遍历集合
System.out.println("用迭代器(Iterator)循环方式遍历集合");
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
System.out.println("元素是:"+ iterator.next());
}
list.set(1, "May");//替代(1也是下标)
System.out.println("替换后的列表是:"+list);
list.remove(0);//移除第一个元素
list.remove("Rose");//移除列表中“Rose”元素
System.out.println("最终该列表是:"+list);
//把集合列表转换成数组元素
String[] simpleArray =list.toArray(new String[list.size()]);//new String[list.size()设置数组的大小
System.out.println("该集合列表转换成数组元素后:"+Arrays.toString(simpleArray));
}
}
- HashSet
HashSet是一个无序,无重复元素且允许null元素但最多只能有一个null元素的集合
没有索引,凡是需要通过索引来进行操作的方法HashSet都没有
不能使用普通for循环来遍历,只有foreach和迭代器(Iterator)两种遍历方法
HashSet不具备储存顺序性,HashSet遍历出的元素也并非按照插入的顺序
- HashSet常用方法
import java.util.HashSet;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
HashSet<String> setString = new HashSet<String>();//创建HashSet
setString.add("星期一");
setString.add("星期二");
setString.add("星期三");//添加
setString.add("星期四");
setString.add("星期五");
setString.add("星期五");
setString.add(null);
Iterator it = setString.iterator();//使用迭代器遍历输出
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
- HashMap
HashMap是用于储存Key-Value键值对的集合,他允许用一个"key"去储存数据(通过key得到数据)
HashMap是具有Key-Value键值这样“双数据”类型
常把HashMap的取值比喻成查字典的操作
- HashSet常用方法
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class Main {
public static void main(String[] args) {
HashMap<String,String> hMap = new HashMap<String,String>();//创建HashMap
hMap.put("1", "星期一");
hMap.put("2", "星期二");//往里面添加值
hMap.put("3", "星期三");
Collection c1 = hMap.values();//把集合里的值转换成Collection
Iterator it = c1.iterator();//使用迭代器遍历值
while (it.hasNext()) {
System.out.println(it.next());//输出值
}
Set c2 = hMap.keySet();//遍历key值
it = c2.iterator();
while (it.hasNext()) {
System.out.println(it.next());//输出键的值
}
}
}
想获取出HashMap中的值数据,要通过 hMap.values()方法
将hMap中的值全取出转成一个“单数据类型”的普通集合类型,最后对此集合类型进行遍历
- 总结
ArrayList:如果需要大量的随机访问就要使用ArrayList
HashSet:元素无放入顺序,元素不可重复,重复元素会覆盖掉
HashMap:如果要通过键值对访问就是用HashMap,键唯一,值不唯一,key和value都可以为null