最近有点时间,把一些基础整理一下,防止长时间没用忘了。。。
一、集合框架
概述:
集合类是高级容器,专门用于存储对象,长度可变。
所有相关的类和接口都在java.util包中
集合框架主要分为三大分支:
列表(List)、集合(Set)、映射(Map)
特点:
- 长度可变
- 用于存储对象,不可以存储基本数据类型
集合框架和数组的区别:
- 数组的大小是固定的,而集合的大小是可变的
- 数组可以存储基本数据类型,也可以存储引用数据类型类型,而集合只能存储对象
集合容器由于内部可以存在多种数据结构,所以有多种具体容器,将容器共性内容不断向上抽取,就形成了集合容器
Collection接口:
常用方法:
添加:
- add(Object o):添加一个对象
- addAll(Collection c):添加一个集合中的所有对象
删除:
- remove(Object o):删除指定对象
- removeAll(Collection c):删除两个集合中共有对象
- clear():清空集合
判断:
- contains(Object o):判断集合中是否存在指定对象
- containsAll(Collection c):判断当前集合中是否包含指定集合中的所有对象
- isEmpty():判断集合是否为空
获取:
- size():获取集合中的对象数量
- iterator():获取迭代器对象
- toArray():获取当前集合中所有集合的数组
其他:retainAll(Collection c):保留两个集合中相同的对象(取交集)
子接口:
- List:有序的集合(存入和取出的顺序是一样的),元素可以重复
- Set:无序的集合(其实现类型存在特殊情况),元素不可重复
List接口:
- 概念:List是有序的集合,元素可以重复
- List接口继承自Collection接口,具备Collection接口中的所有方法
- List接口中的特有方法(有一个共同的特征,都是在操作下标)
- 添加
- add(int index,Object o):在指定位置插入一个对象
- addAll(int index,Collection c)在指定位置插入指定集合中的所有对象
- 删除
- remove(int index):删除指定位置上的对象
- 修改
- set(int index,Object o):用指定对象替换原列表中指定位置的对象
- 获取
- get(int index):获取指定位置上的对象
- indexOf(Object o):获取指定对象在集合中第一次出现的下标
- lastIndexOf(Object o):获取指定对象在集合中最后一次出现的下标
- subList(int start,int end):获取子列表
- listIterator():获取列表迭代器
List接口的常见子类:
- ArrayList:内部数据结构是数组,线程不同步
- LinkedList:内部数据结构是链表,线程不同步
- vector:内部数据结构是数组,线程同步,已被ArrayList替代
ArrayList和LinkedList有什么不同:
- 底层实现原理不同,ArrayList底层是基于数组实现的,而LinkedList底层是基于链表实现的
- ArrayList更适合对元素执行查询操作,而LinkedList更适合对元素执行增加、删除等操作
Set集合:
概念:Set是无序的集合,元素不可以重复
Set继承自Collection中所有的接口,具备Collection中所有的方法,没有特殊方法
Set接口的常见子类:
- HashSet:内部数据结构是哈希表,线程不同步
- 存入对象的时候会先先通过hashCode()方法计算对象的哈希值
- 根据哈希值找到对应的存储位置
- 如果位置上没有元素,就直接存入
- 如果位置上有元素,就通过调用equals()方法进行判断
- 如果equals()返回true,代表对象“相等”,就不存
- 如果equals()放回false,代表对象“不相等”(哈希冲突),会通过算法解决哈希冲突后将数据存入集合中
- TreeSet:内部结构是二叉树,线程不同步,对集合中的对象进行了排序(自然排序)
- 数据结构:二叉树(红黑树,是一个自平衡的二叉树)
- 二叉树的操作原理
- 存储数据:先和根节点比较大小,如果一样大就不存,如果比节点小,就往左边树,如果打就往右边树,然后再反复进行比较,直到找到合适的位置
- 遍历数据:中序遍历:先访问中间节点,再访问左、右节点
Comparable和Comparator接口:
- Comparable接口:是一个具备比较方法的接口,实现该接口的类就具备了比较大小的能力,可以通过接口中compareTo(T o)方法与其他对象进行比较
- Comparator接口:是一个比较器接口,实现了该类的接口就是一个比较器类,可以通过接口中的compare(T o1, T o2)方法比较两个指定对象的大小
- PS:comparable接口是让类本身具备比较大小的能力,而Comparator接口是单独定义一个比较器,独立于参与比较的对象之外,用于比较两个对象的大小(因为比较器中定了比较规则,所以此时对象本身不需要具备比较大小的能力)。
- 下面放个简单的测试Demo:
import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; public class CollectionSortDemo { /** * @Description: * @param args * @return void * @author Libra丶X * @date 2016-11-11 上午9:35:25 */ public static void main(String[] args) { // 集合排列演示 /** * 需求:List对象中存放多个Person对象(此对象包含名字、年龄) * 按Person的年龄大小进行排序,假设年龄大小相等,再按名字大小来排序,求出年龄最大的那个学生的信息 */ List<Person> list = new ArrayList<Person>(); list.add(new Person("xiangdong", 18)); list.add(new Person("xiaonan", 18)); list.add(new Person("wangcai", 30)); list.add(new Person("laifu", 50)); list.add(new Person("xiaoming", 30)); Collections.sort(list); /*Collections.sort(list, new Comparator<Person>(){ @Override public int compare(Person o1, Person o2) { // TODO Auto-generated method stub return o1.name.compareTo(o2.name); } });*/ for (Person person : list) { System.out.println(person); } } static class Person implements Comparable<Person>{ String name; int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Person o) { // TODO Auto-generated method stub return this.age-o.age; } } }
Map集合:
概念:
- Collection是单列集合,一次存储一个对象
- Map是双列集合,一次存储俩个对象,以键值对的形式存储,并且保证键的唯一性(不可重复),但是值可以重复
Map集合中的方法:
- 增加
- put(Object key, Object value):添加一组键值对,如果键已存在,则替换原有的值
- putAll(Map m):将指定的Map集合中的所有键值对添加到当前Map集合中
- 删除
- remove(Object key):将指定的键值对删除
- clear():清空集合
- 判断
- containsKey(Object key):判断是否包含指定的键
- containsValue(Object value):判断是否包含指定的值
- isEmpty():判断是否为空
- equals(Object o):判断存储的元素是否相同
- 获取
- get(Object key):通过键取值
- keySet():获取该集合中所有的键的Set集合(保证元素唯一)
- values():获取该集合中所有的值的Collection集合(元素可重复)
- Set<Map.Entry<K,V>> entrySet():获取该集合中所有键值对(Entry)的Set集合
遍历Map集合中的元素:
- 通过keySet()方法获取所有键的集合,通过键获取值
- 通过entrySet()方法获取所有键值对的集合
- 通过valuse()方法获取所有值的集合,但是只能访问map集合中的所有值
- PS:Map集合中没有迭代器,不能使用迭代器来遍历map集合,所以也能用foreach循环来遍历Map集合
Map接口的常见子类:
- HashMap:内部数据结构是哈希表,线程不同步
- TreeMap:内部数据结构是二叉树,线程不同步
- Hashtable:内部数据结构是哈希表,线程同步,被HashMap替代
Collection和Collections的区别:
- Collection是集合框架中的一个顶层接口,其中封装了对集合操作的基本方法,它的常用子接口有List和Set
- Collections是一个工具类,其中包含了许多对集合中对象操作的静态方法,比如对于集合的查询和排序等操作