Java集合框架
Java 集合概述
前面存储对象,数组,弊端
Java 集合就像一种容器,可以把多个对象的引用放入容器中。
Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组
Java 集合可分为 Set、List 和 Map 三种体系
Set:无序、不可重复的集合,set又是以map为底层实现
List:有序,可重复的集合,list接口是以数组为底层实现,是有序的
Map:具有映射关系的集合,key-value(键值对),map接口底层是hash函数,无续(不是随机)
在 Java5 之前,Java 集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object 类型处理;从 Java5 增加了泛型以后,Java 集合可以记住容器中对象的数据类型
Collection 接口
Collection 接口是 List、Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 集合:
使用 Iterator 接口遍历集合元素
Iterator 接口主要用于遍历 Collection 集合中的元素,Iterator 对象也被称为迭代器。
Iterator 接口隐藏了各种 Collection 实现类的底层细节,向应用程序提供了遍历 Collection 集合元素的统一编程接口。
Iterator 仅用于遍历集合,Iterator 本身并不提供存放对象的能力。如果需要创建 Iterator 对象,则必须有一个被迭代的集合。
使用 foreach 循环遍历集合元素
从Java 5 开始,JDK提供了 foreach 循环迭代访问 Collection
List
List 代表一个元素有序、且可重复的集合,集合中的每个元素都有其对应的顺序索引
List 允许使用重复元素,可以通过索引来访问指定位置的集合元素。
List 默认按元素的添加顺序设置元素的索引。
List 集合里添加了一些根据索引来操作集合元素的方法
void add(int index, Object ele)
boolean addAll(int index, Collection eles)
Object get(int index)
int indexOf(Object obj)
int lastIndexOf(Object obj)
Object remove(int index)
Object set(int index, Object ele)
List subList(int fromIndex, int toIndex),toIndex取不到
List实现类之一:ArrayList
ArrayList 是 List 接口的典型实现类
本质上,ArrayList是对象引用的一个变长数组
List实现类之一:LinkedList
LinkedList类采用链表存储方式。插入、删除元素时效率比较高,如下图
ArrayList和LinkedList分别在何时使用
ArrayList常用方法
Set 集合
Set接口存储一组唯一,无序的对象。
HashSet 是Set接口常用的实现类。
HashSet允许集合元素值为null
操作数据的方法与List类似,Set接口不存在get()方法。
Iterator接口表示对集合进行迭代的迭代器,专门实现集合的遍历。
方法:
hasNext():判断是否存在另一个可访问的元素
next():返回要访问的下一个元素
案例解析
// 通过迭代器依次输出集合中所有元素的信息
System.out.println("使用Iterator遍历,员工姓名分别是:");
Iterator it = set.iterator();
while (it.hasNext()) {
Employee emp = (Employee) it.next();
String name = emp.getName();
System.out.println(name);
}
**Set实现类之一:HashSet**
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet 具有以下特点:
不能保证元素的排列顺序
HashSet 不是线程安全的
集合元素可以是 null
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。
HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
Map
Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value
Map 中的 key 和 value 都可以是任何引用类型的数据
Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法。
常用String类作为Map的“键”。
key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value。
Map接口
Map 常用方法
添加、删除操作:
Object put(Object key,Object value)
Object remove(Object key)
void putAll(Map t)
void clear()
元视图操作的方法:
Set keySet()
Collection values()
Set entrySet()
元素查询的操作:
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
boolean equals(Object obj)
Map实现类之一:HashMap
Map接口的常用实现类:HashMap、TreeMap和Properties。
HashMap是 Map 接口使用频率最高的实现类。
允许使用null键和null值,与HashSet一样,不保证映射的顺序。
HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等。
HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true。
Map实现类之二:Hashtable
Hashtable是个古老的 Map 实现类,线程安全。
与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value
与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序
Hashtable判断两个key相等、两个value相等的标准,与hashMap一致。
Map实现类之三:Properties
Properties 类是 Hashtable 的子类,该对象用于处理属性文件
由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key 和 value 都是字符串类型
存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法
Properties pros = new Properties();
pros.load(new FileInputStream("jdbc.properties"));
String user = pros.getProperty("user");
System.out.println(user);
课上案例
1.TestCollection
package com.hpe.java;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import org.junit.Test;
/**
* 1.存储多个对象:数组、集合
* 2.数组存对象的特点:Student[] stu=new Student[10];
* 弊端:一旦创建,长度不可变
*
* 3.集合分为两大体系:collection、map
* collection接口
* ---List接口
* --有序的,可以重复
* ArrayList(主要实现类):查询速度快
* LinkedList:增删改速度快
*
*
* ---Set接口
* --无序的,不可重复
* hashSet
*
*
*/
public class TestCollection {
@Test
public void test(){
//定义了一个集合
Collection coll=new ArrayList();
//size():获取集合长度 常用
System.out.println(coll.size());
//add(object o):添加元素 常用
coll.add(123);
coll.add("哼哈");
coll.add(123.09);
coll.add(new Date());
System.out.println(coll.size());
//addAll(collection c):讲集合c中元素添加到本集合中
Collection c=Arrays.asList(1,6,9,78);
coll.addAll(c);
System.out.println(coll.size());
//isEmpty():判断当前集合是否为空 常用 为空为true,不为空为false
System.out.println(coll.isEmpty());
//clear():清空集合中的元素 常用
// coll.clear();
// System.out.println(coll.size());
//contains(object o):判断当前集合中是否包含元素o
System.out.println(coll.contains(123));
//remove(object o):删除当前集合中的元素o 常用
System.err.println(coll.remove(123));
//toArrary():把集合转成数组 常用
Object[] o=coll.toArray();
for(Object o1:o){
System.out.println(o1);
}
}
@Test
public void test1(){
//定义了一个集合
Collection coll=new ArrayList();
coll.add(123);
coll.add("哼哈");
coll.add(123.09);
coll.add(new Date());
//第一种方式
for(Object o:coll){
System.out.println(o);
}
System.out.println("======================");
//第二种方式:
//iterator():迭代器:返回的是一个Iterator接口
Iterator i=coll.iterator();
while(i.hasNext()){//判断当前集合中是否有下一个元素,如果有返回true
System.out.println(i.next());//指向下一个元素
}
}
}
2.TestList
package com.hpe.java;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.junit.Test;
public class TestList {
//arrayList是list的主要实现类
// void add(Object o):添加元素
// void add(int index, Object ele):根据指定索引值把元素添加到该位置
// boolean addAll(int index, Collection eles):
// Object get(int index):根据索引值查询元素值
// int indexOf(Object obj):返回当前集合中元素obj首次出现的位置,如果没有返回-1
// int lastIndexOf(Object obj):返回当前集合中元素obj最后一次出现的位置,如果没有返回-1
// Object remove(int index):根据索引值删除指定元素
// Object set(int index, Object ele):设置指定索引位置的元素值为ele
//;list常用的方法:
//增 删 修改 查询 size()
@Test
public void test(){
List list=new ArrayList();
//添加元素
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add(123);
System.out.println(list);
//查询
System.out.println(list.get(1));
//删除
System.out.println(list.remove(1));
System.out.println(list.get(1));
//修改
list.set(0, 345);
System.out.println(list.get(0));
}
@Test
public void test1(){
List list=new ArrayList();
//添加元素
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add(123);
//for循环
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
System.out.println("=====================================");
//foreach
for(Object o:list){
System.out.println(o);
}
System.out.println("=====================================");
//迭代器
Iterator i=list.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
}
}