Collection:集合,用于存储对象的,对对象进行增删等操作,定义了集合框架的共性内容
--List:元素是有序的,元素可以重合,该体系结构有索引
--ArrayList:底层的数据结构是数组结构,元素有索引;查询很快,增删稍慢,线程不同步
--LinkedList:底层的数据结构是链表结构;增删速度很快,查询速度不快,线程不同步
--Vector:底层是数组数据结构,查询,增删都很慢,效率低,已经被ArrayList取代;但线程同步
--Set :元素是无序的(存入和取出的顺序不一致),元素不可以重复
--HashSet:底层数据结构是哈希表,线程是不同步的,不安全
--TreeSet:底层的数据结构是二叉树结构
HashSet是如何保持数据的不重复性?
通过元素的两个方法,equals()和hashCode(),首先集合判断元素的hashCode是否相同,如果相同则再判断
equals();相同则不加入集合,不相同则加入;如果首先判断的hashCode不相同,则equals则不会去判断
所以如果元素这个类是自己写的则要覆写以上两个方法,否则系统调用的将是Object类中的
hashCode和equals两个方法,这样将会导致无法判定两个自己写的元素是否是相同的
TreeSet是如何实现数据的排序?
有两种实现方式:
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性;集合自身覆盖comparator接口
集合自身实现compare方法,在集合初始化时,就有了比较方式
Collection定义了集合框架的共性,是所有集合的父类
1.增加元素
add(Object e):添加一个元素,这个元素可以是任何的类型,所以是Object类型
addAll(Collection e):添加所有的元素
2.删除元素
remove(Object e):移除一个元素
removeAll(Collection e ):移除一个collection子类对象中的所有元素
clear():清空所有元素
3.判断元素
contains(Object e):判断集合中是否包含e这个元素
containsAll(Collection e):判断集合中是否包含e这个集合
isEmpty():判断集合是否是空
4.获取元素
iterator():获取所在类的迭代器,就是取出集合中元素的方法
注意:iterator()是所有集合所共有的,在迭代时不可以通过集合对象中的方法操作集合中的元素,会发生异常
只能对元素进行判断,取出,删除的操作
size():获取元素的个数
List中特有的方法:凡是可以操作角标的方法都是该体系中特有的方法
1.添加元素
add(index,element):根据角标添加元素
addAll(index,Collection):根据角标添加一个集合中的元素
2.删除元素
remove(index):根据角标删除元素
3.修改元素
set(index,element):根据角标修改元素
4.查询元素(获取元素)
get(index):根据角标查询元素
subList(from,to):
listIterator():List特有的迭代器
int indexOf(obj):获取指定元素的位置
5.List集合特有的迭代器ListIterator
ListIterator是Iterator的子接口,Iterator迭代只能对元素进行判断,取出,删除的操作,如果要想对元素进
行修改就需要使用其子接口ListIterator来实现
LinkedList特有的方法
1.addFist():从集合的开头添加元素
addLast():从集合的结尾添加元素
2.getFirst():获取集合开头的元素,但不删除,如果没有元素则会出现NoSuchElementException
getLast():获取集合结尾的元素,不删除,如果集合没有元素则会出现NoSuchElementException
JDK1.6以后出现的替代方法
peekFirst();
peekLast();
获取元素,但不删除元素,如果集合中没有元素,会返回null。
3.removeFirst():
removeLast():
获取元素,但是元素被删除,如果集合中没有元素,会出现NoSuchElementException
JDK1.6以后出现替代方法
pollFirst();
pollLast();
获取元素,但是元素被删除,如果集合中没有元素,会返回null。
集合的一些技巧:
需要唯一嘛?
需要:Set
需要制定顺序嘛?
需要:TreeSet
不需要:HashSet
想要一个和存储一到处的顺序(有序):LinkedHashSet
不需要:List
需要频繁增删嘛?
需要:LinkedList
不需要:ArrayList
List
--ArrayList
--LinkedList
--Vector
Set
--HashSet
--TreeSet
--LinkedHashSet
后缀名就是集合所属的体系,前缀名就是该集合的数据结构
看到array:就要想到数组,查询快,有角标
看到link:就要想到链表,增删快,就要想到add get remove+first last
看到hash:就要到哈希表,想到唯一性,想到元素需要覆盖hashCode方法和equals方法
看到tree就要想到二叉树,就要想到有序,想到两个接口Comparable,Comparator
而且这些常用的集合容器都是不同步的
//List集合实现向集合中加入数据并输出
import java.util.*;
class Person {
public String name;
public int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
public class ConList{
public static void main(String[] args){
//创建集合
List<Person> lt=new LinkedList<Person>();
//向集合中增加元素
lt.add(new Person("lidaouf",21));
lt.add(new Person("李道福",23));
lt.add(new Person("LIDAOFU",24));
lt.add(new Person("AFU",24));
lt.add(new Person("SBUTHPYG",26));
lt.add(new Person("道福",20));
//取迭代器
Iterator<Person> it=lt.iterator();
//取元素
while(it.hasNext()){
Person p=it.next();
System.out.println(p.getName()+":"+p.getAge());
}
}
}
/*TreeSet集合实现向集合中加入元素并输出
为了实现TreeSet集合中元素的唯一性,程序要实现comparable接口中的compareTo方法
*/
import java.util.*;
class Person implements Comparable{
private String name;
public int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public int compareTo(Object p1){
Person p=(Person)p1;
int temp=this.age-p.age;
return (temp==0) ? (this.name.compareTo(p.name)): temp;
}
}
public class ConList{
public static void main(String[] args){
//创建集合
TreeSet<Person> lt=new TreeSet<Person>();
//向集合中增加元素
lt.add(new Person("lidaouf",21));
lt.add(new Person("李道福",23));
lt.add(new Person("LIDAOFU",24));
lt.add(new Person("AFU",24));
lt.add(new Person("SBUTHPYG",26));
lt.add(new Person("道福",20));
//取迭代器
Iterator<Person> it=lt.iterator();
//取元素
while(it.hasNext()){
Person p=it.next();
System.out.println(p.getName()+":"+p.getAge());
}
}
}