------- android培训、java培训、期待与您交流! ----------
集合的用途:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式;数组和集合类同是容器,有何不同:
数组虽然也可以存储对象,但是长度是固定的,集合长度是可变的;集合特点:
数组中可以存储基本数据类型,集合只能存储对象。
集合只用存储对象,集合长度可变,集合可以存储不同类型的对象;泛型(Generic):JDK1.5版本以后出现新特性,用于解决安全问题,是一个类型安全机制。
好处:1,将运行时期出现的问题转移到编译时期;让运行时问题减少,安全提高。
List:集合中数据是有序的,可重复,有索引;2,避免了强制类型转换。
Set:数据无序,不可重复,无索引;
List:
特有方法:凡是可以操作角标的方法都是该体系特有的方法;
add(index,element);List集合特有的迭代器:ListIterator是Iterator的子接口
addAll(index,Collection);
remove(index);
set(index,element);
get(index);
subList(from,to);
listIterator();
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModificationException异常。ArrayList(1.2):底层的数据结构使用的是数组结构,线程同步;特点,查询速度快,但是增删稍慢
所以,在迭代时,只能用迭代器的方法操作元素,可是Iterator方法有限,只能对元素进行判断,取出,删除的操作;
如果想要其他操作如添加,修改等,就需要使用其子接口ListIterator。该对象只能通过listIterator方法获取;
LinkList:底层的数据结构使用的是链表结构,特点:增删的速度很快,查询稍慢;
Vector(1.0):底层是数组数据结构,线程同步的,被ArrayList替代;
枚举就是Vector特有的取出方式;枚举被迭代替换
List结合判断元素是否相同,依据的是元素的equals方法;Enumeration en = v.elements();en.hasMoreElements();en.nextElement();
Set:数据无序(存入和取出的顺序不一定一致),不可重复
Set的功能和Collection功能一致HashSet:底层结构是哈希表,只能用迭代器循环读取集合内元素
HashSet保证元素唯一性:是通过元素的两个方法:hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true;如果元素的HashCode值不同,不会调用equals。
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的HashCode和equals方法;TreeSet:可以对Set集合中的元素进行排序;集合中元素不具备可比性时报:ClassCastException类型转换异常
底层数据结构是二叉树;保证元素唯一性的依据:compareTo方法返回0;
TresSet排序的第一种方式:让元素自身具备比较性,元素对应的类需要实现Comparable接口,覆盖compareTo方法,也称为元素的自然顺序;
第二种方式:当元素的自身不具备比较性时,或具备的比较性不是所学要的,这是需要让集合具备比较性;定义一个类,实现Comparator接口,实现compare方法;
在集合初始化时,就有了比较方式;让容器自身具备比较性,定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数;
当两种方式都存在时以比较器为主。
记住:排序时,当主条件相同时,一定判断一下次要条件,写在compareTo方法内import java.util.*;
class ListDemo{
public static void method_1(){
ArrayList al = new ArrayList();al.add("java01");al.add("java02");al.add("java03");sop("元集合:"+al);//al.remove(2);//al.set(2,"java07");//通过角标获取元素sop("get():"+al.get(1));//获取所有元素for(int x=0;x<al.size();x++){
sop("al("+x+")="+al.get(x));
}Iterator it = al.iterator();while(it.hasNext()){
sop("next:"+it.next();
}//通过indexOf获取对象的位置sop("index="+al.indexOf("java02"));List sub = al.subList(1,3);sop("sub="+sub);
}
public static void main(String[] args){
//演示列表迭代器ArrayList al = new ArrayList();al.add("java01");al.add("java02");al.add("java03");sop("元集合:"+al);//在迭代过程中,准备添加或者删除元素ListIterator li = al.listIterator();while(li.hasNext()){
Object obj = li.next();if(obj.equals("java02"){
li.add("java08");//li.set("java005");
}
}sop(al);
}
public static void sop(Object obj){
System.out.println(obj);
}}
/*
LinkedList特有方法:
addFirst();
addLast();
getFirst();
getLast();//获取元素不删元素,如果集合中没有元素会出现NoSuchElementException异常;
removeFirst();
removeLast();//获取元素并删除元素,如果集合中没有元素会出现NoSuchElementException异常;
在JDK1.6出现了替代方法:
offerFirst();
offerLast();//添加元素
peekFirst();
peekLast();//获取元素,但不删除,如果没有元素返回null;
pollFirst();
pollLast();//获取元素,但元素被删除,如果集合为空会返回null;
*/
class LinkedListDemo{
public static void main(String[] args){
/*LinkecList ll = new LinkedList();ll.addFirst("java01");ll.addFirst("java02");ll.addFirst("java03");ll.addFirst("java04");ll.addFirst("java05");sop(link);*///模仿堆栈MyList my = new MyList();my.myAdd("java01");my.myAdd("java02");my.myAdd("java03");while(!my.isNull()){
sop(my.myGet());
}
}
public static void sop(Object obj){
System.out.println(obj);
}}
class MyList{
private LinkedList link;
public void MyList(){
link = new LinkedList();
}
public void myAdd(Object obj){
link.addFirst(obj);
}
public Object myGet(){
return link.removeFirst();
}
public boolean isNull(){
return link.isEmpty();
}}
练习:TresSet排序的第一种方式,实现Comparable接口
import java.util.Iterator;
import java.util.TreeSet;
class Man implements Comparable{//该接口强制让Man具备比较性
private String name;
private int age;
Man(String name, int age){
this.name = name;this.age = age;
}
public int compareTo(Object obj){
if(!(obj instanceof Man)){throw new RuntimeException("不是学生对象");}Man man = (Man)obj;if(this.age>man.age)
return 1;
if(this.age==man.age)
return this.name.compareTo(man.name);
return -1;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}}
public class TreeSetTest {
public static void main(String[] args){
TreeSet ts = new TreeSet();ts.add(new Man("zhang01",15));ts.add(new Man("zhang02",35));ts.add(new Man("zhang05",25));ts.add(new Man("zhang04",25));Iterator it = ts.iterator();while(it.hasNext()){
Man man = (Man)it.next();System.out.println(man.getName());
}
}}
//TreeSet排序第二种方式,定义比较器
class MyComparator implements Comparator{
public int compare(Object o1,Object o2){
Man man1 = (Man)o1;Man man2 = (Man)o2;int num = man1.getName().compareTo(man2.getName());if(num==0){
//将整数封装成Integer对象return new Integer(man1.getAge()).compareTo(new Integer(man2.getAge()));/*直接用整数进行大小比较if(man1.getAge()>man2.getAge())
return 1;
if(man1.getAge()==man2.getAge())
return 0;
return -1;*/
}return num;
}}