Collection接口有三个主要的接口List,Set与Map。
先从List接口说起吧
列表List元素是按序排列的,List元素不允许重复,List集合中判断元素相同,依据的是元素的equals()方法。
List接口有两个主要的实现类:ArrayList与LinkedList
List类集合的主要方法:
增加元素:
add(E e)
addAll(Collection c)
删除元素:
remove(int index)
removeAll(Collection c)
修改元素:
set(int index, E e)
查询元素:
get(int index)
LinkedList底层数据结构是链表数据结构。
LinkedList特有方法:
addFirst();
addLast();
getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
offerFirst();
offerLast();
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。
class Test
{
public static void main(String[] args)
{
LinkedList link = new LinkedList();
link.addLast("lisir01");
link.addLast("lisir02");
link.addLast("lisir03");
link.addLast("lisir04");
while(!link.isEmpty())
{
System.out.println(link.removeLast());
}
}
}
ArrayList底层数据结构是数组 结构。
Set中的元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
HashSet:底层数据结构是哈希表。是线程不同步的。
HashSet判断两个元素相同是判断元素的hashCode值,如果hashCode值相同的话,才会判断equals()是否相同.
TreeSet可以对元素进行排序,底层数据结构是二叉树。TreeSet保证元素唯一的依据是compareTo的返回值
compareTo方法的返回值
compareTo值为1,按照add次序排序
compareTo值为-1,按照add次序反向排序
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
class TreeSetTest
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Person("lisi09",22));
ts.add(new Person("lisi007",20));
ts.add(new Person("lisi09",19));
ts.add(new Person("lisi08",19));
//ts.add(new Person("lisi01",40));
for(Iterator it = ts.iterator();it.hasNext();)
{
Person p = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class Person implements Comparable //该接口强制让学生具备比较性
{
private String name;
private int age;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Person))
throw new RuntimeException("不是Person对象");
Person p = (Person)obj;
System.out.println(this.name+"--compareTo--"+p.name);
if(this.age==p.age)
return this.name.compareTo(p.name);
return this.age-p.age;
}
}
这是第一种比较方式,使元素实现了Comparable接口
class TreeSetTest2
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new MyComp());
ts.add(new Person("lisi02",22));
ts.add(new Person("lisi007",20));
ts.add(new Person("lisi09",19));
ts.add(new Person("lisi06",18));
//ts.add(new Person("lisi01",40));
for(Iterator it = ts.iterator();it.hasNext();)
{
Person p = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class Person implements Comparable //该接口强制让学生具备比较性
{
private String name;
private int age;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Person))
throw new RuntimeException("不是Person对象");
Person p = (Person)obj;
//System.out.println(this.name+"--compareTo--"+p.name);
if(this.age==p.age)
return this.name.compareTo(p.name);
return this.age-p.age;
}
}
class MyComp implements Comparator
{
public int compare(Object o1,Object o2)
{
Person p1 = (Person)o1;
Person p2 = (Person)o2;
return p1.getName().compareTo(p2.getName());
}
}
这是第二种比较方式,自定义实现了Comparator接口的比较器MyComp,其实可以在TreeSet初始化的时候将比较器作为匿名内部类对象作为参数传递进去。
Map集合
Map集合存储的是键值对信息。
Map有两个主要的实现类:HashMap与TreeMap
注:HashMap无序的,但是TreeMap可以进行排序
Map集合的主要方法:
clear() 用于清空Map集合
get(Object key) 根据键的值来获取与之映射的值
put(K key,V value) 设置键值对
得到集合中元素一般这两种方法比较常见:
1. Set<k> keySet:将map中所有的见存入Set集合中,因为Set具有迭代器
所以可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值
2.Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到Set集合中,这个关系的数据类型就是:Map.Entry
下面分别演示两种方法的示例:
class Test
{
public static void main(String[] args)
{
Map<String,String> map = new HashMap<String, String>();
map.put("01","lisir01");
map.put("02","lisir02");
map.put("03","lisir03");
Set<Map.Entry<String, String>> entrySet = map.entrySet();
Iterator<Map.Entry<String, String>> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<String,String> entry = it.next();
System.out.println(entry.getKey()+"----"+entry.getValue());
}
/*
//Set<k> keySet
Map<String,String> map = new HashMap<String, String>();
map.put("01","lisir01");
map.put("02","lisir02");
map.put("03","lisir03");
Set<String> keySet = map.keySet();
Iterator<String> it =keySet.iterator();
while(it.hasNext())
{
String key = it.next();
System.out.println(key+"----"+map.get(key));
}
*/
}
}