集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。
一.集合框架概述:
1、Java的集合框架提供了一套设计优良的接口和类,使程序员操作成批的数据或对象元素极为方便,极大的简化了程序员编程时的负担。
2、Java的集合框架的核心接口为:Collection、Map、Iterator,这三个接口为以后要使用的最重点的接口。
3、按具体集合类使用上的特性来分的话,主要有三类:List、Set和Map。List是有序的,但允许重复;Set是无序的,但不允许重复;Map表现的是键值对的概念。
集合可以理解为包含一堆元素的对象。
二.集合与数组的区别:
1、数组是定长,即创建后固定不变(数组在实例化的时候是一定要指定长度的);集合不是定长,其长度可动态增长或减少。
2、数组是同构的,即数组中的元素是相同的类型;集合可以是异构的(容易造成安全隐患),当然也可以通过泛型创建类型安全的同构集合。
3、数组中可以存放基本数据类型或对象;集合只存放对象。
4、数组的读取效率比集合更高,但集合能够适用的环境比数组要宽广的多。数组是直接按下标提取元素,提取元素是不需要经过运算的。而集合是通过方法再来转化成内部的存储结构,来读取元素或者存储元素,是要经过换算的,得到算法的支持的。
三.Collection接口
1、Collection接口是在整合Java集合中List和Set的父接口,此接口定义如下:
public interface Collection<E> extends Iterable<E>{}
此接口使用了泛型,在Java5之后为了使集合操作更加安全,引入了泛型。这里简单了解泛型知识:
public class GenericHolder<T> {//类类型参数化,具体使用时决定类的类型;多个参数之间用,隔开;
private T content;
public T getContent() {
return content;
}
public void setContent(T content) {
this.content = content;
}
public static void main(String[] args) {
GenericHolder<String> sHolder = new GenericHolder<String>();//表明GenericHolder中存放的是String类型的content
sHolder.setContent("string");
GenericHolder<Integer> iHolder = new GenericHolder<Integer>();//表明GenericHolder中存放的是Integer类型的content
iHolder.setContent(123);
GenericHolder<Bus> bHolder = new GenericHolder<Bus>();//表明GenericHolder中存放的是Bus类类型的content
bHolder.setContent(new Bus());
GenericHolder oHolder = new GenericHolder();//表明GenericHolder中存放的是Object类型的content
oHolder.setContent("object");
}
}
class Bus {
}
2、Collection接口中的常用方法
package com.microxt.fusion.web;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
public class GenericHolder {
public static void main(String[] args) {
Collection<String> c = new HashSet<String>();//String类型的集合HashSet
System.out.println(c.add("one"));//添加元素成功,返回true,也就打出true
System.out.println(c.add("one"));//由于HashSet集合不允许添加重复元素,打出false
c.add("two");
c.add("three");
c.add("four");
c.add("five");
System.out.println(c);//打印出HashSet集合对象c中添加的元素
System.out.println(c.remove("three"));//打印出true;
System.out.println(c.remove("three"));//打印出false;
System.out.println(c);
Iterator<String> it = c.iterator();//Collection对象的iterator()方法返回一个Iterator
while (it.hasNext()) {//判断是否有下一个元素
String s = it.next();
System.out.println(s);
}
System.out.println("-------------------------");
System.out.println("one:" + c.contains("one"));//contains()用来检查集合里面有没有指定元素存在;打印出true;
System.out.println("three:" + c.contains("three"));//打印出false;
System.out.println("-------------------------");
Collection<String> c2 = new HashSet<String>();
Collections.addAll(c2, "two", "five", "six");//加到集合c2中的元素是two、five、six,且后边元素的个数是不限的,可变的;
c.retainAll(c2);//c集合中只保留c2集合中指定的元素
System.out.println(c);
System.out.println("-------------------");
String[] array = c.toArray(new String[5]);//将集合转化成数组 ;长度为5的String类型的数组;
System.out.println(Arrays.toString(array));
}
}
四.Set接口
1、Set接口是Collection的子接口,Set内的元素是唯一的;
2、Set接口并没有对Collection接口进行扩展,但在具体方法的含义上进行了进一步约定;
3、Set不包含满足e1.equals(e2)的元素对e1和e2,并且最多包含一个null元素;
4、那么在此接口中有两个常用的子类:HashSet、TreeSet;
HashSet
1、HashSet是Set接口最常用的一种实现,它不保障元素的迭代顺序,并允许使用null元素;
2、HashSet根据哈希码来确定对象在容器中的存储位置,因此要加入的元素要实现hashCode方法,同时它具有非常优秀的查询性能;
3、在比较两个元素是否相同时,HashSet会先比较哈希值是否相同,再使用equals方法比较,如果两者都相同,则视为相同的对象。
4、加入到HashSet中的元素类,最好总是重新定义equals和hashCode方法。