首先,集合与数组的区别?
1. 长度: 数组固定;集合可变。
2. 存储类型: 数组存储基本数据类型和对象;集合只能存储基本数据类型。
数组存储的元素必须是一个数据类型;集合存储对象可以是不同类型。
集合类(为什么出现集合类??)
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,
集合就是存储对象最常用的一个方式。
Collection接口
|--List: 有序,元素都有索引。 元素可以重复。
|--ArrayList: 底层的数据结构是数组,线程不同步
|--LinkedList: 底层的数据结构是链表,线程不同步
|--Vector: 底层的数据结构是数组,线程同步
取出list集合中元素的方式:
get(int index):通过脚标获取元素
iterator():通过迭代方法获取迭代器对象
|--Set: 无序,不可以存储重复元素。 必须保证元素唯一性。
|--HashSet: 底层数据结构是哈希表,线程不同步,无序高效。
HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成。
|--TreeSet: 底层数据结构是二叉树,对集合中的元素进行指定顺序的排序,不同步
用于对set集合进行元素的指定顺序排序,排序需要依据元素自身具备的比较性。
1. 让元素自身具备比较性,元素实现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 compateTo(Object obj){
if(!(obj instanceof Student))
throw new RuntimeException("not a student");
Student s = (Student)obj;
if(this.age > s.age)
return 1;
if(this.age = s.age)
return this.name.compareTo(s.name);
return -1;
}
}
2. 当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让集合自身具备比较性。
定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
class StrLenComparator implements Comparator{ //元素自身具备比较性不是所需要的,定义比较器
public int compare(Object o1, Object o2){
String s1 = (String)o1;
String s2 = (String)o2;
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num == 0)
return s1.compareTo(s2);
return num;
}
}
Iterator接口: 用于取集合中的元素。
Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
Map集合
|--Hashtable: 底层是哈希表数据结构,是线程同步的。 不可以存储null键null值
|--HashMap: 底层是哈希表数据结构,是线程不同步的。 可以存储null,替代了Hashtable
|--TreeMap: 底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。
Map和Collection区别???
|--Collection一次存一个元素;Map一次存一对元素。
|--Map存储元素用put方法;Collection使用add方法。
|--Collection是单列集合;Map是双列集合。
|--Map中的存储的一对元素:一个是键,一个是值,键与值之间有映射关系。
|--Map集合没有取出元素的方法,需要先转成set集合,再通过迭代器取出元素。
特点:要保证map集合中键的唯一性。
把Map集合转成set的方法(map中没有迭代器,所以想要取出map中的所有元素,需要将map集合转成set集合)
Set keySet();
Set entrySet(); //取的是键和值的映射关系
注:Entry就是Map接口中的内部接口:
为什么要定义在map内部呢?entry是访问键值关系的入口,是map的入口,访问的是map中的键值对。
使用集合的技巧:
|--看到Array就是数组结构,有角标,查询速度很快;
|--看到link就是链表结构:增删速度快,
而且有特有方法:addFirst, addLast, removeFirst(), removeLast(), getFirst(), getLast()
|--看到hash就是哈希表,
就要想到哈希值,
就要想到唯一性,
就要想到存入到该结构中的元素必须覆盖hashCode,equals方法
|--看到tree就是二叉树,就要想到排序,就想到要用比较。
比较的两种方式:实现Comparable接口,覆盖compareTo方法
实现Comparable接口的比较器,覆盖compare方法
|--LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表存入顺序和取出顺序一致,保证哈希表有序。
集合什么时候用??
|--当存储的是一个元素时,就用Collection。当存储对象之间存在映射关系时,就使用map集合
|--保证唯一,就用set;不保证唯一,就要list
Collection和Collections区别??
|--Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的操作。
|--Collection是个java.util下的接口,是各种集合结构的父接口。
泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制。
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。