JAVA集合出现:
1.由于传统数组的长度大小是一定的,而集合的长度大小是不固定的,而且集合只能存储引用类型数据,不能存储基本类型数据;(JAVA的Integer 是对int的封装);
JAVA基本分类:
1.List(列表)
2.Set(集合)
3.Map(映射)
Collection 接口 :Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List 都继承了Conllection,Map;
Collection接口的方法:
boolean add(Object o) :向集合中加入一个对象的引用
void clear():删除集合中所有的对象,即不再持有这些对象的引用
boolean isEmpty() :判断集合是否为空
boolean contains(Object o) : 判断集合中是否持有特定对象的引用
Iterartor iterator() :返回一个Iterator对象,可以用来遍历集合中的元素
boolean remove(Object o) :从集合中删除一个对象的引用
int size() :返回集合中元素的数目
Object[] toArray() : 返回一个数组,该数组中包括集合中的所有元素
Iterator() 和toArray() 方法都用于集合的所有的元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。
1.Set(集合): Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 如果试图把两个相同元素加入同一个集合中,add方法返回false。
Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象。
HashSet :HashSet类按照哈希算法来存取集合中的对象,存取速度比较快 ; 不能保证元素的排列顺序,顺序有可能发生变化;集合元素可以是null,但只能放入一个null;
不是同步的;
LinkedHashSet:保留插入顺序,迭代访问性能比HashSet好,但插入不如HashSet;
TreeSet:TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序;TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象;自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法;
示例代码如下;
package test;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class SetTest {
public static void main(String[] args){
//载入自定义的排序规则
Set<Student> qingHua=new TreeSet<Student>(new TestComparator());
qingHua.add(new Student(170,120,100.1));
qingHua.add(new Student(175,115,100.2));
qingHua.add(new Student(180,110,100.3));
for(Student s:qingHua){
System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
}
Student.sortMold=2;
for(Student s:qingHua){
System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
}
Student.sortMold=3;
for(Student s:qingHua){
System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
}
}
}
class TestComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if(Student.sortMold==1){
if(o1.getHeight()>o2.getHeight()){
//返回-1的是需要的顺序
return -1;
}else if(o1.getHeight()<o2.getHeight()){
return 1;
}else{
return 0;
}
}else if(Student.sortMold==2){
if(o1.getWeight()<o1.getWeight()){
return 1;
}else if(o1.getWeight()>o1.getWeight()){
return -1;
}else{
return 0;
}
}else if(Student.sortMold==3){
if(o1.getGrade()>o2.getGrade()){
return -1;
}else if(o1.getGrade()<o2.getGrade()){
return 1;
}else{
return 0;
}
}
return 0;
}
}
class Student{
public static int sortMold =1; //排序模式,1为身高,2为体重,3为成绩
private int height; //身高
private int weight; //体重
private Double grade; //成绩
Student(int height,int weight,Double grade){
this.height=height;
this.weight=weight;
this.grade=grade;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Double getGrade() {
return grade;
}
public void setGrade(Double grade) {
this.grade = grade;
}
}
2.List(列表): List的特征是其元素以线性方式存储,集合中可以存放重复对象。
ArrayList 是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.
LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.
当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义.
Vector 和ArrayList类似,但属于强同步类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArrayList是更好的选择。
Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.而 LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.
注意: 默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。
3.Map(映射):Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。
HashMap:
Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。
HashMap最多只允许一条记录的键为Null;允 许多条记录的值为 Null;
HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。
如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
Hashtable:HashMap类似,它继承自Dictionary类,
不同的是:它不允许记录的键或者值为空;
它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。
LinkedHashMap:
保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以 在构造时用带参数,按照应用次数排序。
在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会 比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
TreeMap:实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度.
在Map 中插入、删除和定位元素,HashMap 是最好的选择。
TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应 用。