(1)可以动态保存任意多个对象,使用比较简单
(2)提供了一系列方便的操作对象的方法:add、remove、set、get等
(3)使用集合添加,删除新元素的示意代码—简洁明了
集合的分类(1)集合主要是两类:单列集合,双列集合
(2)Collection接口有两个重要的子接口,List Set,他们的实现子类都是单列集合
(3)Map接口的实现子类 是双列集合,存放K-V
Collection(1)collection实现子类可以存放多个元素,每个元素可以是Object
(2)有些Collection的实现类,有些事有序的(List),有些是无序的(Set)
(3)Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的
Collection接口遍历元素方式1 --使用Iterator
(1)Iterator对象称为迭代器,主要用于遍历Collection集合中的元素
(2)所有实现了Collection接口的集合类都有一个iterator()方法,用已返回一个实现了一个Iterator接口的对象,即都可以返回一个迭代器
(3)Iterator仅用于遍历集合,本身并不存放数据
public class B {
public static void main(String[] args){
Collection col = new ArrayList();
col.add("三国演义");
col.add("红楼梦");
col.add("水浒传");
Iterator interator = col.iterator();
while (interator.hasNext()){
Object next = interator.next();
System.out.println(next);
}
//当退出循环后,iterator指向最后一个元素,如果想要再次遍历,则需重置迭代器
//iterator = col.iterator
}
}
list接口
(1)List集合类中元素有序且可重复
(2)List集合中的每个元素都有其对话赢的顺序索引,即支持索引
list接口小方法:
public class B {
@SuppressWarnings({"all"})
public static void main(String[] args){
List list = new ArrayList();
for (int i = 0; i < 13;i++){
list.add(i + "真大师");
}
System.out.println(list);
//在第二个位置增加一个元素
list.add(1,"真正的大师");
System.out.println(list);
//获取第四个位置的元素
System.out.println(list.get(3));
//删除第五个元素
System.out.println( list.remove(4));
System.out.println(list.set(7,"你真好看"));
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
}
}
ArrayList的细节和注意事项:
(1)add方法中,可将null加入集合中,其他同理
(2)ArrayList是由数组来实现数据存储的
(3)ArrayList基本等同于Vector,不过ArrayList是线程不安全的
ArrayList vs Vector
ArrayList vs Vector
| 底层结构 | 版本 | 线程安全 | 扩容倍数 | |
|---|---|---|---|---|
| ArrayList | 可变数组 | jdk1.2 | 不安全,效率高 | 如果是无参构造器,第一次分配10,以后每次1.5;如果是有参,则每次扩容1.5 |
| Vector | 可变数组Object | jdk1.0 | 安全,效率不高 | 如果是无参,默认10,以后按2倍扩容;如果是有参,则每次按2倍扩容 |
ArrayList VS linkedList
| 底层结构 | 增删的效率 | 改查的效率 | |
|---|---|---|---|
| ArrayList | 可变数组 | 较低,相当于数组扩容 | 较高 |
| linkedList | 双向链表 | 较高,通过链表追加 | 较低 |
基本介绍
(1)无序(添加和取出的顺序不一致),没有索引
(2)不允许重复元素,最多包含一个null
(3)set接口对象不能使用普通for循环遍历,可用增强for循环,或iteator
HashSet:
(1)可以存放null值,但只能有一个null
(2)不保证元素是有序的
(3)不能有重复的元素
(4)实现了Set接口,满足set的要求
HashSet添加元素的步骤
(1)添加一个元素时,先得到hash值,然后会转成-->索引值
(2)找到存储数据表table,看这个索引位置是否已经存放这个元素
(3)如果没有,直接加入
(4)如果有,调用equals比较,如果相同,就放弃添加,若果不相同则添加到最后
(5)如果一条链表的元素个数到达8时,链表会自动进行树化
HashSet扩容机制
(1)第一次添加时,table数组扩容到16,临界值 = 16 * 加载因子,加载因子为0.75
(2)如果table数组使用到了临界值,就会扩容到16 * 2,临界值为32 * 0.75,以此类推
(3)如果一条链表的元素个数到达8,而且table数组的大小>=64,就会由链表变成红黑树
Map接口和常用方法
map接口实现类的特点:
(1)Map与Collection并列存在,用于保存具有映射关系的数据Key - Value
(2)Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node中
(3)Map中的键值不允许重复
(4)Map中的value可以重复
(5)Map的key可以为null,value也可以为null,注意只允许有一个key为null,value可以有多个null
(6)常用String类作为Map的key
(7)key和value之间存在单一向一对一关系,即通过指定的key总能找到对应的value
小练习:
将员工类中工资大于18000的人的信息输出
public class B {
@SuppressWarnings({"all"})
public static void main(String[] args){
Map map = new HashMap();
map.put("no1",new Employee("小红",20000,1));
map.put("no2",new Employee("小黑",17000,2));
map.put("no3",new Employee("小黄",18001,3));
Set keyset1 = map.entrySet();
Iterator iterator = keyset1.iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry)iterator.next();
Employee em2 = (Employee)entry.getValue();
if(em2.getSalary() > 18000){
System.out.println(em2);
}
}
Set keyset = map.keySet();
for(Object key : keyset){
Employee em = (Employee)map.get(key);
if(em.getSalary() > 18000){
System.out.println(em);
}
}
}
}
class Employee{
private String name;
private double salary;
private int id;
public Employee(String name, double salary, int id) {
this.name = name;
this.salary = salary;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + ''' +
", salary=" + salary +
", id=" + id +
'}';
}
}
Hashtable接口实现类
(1)存放的元素是键值对:即k-v
(2)hashtable的键和值都不能为null,否则会空指针异常
(3)hashTable使用方法基本上和hashMap一样
(4)hashTable是线程安全的
(5)扩容大小为*2+1
实际开发中应该如何选择集合实现类(1)先判断存储的类型(一组对象【单列】或一组键值对【双列】)
(2)一组对象【单列】:Collection接口
允许重复:List
增删多:linkedList【底层维护了一个双向链表】
改查多:ArrayList
不允许重复:Set:
无序:HashSet【底层是HashMap,维护了一个哈希表,即(数组+链表+红黑树)】
插入和取出顺序一致:linkedHashSet,维护数组+双向链表
(3)一组键值对【双列】:Map
键无序:HashMap
键排序:TreeMap
键插入和取出顺序一致:linkedHashMap
读取文件:Properties



