什么是集合框架
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
数组、对象数组、集合框架的特点与区别
数组:用于存放同一基本数据类型(值类型)元素的组合
对象数组:用于存放同一对象类型元素的组合
集合框架:动态的数组对象
集合只能存储对象,经常犯的错误:集合可以存储整型之类的基本数据类型,其实那是通过自动装箱,拆箱机制,转为了Integer对象。
区别:
数组不能动态扩张,定义时必须指定长度,长度不可变;
集合则无需指定长度,可动态扩张,长度可变。
为什么需要集合框架?
如果不知道程序运行时需要多少对象,或者需要更复杂方式存储对象,可以使用集合框架。
Collection集合框架用来存储和操作不同类型的对象组。
集合框架的体系
Collection接口
Collection主要有三个子接口:
Set——表示不允许有重复元素的集合
List——表示允许有重复元素的集合
Queue——队列,JDK1.5新增,与上面两个集合类主要是的区分在于Queue主要用于存储数据,而不是处理数据。队列是一种特殊的线性表,先进后出。
Stack——继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
List接口
特点:
(1)和数组类似,可以动态增长;
(2)有序,对象可以重复;
(3)查找元素效率高,插入删除元素效率低(会引起其他元素位置改变)。
遍历方式:
(1)下标
(2)foreach(>=JDK 1.5)
(3)迭代器Iterator
优化:
(1)默认长度为0,初始容量10,50%延长,相对节约空间。
对应类有:ArrayList、LinkedList、Vector
(1)ArrayList:动态数组,是线程不同步的,查询速度快,但是增删慢。
优化:创建ArrayList的时候指定初始容量new ArrayList<>(50); //初始指定50长度
增长方式:n*3/2+1
(2)LinkedList:链表、队列、堆栈,查询慢,增删快。
(3)Vector:是一种老的动态数组,是线程同步的,安全且效率很低,一般不赞成使用。
长度为10,当超过10时,100%延长,变为20个(有点浪费空间)。
Set接口
特点:
(1)无序,对象不可以重复(eqauls——eqauls从Object继承,默认比较的地址);
(2)查找元素效率低,插入删除元素效率高(不会引起元素位置改变)。
遍历方式:
(1)foreach
(2)迭代器
对应类有:HashSet、TreeSet。
(1)HashSet:以哈希表的形式存放元素,插入删除速度很快。
(2)TreeSet:根据某种(规则)对里面的元素进行排序。
规则1: java.lang.Comparable
规则2: java.util.Comparator
Map接口
特点:
(1)无序、以键值对的形式添加元素,键不能重复,值可以重复
遍历方式:
(1)先取出保存所有键的Set,再遍历Set即可(2种)。
(2)先取出保存所有Entry的Set,再遍历此Set即可。
快速遍历Map:遍历保存Entry,省略根据key取值
Map<String,String> map = new HashMap<String,String>();
Map.put.....;
For(Map.Entry<String,String> entry : map.entrySet()){
System.out.println(entry.getKey()+” = ”+entry.getValue());
}
对应类有:HashMap、TreeMap、Hashtable、LinkedHashMap
(1)HashMap:根据键的HashCode值存储数据,查询快,最多允许一个键为NULL,多个值为NULL。
线程不同步
(2)Hashtable:与HashMap类似,但它不允许键或值为NULL。支持线程的同步(即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢)。
(3)TreeMap:根据键排序(默认升序),也可指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
(4)LinkedHashMap:保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历 的时候会比HashMap慢。
Map并不是一个真正意义上的集合,但是这个接口提供了三种“集合视角”,使得可以像操作集合一样操作。
定义、增加、删除、修改、查找
Collections类
排序
//sort方法进行简单排序,默认升序
Collections.sort(集合名称);
//复杂对象排序
List<Student> li = new ArrayList<>();
li.add(new Student("5张三", 1, "男"));
li.add(new Student("1张三", 1, "男"));
li.add(new Student("2张三", 1, "男"));
li.add(new Student("3张三", 1, "男"));
li.add(new Student("4张三", 1, "男"));
Collections.sort(li);
//得在实体类继承Comparable,
重写
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
return this.getName().compareTo(o.getName()); //根据姓名排序
}
反转
//Collections.reverse(li);
交换
//Collections.swap(li, 0, li.size()-1);
取最大最小
//Collections.max(lc);
//Collections.min(lc);
复制
Collections.copy(新集合, li);//注意复制时新的集合长度必须大于等于要复制的集合长度,如果长度为0时报错
其它
5.1 Iterator(迭代器):遍历集合List/Set
hasNext
next
remove:在遍历集合,并同时需要删除集合中的元素时,建议使用
Iterator.remove
5.2 java.lang.Comparable:自然排序接口
5.3 java.util.Comparator:比较器接口
5.4 Collections:工具类,提供一组静态方法操作Collection集合
Arrays:工具类,提供了一组静态方法操作数组
泛型
以类型作为参数的类就叫泛型。
作用:提高程序健壮性,简化代码
泛型的默认值是Object
装箱、拆箱
值类型->引用类型 装箱
引用类型->值类型 拆箱
JDK1.5之后引入了自动装箱及自动拆箱功能
评论 (0)