集合框架
集合的概念
- 概念:对象的容器,定义了对多个对象进行操作的方法。可以实现数组的功能
- 定义了对多个对象进行操作的常用方法
- 和数组的区别
- 数组长度固定,集合长度不固定
- 数组可以存储基本类型和引用类型,集合只能存储引用类型(基本类型装箱成引用类型存储在集合中)
- 位置处于Java.util.*中
Collection体系集合
-
Collection父接口
-
代表一组任意类型的对象,有序或无序、有下标或无下标、可重复或不能重复
-
方法:
boolean add(Object obj)//添加一个对象 boolean addAll(Collection c)//将一个集合中的所有对象添加到此集合中 void clear()//清空此集合中的所有对象 boolean contains(object o)//检查此集合中是否包含有O对象 boolean equals(Object o)//比较此集合是否与指定对象相等 boolean isEmpty()//判断集合是否为空 boolean remove(Object o)//在此集合中移除O对象 int size()//返回此集合中的元素个数 Object[] toArray()//将此集合转换成数组
-
-
List子接口
- 特点:有序、有下标、元素可重复
- 方法
- void add(int index,Object o)//在index位置插入对象o
- boolean addAll(int index,Collection c)//将一个集合中的元素添加到此集合汇总的index位置
- Objext get(int index)//返回集合中指定位置的元素
- List subList(int fromIndex,int toIndex)//返回fromIndex和toIndex之间的集合元素
-
List实现类
-
ArrayList【重点】
- 内部采用数组方式存储
- 数组结构实现,查询快、增删慢
- JDK1.2版本,运行效率快、线程不安全
- 源码分析默认容量大小为10
- 如果没有向集合中添加任何元素时,容量为0
- 存放元素的数组elementData
elementData = Arrays.copyOf(elementData, newCapacity);
- size实际元素的个数
- add方法
- 当存储位数大于10时每次扩容是原来的1.5倍
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); }//默认值和Capacity比较 当添加元素只有一个时,默认容量为10则最小容量为10 return minCapacity; } private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); }
- vector
- 数据结构实现,查询快、增删慢
- JDK1.0版本,运行效率慢、线程安全
- LinkedList
- 链表结构实现,增删快,查询慢
-
-
ArrayList和LinkedList的区别
- ArrayList:必须开辟连续空间,查询快增删慢
- LinkedList:无需开辟连续空间,查询慢,增删快
- 链表中的删只是让A跳过B指向C,让C跳过B指向A,B并没有被真正删除,还是在存储空间中,但是链表中查询不到B的存在
-
Set子接口
- 无序、无下标、元素不可重复
- 方法全部继承自Collection中的方法
-
Set实现类
-
HashSet【重点】
- 基于HashCode实现元素不重复,计算元素存放的位置
- 存储结构:哈希表(数组+链表+红黑树)
- 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入
-
TreeSet
- 红黑树存储结构
- 机遇排列顺序实现元素不重复
- 实现SortedSet接口,对集合元素自动排序
- 元素对象的类型必须实现Comparable接口,指定排序规则
- 通过CompareTo方法确定是否为重复元素
-
泛型
- Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,把类型当做参数传递
- 常见形式有泛型类、泛型接口、泛型方法
- 语法:
<T,...>//T称为类型占位符,表示一种引用类型
- 优点:
- 提高代码的重用性
- 防止类型转换异常,提高代码的安全性
- T可以创建变量,但是不能够实例化,因为T所表示的数据类型不确定
泛型类
- 泛型类的的创建
public class MyGeneric<T>{
}
- 泛型类的使用
- 使用泛型类创建对象
- 注意
- 泛型只能使用引用类型
- 泛型赋值需要符合所使用的引用类型
- 不同泛型对象不能相互赋值
泛型接口
- 语法:
public interface MyInterface<T>{
}
- 不能使用泛型创建静态常量
- 在使用实现类实现泛型接口的时候就应该告知接口的泛型所使用的引用类型
//实现类实现泛型接口
public class MyInterfaceImpl implements MyInterface<String(或者其他的引用类型)>{
@Override
public String Server(String s) {
return null;
}
}
- 也可以在在泛型类实现泛型接口先不告知接口,在创建泛型实现类对象的时候才传递类型给泛型实现类再传递给泛型接口
//泛型实现类实现泛型接口
public class MyInterfaceImpl2<T> implements MyInterface<T>{
@Override
public T Server(T t) {
System.out.println(t);
return t;
}
}
- 两种实现类的使用
泛型方法
- 泛型方法的类型不需要我们去传递,类型是由我们使用方法时传递的数据决定的
//创建泛型方法
public <T> void show(T t){
}
public <T> T show(T t){
return t;
}
泛型集合
- 参数化类型、类型安全的集合,强制集合元素的类型必须一致
-
特点
- 编译时即可检查,而非运行时抛出异常
- 访问时,不必类型转换(拆箱) LinkedList 、 ArrayList存放的是Objece类型所以使用时需要强转不然容易出现错误
- 不同泛型之间引用不能相互赋值,泛型不存在多态
Map体系集合
- 特点:
- 用于存储任意键值对(Key-Value)
- 键:无序、无下标、不允许重复
- 值:无序、无下标、允许重复
Map父接口
- 特点:
- 存储一对数据,无序、无下标、键不可重复、值可重复
- Map集合中在同一个键中重复输入值会将原有的值替换掉
- 方法:
V put(K key,V value)//将对象存入到集合联,关联键值。Key重复则覆盖原值
Object get(Object key)//根据键获取对应的值
Set<K>//返回所有key
Collection<V> values()//返回包含所有值的Collection集合
TreeSet<Map.Entry<K,V>>//键值匹配的Set集合
Map集合的实现类
-
HashMap【重点】
- HashMap的创建与使用,以及两种遍历方法
- JDK1.2版本,线程不安全,运行效率快;允许使用null作为Key或是Value
- 构造方法HashMap()无参构造方法的默认初始容量为16,最大容量为2^30,默认加载因子为0.75,当容量超过目前容量75%时开始扩容,每次扩容为原来的两倍
- 存储结构:哈希表(数组+链表+红黑树),当链表长度大于8时链表则转为红黑树存储,红链表小于6时则转为链表存储
-
Hashtable:已经不常用
- JDK1.0版本,线程安全,运行效率慢,不允许使用null作为key或是value
- Properties
- Hashtable的子类,要求key和value都是String,通常用于配置文件的读取
- 与流关系紧密
- 表示了一个持久的属性集合
- 可以保存在流中或从流中加载
-
TreeMap
- 实现了SortedMap接口(是Map的子接口),可以对key自动排序
Collections 工具类
-
集合工具类,定义了出了存取以外的集合常用方法
-
方法
public static void reverse(List<?> list)//反转集合中的元素顺序 public static void shuffle(List<?> list)//随机重置集合元素的顺序 public static void sort(List<?> list)//升序排序(元素类型必须实现的Comparable接口)