集合类的由来:
对象用于的封装成特有数据,对象多了需要存储,如果对象的个数不确定
就用集合容器进行存储(对象的地址)
集合特点:
1:用于存储对象的容器
2:集合的长度是可变的
3:集合中不可以存储基本类型值
集合容器因为内部的数据结构不同,有多种容器。
不断的向上抽取,就形成了集合框架
框架的顶层Collection接口
Collection的常见方法:
1. 添加
boolean add(Object obj);
boolean addAll(Collection coll);//添加一堆
2. 删除
boolean remove(Object obj);
boolean removeAll(Collection coll);//删除一堆
void clear();//全部删除 集合还在
3 .判断
boolean contains(Object obj);//是否包含
boolean containsAll(Collection coll);
boolean ifEmpty();//是否有元素
4.获取
int size();//获取长度
iterator iterator();//取出元素的方式,迭代器。
该对象必须依赖具体的容器,因为每一个容器的数据结构都不同
所以该迭代器是在容器中进行内部实现的(内部类)
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可
也就是iterator方法
5.其他
boolean retainAll(Collection coll);//取交集
Object toArray();将集合转成数组
-----------------------------------
Collection
|--List: 有序(存入和去除的顺序一致) 元素都有索引(角标),元素可以重复
|--Set: 元素不能重复 无序。LinkedHashSet 有序
Set接口中的方法和Collection一致
|--HashSe:内部数据结构是哈希表,是不同步的。
如何保证该集合元素的唯一性呢?
是通过对象的hashCode和equals方法来完成对象唯一性的
如果对象的hashCode值不同,那么不用判断equals方法 就直接储存到哈希表中
如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true
如果为true视为相同元素,不存。如果为false 那么视为不同元素,就进行储存
记住:如果元素哟啊储存的HashSe集合中 不许覆盖hashCode方法和equals方法
一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都要覆盖equals方法
建立对象判断是否相同的依据
|--TreeSet:可以对Set集合中的元素今进行排序,是不同步的、
判断元素唯一性的方式:就是根据比较方法的返回结果是否为0,是0,就是相同元素,不存
TreeSet对元素进进行排序的方式之一
就是让元素自身具备比较功能,元素需要实现Comparable接口 覆盖compareTo方法
如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序(着对象不是你写的) 怎么办?
可以使用TreeSet集合的 排序方式之二
让集合自身具备比较功能 定义一个类实现Comparator接口 覆盖compare方法
将该类对象作为参数传递给TreeSet集合的构造函数
List 特有的常见方法:有一个共性特点就是都可以操纵角标
1 添加
void add(index,element);
void add(index,collection);
2 删除
Object remove(index);
3 修改
Object set(index,element);
4 获取
Object get(idnex);
int indexOf(object);
int lastIndexOf(object);
List sublist(from ,to);
List集合是可以完成对元素的增删改差
List:
|---Vector:内部是数组数据结构。是同步的(线程安全的) 可变长(100%) 增删 查询都很慢
|---ArrayList:内部是数组数据结构、是不同步的 替代Vector。多线程加锁 基本不用 可变长(50%) 查询的速度快
|---LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。
---------------------------------------------------
集合技巧
需要唯一吗?
需要:Set
需要指定顺序吗?
需要:TreeSet
不需要:HashSet
但是想要一个和储存一致的顺序(有序):LinkedHashSet
不需要:List
需要频繁增删吗?
需要:LinkedList
不需要:ArrayList
如何记录每一容器的结构和所属体系?
看名字
List
|--ArrayList
|--LinkedList
Set
|--HashSet
|--TreeSet
后缀名就是改集合所属的体系
前缀名就是该集合的数据结构
看到array 就要想到数组 想到查询快 有角标
看到link 就要想到 链表 就要想到 增删快 就要想到 add get remove +frist last 的方法‘
看到hash 就要想到哈希表 就要想到唯一新 就要想到元素需要覆盖hashCode 方法和euqals方法
看到tree 就要想到二叉树 就要想到排序 就要想到两个接口 Comparable ,comparator
而且通常这些 常用的集合容器都是不同步的
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
List list=new ArrayList();
show(list);
}
private static void show(List list) {
// TODO Auto-generated method stub
list.add("abc1");
list.add("abc2");
list.add("abc3");
System.out.println(list);
//插入元素
//list.add(1,"abc9");
//删除元素
//System.out.println("remove:"+list.remove(2));
//修改元素
//System.out.println("set:"+list.set(1, "abc8"));
//获取元素
//System.out.println("get:"+list.get(0));
//获取子列表
System.out.println("sublist:"+list.subList(0, 2));
System.out.println(list);
}
}
import java.util.ArrayList;
import java.util.Collection;
import com.sun.org.apache.xml.internal.security.c14n.helper.C14nHelper;
public class CollectionDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection coll =new ArrayList();
Collection c1 =new ArrayList();
Collection c2 =new ArrayList();
show(coll);
show(c1,c2);
}
public static void show(Collection c1,Collection c2) {
//给c1添加元素
c1.add("abc1");
c1.add("abc2");
c1.add("abc3");
c1.add("abc4");
//给c2添加元素
c2.add("abc2");
c2.add("abc6");
c2.add("abc7");
System.out.println("c1"+c1);
System.out.println("c2"+c2);
//演示addAll
//c1.addAll(c2);
//演示removeAll
//boolean b=c1.removeAll(c2);//将两个集合中的相同元素从调用removeAll的集合中删除
//System.out.println("remove:"+b);
//演示containsAll
//bolean b=c1.containsAll(c2);
//System.out.println("containsALL:"+b);
//演示retainAll
boolean b=c1.retainAll(c2);//取交集 保留和指定的集合相同的元素,而删除不同的元素
//和removeAll功能相反
System.out.println("retainALL:"+b);
System.out.println("c1"+c1);
}
public static void show(Collection coll) {
//1 添加元素 add
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
//2 删除元素 remove
coll.remove("abc3");//会改变集合的长度
// 清空集合
//coll.clear();
System.out.println(coll.contains("abc2"));
System.out.println(coll);
//
}
}