------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、概述
集合是一个容器,它的内部装的都是对象,并且可以是不同类型的对象。当把基础类型放入集合时,系统会自动装箱拆箱,例如将int存入List,会自动转换成Integer。
集合和数组相比有几点不同
1.数组内的长度是固定的,集合是可变的
2.数组可以存放基础类型,集合通过包装基础类才能存取
二、Collection接口中的几个常用类
Collection接口
1.List接口 实现该接口的类,元素都是有序的,可以重复,该集合体系有索引。
1.1 ArrayList类 该类底层是数组结构,线程不同步,读取快。
1.2 LinkedList类 该类底层是链表结构,增删快,但是读取慢。
1.3 Vector类 该类底层是数组结构,线程同步,增删改查都很慢,已经很少使用。
2.Set接口 实现该接口的类,元素都是无序的,不可以重复,该体系没有索引。
2.1 HashSet类 底层是哈希表结构,使用该类应该复写hashCode和equals方法
2.2 TreeSet类 底层是二叉树结构,使用该类应该确保成员有可比性,通过compareTo()方法或者调用Comparator排序器。
Collection的子类都实现了iterator()方法
Collection的共有方法示例
import java.util.*;
class Demo implements Cloneable{
public static void main (String []args) throws Exception{
List list = new ArrayList(); //创建新集合
List list2 = new ArrayList();
list2.add("asdqwd"); //加入元素
list2.add("qwrd");
list2.add("asewe");
list2.add("wad");
if( list.isEmpty() ){ //判断集合是否为空
list.addAll(list2); //加入一个集合的所有元素
}
list.containsAll(list2); //判断是否包含一个集合所有元素
boolean x = list.contains("qwed"); //获取一个元素在集合的
list.remove("wad"); //删除一个元素
list.clear(); //清空一个集合
int y = list.size(); //获取集合的长度
Iterator it = list2.iterator(); //建立该集合的迭代器对象
while(it.hasNext()){ //判断有没有下一个元素
System.out.println(it.next()); //输出下一个元素
}
}
}
List的特有方法
add(index,element) //指定角标添加元素
remove(index) //删除指定角标
set(index,element) //替换指定角标的元素
get(index) //获取指定角标的元素
subList(form,end) //获取一个子集,包含form到end-1的元素,
listIterator() //获取一个专门处理list的迭代器
LinkedList:特有方法
addFirst(): //开头添加一个对象
addLast(): //向结尾添加一个对象
getFirst(): //获取开头的对象
getLast(): //获取集合尾部的对象
removeFirst(): //删除角标为0的对象,并且返回这个对象
Set集合元素是无序的,我们要保证元素的唯一性
hashSet是通过元素的hashCode和equals来保证元素唯一性。首先判断hashCode是否相同,不同就显然不是同一对象,如果哈希值相同,再通过equals来判断是否相同。
class People{
private String name;
private int age;
People(String name){
this.name = name;
this.age = age;
}
void getname(){
System.out.println("t");
}
public int hashCode(){
return name.hashCode()*22+age;
}
public boolean equals( Object obj ){
if( (obj instanceof People)!=true )
return false ;
else{
People p = (People)obj;
if(this.hashCode() != p.hashCode() )
return false ;
else if( this.name == p.name && this.age == p.age ){
return true ;
}
else
return false ;
}
}
}
TreeSet通过两元素比较的方法来确定唯一性。要么对象的类实现了Comparable接口并重写compareTo方法,要么使用比较器。
//Comparable接口方法
class Person implements Comparable{
private String name;
private int age;
Person(String name){
this.name = name;
this.age = age;
}
void getname(){
System.out.println("t");
}
public int compareTo(Object o){
Person p = (Person)o;
if( this.name == p.name && this.age == p.age)
return 0 ;
else if( this.age >= p.age ){
return 1 ;
}
else
return -1 ;
}
}
//比较器方法
class Demo(){
TreeSet<Person> ts = new TreeSet<Person>(new Mycomp());
}
class Mycomp implements Comparator<Person>{
public int compare(Person p1,Person p2){
return p1.compareTo(p2);
}
}
三、Map接口和它的实现类
Map与Collection在集合框架中属并列存在,Map存储的是键值对,Map存储元素使用put方法,Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素,Map集合中键要保证唯一性。
Map的常用子类
Hashtable:线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。
HashMap:线程不安全,速度快,允许存放null 键,null值。
TreeMap:对键进行排序,排序原理与TreeSet 相同。
Map有两种遍历方式
class Demo implements Cloneable{
public static void main (String []args) throws Exception{
Map<Integer,String> map = new TreeMap<Integer,String>();
map.put(1,"aaa");
map.put(2,"bbb");
map.put(3,"ccc");
map.put(4,"ddd");
map.put(5,"eee");
//下面是用keySet来遍历
Set<Integer> s = map.keySet();
Iterator<Integer> it = s.iterator();
while(it.hasNext()){
int x = it.next();
System.out.println(x+" "+map.get(x));
}
//下面是用entrySet来遍历
Set<Map.Entry <Integer,String >> s2= map.entrySet();
Iterator<Map.Entry < Integer,String > > it2 = s2.iterator();
while(it2.hasNext()){
Map.Entry <Integer,String> m = it2.next();
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
使用entrySet可以使用setValue来修改值,所以推荐使用。
四、Collections
Collections是一个Collection的工具类,它里面都是静态方法。常用方法有:
fill(List<? super T> list, T obj);
max(Collection<? extends T> coll);
min(Collection<? extends T> coll);
reverse(List<?> list);
reverseOrder(Comparator<T> cmp);
shuffle(List<?> list);
sort(List<T> list, Comparator<? super T> c);
swap(List<?> list, int i, int j);
用是个i还有一个对应操作数组的Arrays。他们实现了数组集合的互转。注意的是数组转成的集合不具备扩展性。
五、高级For循环
在遍历一个数组或集合时,可以这样简写
for( Object o : list ){
}
高级for循环其实用的也是迭代器,再使用高级for循环时无法对集合进行操作,只能遍历,有较大局限性。