------- android培训、java培训、期待与您交流! ----------
第一部分、集合概述
1、概述:
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一 种方式。
2、集合与数组的区别:
数组:数组的长度是固定的,虽然也可以储存对象,但是每个集合中只能存储相同类型的对象。
集合:集合的长度是可变的,集合中只能存储对象。集合中可以存储不同类型的对象。
3、集合框架的构成及分类
Collection接口中常用的方法:
add(),用于向集合中添加元素,返回boolean。 contains(Object o),用于判断该集合中是否包含o对象。
clear(),用去清除集合中所有的元素。 equals(Object o) ,用于比较两个对象是否相等。
isEmpty(),判断集合是否包含有元素,返回Boolean Iterator(),获取集合的迭代器
remove(Object o),移除集合中指定元素 toArray(),返回包含该集合中所有元素的数组。
size(),获取集合的元素个数。
Map接口中常用的方法:
clear(),用去清除集合中所有的元素。 containsKey(Object o)、containsValue(Object o),判断该集合是否包含键或值
entrySet(),获取包含Map.Entry对象的set集合 keySet(),获取包含键的Set集合
Values(),回去包含该Map集合所有值的集合。 put(key k,value v),向map集合中添加元素。
get(Object key)获取该键对应的值
4、Collection中的迭代器Iterator
通过Iterator可以对Collcetion集合中元素进行迭代取出如下:
Iterator it=Colletion.iterator();
while(it.hasNext()){
it.next();
}
在Iterator迭代器中,只能对集合中的元素进行取出hasNext()和移除remove()的操作。itNext()的返回值是Object,要记得类型转换。
第二部分、List集合
1、概述
Ⅰ、List集合是有序集合,即有索引有下标,List集合中的元素可以重复。
Ⅱ、List集合中特有的方法:
get(int index)通过下标获取指定位置的元素 indexOf(Object o)返回该元素第一次在集合中出现位子的下标,没有返回-1
lastIndexof(Object o)返回该元素最后一次出现的位子的索引 listIterator()返回列表迭代器。
set(int index,E element)替换指定位置的元素 subList(int fromIndex,int toIndex)返回指定范围的子集,含头不含尾
Ⅲ、ListIterator是List集合中特有的方法,是Iterator的子接口。Iterator只有取出和删除两个操作元素的方法,在迭代的时候不可以对集合进行添加和修改的操作,因为会发生ConcurrentModificationException异常。而通过ListIterator可以在迭代的时候实现对集合进行增删改查的操作。
Ⅳ、ArrayList和LinkedList中的contains和remove方法中都调用的是equals方法,如果是对象的比较必须要重写Object中的equals方法。
2、ArrayList
ArrayList底层的数据结构是数组结构,特点是数据的查询速度很快,但是增删操作稍慢,线程不同步。
3、LinkedList
Ⅰ、LinkedList底层使用的是链表的数据结构,特点是增删很快,但是查询速度稍慢。
Ⅱ、LinkedList特有的方法:
3、Vector
Ⅰ、Vector底层是数据结构,线程同步。
Ⅱ、Vector的是采用枚举的形式取出集合中的数据:
class VectorDemo{
public static void main(String[] args){
Vector v = new Vector();
v.add("java01");
v.add("java02");
Enumeration en = v.elements();
while(en.hasMoreElements()){
System.out.println(en.nextElement());
}
}
}
第二部分、Set集合
1、概述
set集合是无序的,即存入和取出的顺序不一定一致,元素不可以重复
2、HashSet
A、底层数据结构是哈希表,线程时非同步的。
B、 HashSet是通过调用元素的hashCode和equals两个方法来保证存入数据的唯一性的。首相集合会通过每个元素的hashCode值来判断两个元素是否相等,如果相等,会继续调用equals方法来判断两个元素是否相同。
C、对于HashSet来说,一般需要复写HashCode方法和equals方法减少hash值的重复。
3、TreeSet
A、TreeSet可以对存入其中的元素进行自动的默认排序,底层是二叉树。
B、TreeSet是通过compareTo方法对存入其中元素进行判断排序,和判断是否相等,从而保证存入其中元素的唯一性和有序性。
C、TreeSet实现排序的两种方式。
第一种方式:
让元素自身具备比较性,让存入TreeSet集合中的元素实现Comparable接口,并复习compareTo方法,这种方式也叫元素的自然排序或者叫做默认排序,如下:
class Student implements Comparable{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
public int compareTo(Object obj){//复习compareTo方法
Student s=(Student)obj;
if(this.age>s.age)//按照年龄排序
return 1;
if(this.age==s.age)//若年龄相同则按照姓名排序
return this.name.compareTo(s.name);
return -1;
}
}
第二种方式:
让容器(即集合)本身具备比较性。当元素本身不具备比较性,或者具备的比较性不是所需要的时候,可以通过让容器自身具备比较性。即定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。当两种排序都存在时,以比较器为主。定义比较器,即定义一个类,让它实现Comparator接口,覆盖compare方法。如下:
TreeSet ts=new TreeSet(new Comp());
class Comp implements Comparator{
public int compare(Object o1,Object o2){
Student s1=(Student)o1;
Student s2=(Student)o2;
int num=s1.getName().compareTo(s2.getName());
if(num==0)//如果姓名相等对年龄进行判断
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
return num;
}
}
第三部分、Map集合
1、概述
A、Map集合是向集合中存储键值对,一对一对的向集合中存储,而且要保证键值的唯一性。
B、与Collection的区别:
对于元素的存储,Map集合使用的是put(Key k,Value v)方法,而Collection使用的是add()方法。
Map集合没有直接取出元素的方法,需要将其转成Set集合,然后通过迭代取出元素。
C、Hashtable:底层是哈希表数据结构,线程同步,线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。
D、HashMap:底层是哈希表数据结构,线程不同步,不安全,速度快,允许存放null 键,null值。
E、TreeMap:底层是二叉树数据结构,对键进行排序,排序原理与TreeSet 相同。
2、Map集合中元素的取出
A、通过Map.keySet(),返回一个包含Map集合键值的Set<K>,因为Set集合具备迭代性,迭代出所有的键值,然后再使用get(Key k)方法取出每个键值对应的值。
import java.util.*;
public class Test{
public static void main(String args[]){
Map<String,String> map=new HashMap<String,String>();
map.put("1","zhangsan");
map.put("2","lisi");
Set<String> s=map.keySet();
Iterator<String> it=s.iterator();
while(it.hasNext()){
String key=(String)it.next();
System.out.println(key+":"+map.get(key));
}
}
}
B、通过Map.entrySet(),返回一个包含map集合映射关系的Map.Entry存入到set集合中,通过迭代取出Map.Entry(),再通过Map.Entry()的getKey()和getValue()取出Map集合的值。
import java.util.*;
public class Test{
public static void main(String args[]){
Map<String,String> map=new HashMap<String,String>();
map.put("1","zhangsan");
map.put("2","lisi");
Set<Map.Entry<String,String>> s=map.entrySet();
Iterator<Map.Entry<String,String>> it=s.iterator();
while(it.hasNext()){
Map.Entry<String,String> entry=(Map.Entry<String,String>)it.next();
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
3、Map.Entry的原理
Entry,其实也是一个接口,它是Map接口中的一个内部接口,其子类在实现Map接口的时候复写了Map内部的Entry接口。
第四部分、工具类Collections
1、概述
Collections工具类,属于java.util包,其中的方法全是静态方法,可以直接调用。
2、Sort排序
static <T extends Comparable<? super T>> void sort(List<T> list)
根据元素的自然排序,对指定的列表升序进行排序,传入的list对象必须是Comparable的子类,即list中存储的对象必须要有比较性(实现Comparable接口)。
static <T> void sort(List<T> list,Comparator<? super T> c)
可以自定义比较器,并将比较器传入sort中,类似于TreeSet。
3、取最大值
Collections.max(list),Collections.max(list,Comparator)
取出list集合中元素的自然排序最大值,传入的list集合中存储的对象需实现Comparable接口,或者传入一个比较器。
4、二分查找
Collection.binarySearch(list,"aa");
传入的list集合必须是进行了排序的,通过二分法搜索指定的对象,返回对象的小标
5、反序
reverse(List list)
反转指定列表中元素的顺序。
static <T> Comparator<T> reverseOrder()
返回一个比较器,强行逆转实现了Comparable接口的对象collection的自然顺序。
static <T> Comparator<T> reverseOrder(Comparator<T> cmp)
返回一个比较器,它强行逆转指定比较器的顺序。
6、转换为同步
static <T> List<T> synchronizedList(List<T> list)
static <K,V> Map<K,V><T> synchronizedMap(Map<K,V> m)
static <T> Set<T> synchronizedSet(Set<T> s)
返回与之对应的同步的集合