最近学习了java集合框架,感觉写代码要用的知识点比较冗杂。对各个接口实现的方法也不太熟悉,写代码不知从何下手。既然知识的细节和运用不是一时半会儿能够掌握,我们就要让迷糊的大脑清醒清醒。而梳理整个知识点的框架能够让我们找到流畅地写代码的丝丝感觉。我们先了解什么是java集合框架。
JAVA集合框架综述:
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。JAVA也如此。
集合是Java语言中非常重要的API,用来存储多个数据,实现了不同的数据结构。
Java的集合框架是由很多接口、抽象类、具体类组成的,都位于java.util包中。集合中只能保存对象(保存对象的引用变量)。(数组既可以保存基本类型的数据也可以保存对象)。
当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进行处理。从JDK1.5以后,这种状态得到了改进:可以使用泛型来限制集合里元素的类型,并让集合记住所有集合元素的类型(参见具体泛型的内容)。
Java集合框架有三大接口,分别是Collection、Map、Iterator。这些接口又包含了一些接口或实现类。
Set和List接口是Collection接口派生的两个子接口,Queue是Java提供的队列实现,类似于List。
Map实现类用于保存具有映射关系的数据(key-value)。
Iterator主要用于遍历(即迭代访问)Collection集合中的元素,也称为迭代器。
Set、List和Map可以看做三大重要集合。
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
对于Set、List和Map三种集合,最常用的实现类分别是HashSet、ArrayList和HashMap三个实现类。
一、Collection接口
Collection意即集合,是所有集合类的根接口,同时Collection接口是一个泛型接口。
Collection接口是List、Set和Queue接口的父接口,同时可以操作这三个接口。
List接口:有序的集合,元素有序存入。
Set接口: 无重复的集合,即存入的元素不重复。
Queue接口:队列,jdk1.5版本新增接口,Queue实现了“先进先出”(FIFO)的存储结构。Queue是Collection的子接口,具有所有集合基本操作,除此之外,Queue还提供了一些新的插入、提取、查询等方法。
(1)List接口
继承了Collection接口,并且扩展出属于自己的方法。
List集合中的元素都是与索引有关系的,因此List 集合扩展的方法都是与索引有关系的。
例如: add(int index,E)……添加元素在所对应的索引位置 。
List 是个接口,有三个实现的类:
1、ArrayList类(数组列表,数据采用数组方式存储。)
2、LinkedList类(链表)
3、Vector类(jdk1.0中的集合,实现了同步)
Collection c = new ArrayList();
//添加元素
c.add("");
//虽然集合里不能放基本类型的值,但Java支持自动装箱
c.add(6);
//删除指定元素
c.remove(6);
//判断是否包含指定字符串
c.contains("");
。。。。等等方法
(2)Set接口
Set接口继承了Collection接口。Set中所存储的元素是不重复的,但是是无序的。也就是说,Set中的元素是没有索引的。
Set接口有两个实现类:
1、HashSet类(底层是哈希码值,基于HashMap实现的。)
Set userSet1=new TreeSet();
2、TreeSet类 (元素不重复,并且元素实现了排序。)
实例化:Set userSet1=new TreeSet();
(3)Queue接口
队列:一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
Queue接口有一个LinkedList类(链表)。
实例化:Queue q = new LinkedList<>();
优点:它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常
常用方法:offer()来加入元素;poll()来获取并移出元素;element()获取但是不移除此队列的头;peek()获取但不移除此队列的头;如果此队列为空,则返回 null。
二、Map接口
Map中保存的是键值对Map<key,value
>,Key值不允许重复。
实例化:Map<String,Country
> ku = new HashMap<>();
常用方法:
put(K key,V value)
该方法可以将key 和value存到Map对象
get(Object key)
该方法可以根据key值返回对应的value。
size()
返回Map对象中键值对的数量。
Map接口有两个实现类:
1、HashMap类
较常用的Map集合类,key值的hashCode和equals保证元素唯一性。HashMap通过hashcode对其内容进行快速查找, HashMap中元素的排列顺序是不固定的。
HashMap的常用方法:
put<key,value
> 存放对象
get(key) 获取key所对应的数据。
keySet() 返回此映射中所包含的键的 set 视图。
2、TreeMap类
不仅可以保证key不重复,还可以对value数据进行排序。TreeMap中所有的元素都保持着某种固定的顺序,如果需要得到一个有序的Map就应该使用TreeMap.
三、Iterator接口
Iterator接口提供了迭代集合对象的功能,是一个泛型接口.
常用方法:
hasNext();此方法用来判断被迭代的集合中是否存在元素。
next();返回集合中的当前元素.
迭代器访问Collection集合
Collection对象都有返回Iterator的方法,因此都可以用迭代器来进行遍历。
—List集合
public static void main(String[] args) {
//创建用户对象
User user1=new User("张三");
User user2=new User("李四");
//创建集合对象,存放用户对象
List<User> userList=new ArrayList<User>();
//List<User> userList=new LinkedList<User>();
userList.add(user1);
userList.add(user2);
Iterator<User> userIter=userList.iterator();
while(userIter.hasNext()){
User userInfo=userIter.next();
}
}
Set集合(TreeSet中存储的对象必须实现Comparable接口)
public static void main(String[] args) {
User user1=new User("qw");
User user2=new User("er");
User user3=new User("rw");
Set<User> userSet1=new HashSet<User>();
//Set<User> userSet1=new TreeSet<User>();
userSet1.add(user3);
userSet1.add(user1);
userSet1.add(user2);
Iterator<User> it= userSet1.iterator();
while(it.hasNext()){
System.out.println(it.next().getUserName());
}
}
Map集合
Map集合是以键值对存放的,Map接口中提供了将key与value分别转变成Collection对象的方法,然后就可以使用Iterator分别遍历Map的key以及value。
public static void main(String[] args) {
UserInfo user1=new UserInfo();
user1.setName("王华");
user1.setAge(12);
UserInfo user2=new UserInfo();
user2.setName("小华");
user2.setAge(8);
UserInfo user3=new UserInfo();
user3.setName("张华");
user3.setAge(12);
Set<UserInfo> userSet=new TreeSet<UserInfo>();
//Set<UserInfo> userSet=new HashSet<UserInfo>();
userSet.add(user);
userSet.add(user1);
userSet.add(user2);
Iterator<UserInfo> it=userSet1.iterator();
while(it.hasNext()){
UserInfo info=it.next();
System.out.println(info.getName()+info.getAge());
}
}
TreeMap中想要存放有序的对象,Key类需要继承Comparable类