1.什么是集合?
1.1 Java集合的概述:一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储,另一方面,使用Array存储对象方面具有一些弊端,而Java集合就像一种容器,可以动态把多个对象的引用放入容器中
1.2 Java集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组
1.3 存储对象可以考虑:① 数组 ② 集合
1.4 数组存储对象的特点:Student[] stu = new Student[20];
stu[0] = new Student();
>弊端:① 一旦创建,其长度不可变 ② 真实的数组存放的对象的个数是不可知
1.5 Java 集合可分为Collection 和 Map 两种体系
> Collection 接口: ① Set 元素无序、不可重复的集合
② List 元素有序,可重复的集合
> Map 接口:具有映射关系“key-value对”的集合
2.Collection
2.1 Collection 接口下的方法:
> size():返回集合中元素的个数
> add(Object obj):向集合中添加一个元素
> addAll(Collection coll):将形参coll中包含的所有元素添加到当前的集合中
> isEmpty():判断集合是否为空
> clear():清空集合元素
> contains(Object obj):判断集合中是否包含指定的obj元素。如果包含,返回true,反之返回false,判断的依据:根据元素所在的类的equals()方法进行判断,明确:如果存入集合中的元素是自定义类的对象。要求:自定义类要重写equals()方法
> containsAll(Collection coll):判断当前集合中是否包含coll中所有的元素
> retainAll(Collection coll):求当前集合与coll的共有的元素,返回给当前集合
> remove(Object obj):删除集合中的obj元素,若删除成功,返回true,否则返回false
> removeAll(Collection coll):从当前集合中删除包含在coll中的元素
> equals(Object obj):判断集合中的所有元素是否完全相同
> hashCode():返回数组的hash值
> toArray():将集合转化为数组
> iterator():返回一个Iterator接口实现类的对象
@Test
public void test(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(new String("AA"));
coll.add(new Date());
coll.add("BB");
coll.add(new Person("MM",23));
Iterator i = coll.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
}
3.List
3.1 List : 存储有序的,可以重复的元素
3.2 ArrayList:List的主要实现类,内部是数组实现,遍历使用此实现
> add(int index, Object ele):在指定的索引位置index添加元素ele
> addAll(int index,Collection eles):在指定的索引位置index添加元素集合
> get(int index):获取指定索引的元素
> indexOf(Object obj):返回obj在集合中首次出现的位置,没有的话,返回-1
> lastIndexOf(Object obj):返回obj在集合中最后一次出现的位置,没有的话,返回-1
> remove(int index):删除指定索引位置的元素
> set(int index,Object ele):设置指定索引位置的元素为ele
> subList(int fromIndex,int toIndex):返回从fromIndex到toIndex结束的一个子list
3.3 LinkedList:对于频繁的插入、删除操作,建议选择此实现类
3.4 Vector:线程安全的,不建议使用
4.Set
4.1 Set:存储无序的,不可重复的元素,Set中常用的方法都是Collection下定义的
> 无序性:无序性 != 随机性,真正的无序性,指的是元素在底层存储的位置是无序的
> 不可重复性:当向Set 中添加进相同的元素的时候,后面这个不能添加进去
> 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法,进而保证Set中的元素的不可重复性
> Set中的元素是如何存储的呢?使用了哈希算法:当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在Set中的存储位置,若此位置之前没有对象存储,则这个对象直接存储到此位置,若此位置已有对象存储,再通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能在添加进来,万一返回false呢。要求:hashCode()方法要与equals()方法一致
4.2 HashSet:Set的主要实现类
4.3 LinkedHashSet:使用链表维护了一个添加进集合中的顺序,导致我们遍历LinkedHashSet集合元素时,是按照添加进去的顺序遍历的,是HashSet的子类,它是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的,插入的性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能,它不允许集合元素重复
4.4 TreeSet:向它添加的元素必须是同一个类,可以按照添加进集合的元素的指定的顺序遍历,像String,包装类等默认按照从小到大的顺序遍历,当向TreeSet中添加自定义类的对象时,有两种排序方法 ① 自然排序 ② 定制排序,自然排序要求自定义类实现java.lang.Comparable 接口并重写其compareTo(Object obj)在此方法中,指明按照自定义类的哪个属性进行排序,向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此属性相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。
PS:compareTo()与hashCode()、equals()保持一致,定制排序:实现 Comparator 接口
public void test{
Comparator com = new Comparator(){
public int compare(Object o1,Object o2){
if(o1 instanceof Customer && o2 instanceof Customer){
Customer c1 = (Customer) o1;
Customer c2 = (Customer) o2;
int i = c1.getId().compareTo(c2.getId());
if(i == 0){
return c1.getName().compareTo(c2.getName());
}
return i;
}
return 0;
}
}
TreeSet set = new TreeSet(com);
set.add(new Customer("AA",1003));
set.add(new Customer("BB",1002));
set.add(new Customer("GG",1004));
set.add(new Customer("CC",1001));
set.add(new Customer("DD",1001));
for(Object str:set){
System.out.println(str);
}
}
5.Map
5.1 Map与Collection并列存在,用于保存具有映射关系的key-value,Map中的key和value都可以是任何引用类型的数据,Map中的key用set来存放,不允许重复,即同一个Map对象所对应的类,须重写hashCode()和equals()方法,常用String类作为Map的“键”,key 和 value 之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的value
5.2 Map接口下的主要方法:
> put(Object key,Object value):向Map中添加一个元素
> remove(Object key):
> putAll(Map t):
> clear():清空map
> get(Object key):获取指定的key的value值,若无此key,则返回null
> containsKey(Object key):
> containsValue(Object value):
> size():返回集合的长度
> equals():
5.3 HashMap 解析:key是用Set来存放的,不可重复。value是用Collection来存放的,可重复一个key-value对,是一个Entry。所有的Entry是用Set存放的,也是不可重复的,向HashMap中添加元素时,会调用key所在类的equals()方法,判断两个key是否相同,若相同则只能添加进后添加的那个元素
5.4 如何遍历Map:
> Set keySet():返回map集合的key集合
> Collection values():返回map集合的value集合
> Set entrySet():返回map集合的entry对
5.5 LinkedHashMap:使用链表维护添加进Map中的顺序,故遍历Map时,是按添加的顺序遍历的
5.6 TreeMap:按照添加进map中的元素的key的指定属性进行排序。要求:key必须是同一个类的对象,针对key:自然排序,定制排序
5.7 Hashtable:Hashtable是个古老的Map实现类,线程安全,与HashMap不同,Hashtable不允许使用null作为key和value,与HashMap一样,Hashtable也不能保证其中key-value对的顺序,Hashtable判断两个key相等、两个value相等的标准与HashMap一致。
5.8 操作集合的工具类Collections:Collections是一个操作Set、List和Map等集合的工具类,Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法
> 排序操作:
> reverse(List):反转List中元素的顺序
> shuffle(List):对List集合元素进行随机排序
> sort(List):根据元素的自然排序对指定List集合按升序排序
> sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序
> swap(List,int,int):将指定list集合中的i处元素和j处元素进行交换
> 查找、替换
> max(Collection c):根据元素的自然排序,返回给定集合中的最大元素
> max(Collection c,Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素
> min(Collection c):根据元素的自然排序,返回给定集合中的最小元素
> min(Collection c,Comparator):根据Comparator指定的顺序,返回给定集合中的最小元素
> frequency(Collection c,Object o):返回指定集合中指定元素出现的次数
> copy(List dest,List src):将src中的内容复制到dest中
> replaceAll(List list,Object oldVal,Object newVal):使用新值替换List对象的所有旧值