1.集合的概念:
Java集合类存放于 java.util 包中,是一个用来存放对象的容器。集合的长度不定,数组在定义的时候长度便已经固定。
注意:①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。
②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。
③、集合可以存放不同类型,不限数量的数据类型。
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
Collection:
list:有序可重复,包括 Arraylist、Linkedlist、Vector、Stack,有公用的方法包括add、remove、size、 contains
Set:无序不可重复,包括 Hashset、Treeset
Map<K,V> :
Map 存储一组键值对象,提供key(键)到value(值)的映射,包括 Hashmap、Hashtable
Collections:
collections是java提供的一个集合工具类,提供排序、遍历等方法
2.arraylist的使用
arraylist有序可重复,可包含多个null元素,默认容量为10,可自动扩容缩容,每次默认自增50%。arraylist遍历和随机访问方便,具有3个构造方法,分别是1.默认构造方法 2.参数为集合的构造方法 3.指定长度的构造方法。
arraylist常用方法:
- add(index,object)在指定位置放入元素
- get(index)根据下标获取元素
- clear()清空集合、
- add(list)将集合放入集合是集合的拷贝而不是放引用
- remove之后立即缩容 容易出现数组下标越界
注意:遍历过程中不允许删除元素除非使用迭代器
3.linkedlist的使用
linklist是链表式存储,无序不重复,插入、删除时效率较高,主要方法包括Addfirst 、addlast、getfirst、getlast,上转型之后只能调用转型后对象的方法
4. Vector的使用
vector有索引,能够自动扩容缩容,扩容默认增长一倍,
与arraylist的区别:
实现原理相同,都是基于动态数组,很多情况下可互用
Arraylist:线程非安全的,重速度轻安全
Vector:线程安全
5.集合的遍历方式和泛型的使用
泛型:指定该集合只能存放某种类型的元素
list的遍历通过迭代器实现,通过list.Iterator()得到迭代器对象
Iterator it = list.Iterator();
While(it.hasnext){
Student stu = (Student)it.next();
}
注意:
- 在迭代的过程当中,索引会被自动维护,即如果当前对象被删除则迭代器后退
- 不能在next()之前iterator.Remove()
- 不能在迭代器遍历过程中调用集合的remove()
6.迭代器模式:
- 迭代器模式提供一种方法顺序访问一个聚合对象的各个元素而又不暴露该对象的内部结构。
- 通过Collection接口的iterator()方法 返回一个迭代器
- 实现了collection接口的所有集合都可以有一个指向自己的迭代器
- 所有实现了collection的集合都可以使用迭代器进行遍历
- 不同集合有不同iterator实现类
7.stack的使用
规则:先进后出 后进先出
Push压入 pop出 peek得到栈顶对象但不移除它
8.Hashset的使用
hashset是collection接口的完全实现,hashset无序不重复。
关于如何定义元素是否重复:
- 基本类型数据:值相同
- 引用类型数据:比较堆地址
- Hashcode equals tostring重写
Hashset在比较对象时会使用hashcode和equels方法
先比较hashcode再equels
- equels相等时,hashcode一定相等
- equels不等时,hashcode可能相等
- hashcode不等,equels一定不等
- hashcode相等,equels可能不等
重写equels时一定要重写hashcode 否则会违背上面4大原则
9.treeset的使用
有序不重复 ,使用元素的自然顺序 ,结构是基于红黑树
10.元素的比较
元素的比较通过实现comparable接口并重写compareTo方法来实现 即 implement comparable<Emp>
Treeset在做add存放元素时就要开始比较了
comparable<Emp>表示只能比较Emp类型的对象
实现comparator接口 重写compare方法
Set<Emp> set = new TreeSet<Emp>(new MyCpmpare)//将一把称交给集合
Comparable接口:元素自身具备比较的特性
Comparator接口:集合自身具备比较的特性
11.Hashmap的使用
常用方法:
放put 键不允许重复,如果重复,后面的会把前面的覆盖
得到get(key)
得到长度size()
得到键的集合map.keySet() 得到值的集合collection<> c = map.values()
entrySet()返回一个set集合 里面放entry对象 相当于将key和value放到一个对象里面
entry代表map中的映射关系 entry提供getKey和getValue方法
hashmap、treemap、hashtable的比较:
hashmap 哈希表 非线程安全 key允许null
treemap 红黑树 线程安全
hashtable 哈希表 非线程安全 key不允许null
12.集合的比较
数据结构
Arraylist 动态数组(遍历)
Linklist 链表(增、删)
Vector 动态数组 同步的 线程安全
Collections.binarySearch(要查找的集合,要查找的元素)
Arrays.asList(数组);将数组转换为一个List集合
System.currentTimeMillis得到系统时间
Arraylist:新容量=(旧容量*3)/2+1
Vector 翻倍增长
Hashmap 不同步,线程不安全
Hashtable 同步,线程安全,继承于dictionary
Hashmap
Hashset 基于hashmap实现 基于hashmap的键
13.集合工具类
Collections常用方法:
binarysearch二分查找默认 调用之前必须进行升序排序
Sort排序
Min/max
Reverse反转
Replaceall替换 Copy
aslist 将数组转换为列表
对于基本数据类型数组,整个数组转换成一个元素
对象数组中的元素转换成集合中的元素
14.泛型类
可以代表多种类型 泛型的本质是参数化类型
Class 类名<T> T在类中可以使用作为类型来用
真正使用类的对象的时候,可以给T赋值
类中T所出现的地方都变成了赋值的类型
15.泛型方法
使用了泛型的方法:在泛型类中的方法
Public <T> T test(T t){return t } 使用时值和类型一并赋值
16.泛型接口
接口继承多参数泛型
1.默认objec
2.实现接口时就确定类型是什么
3.使用时才确定 class 类名 <T> implements inter<T>{ }
多参数泛型类
例如:class Myclass<T,K>{ }
17.泛型限定
T type, K key, V value, E element, ? 不确定的Java类型
限定:泛型能够代表的类型被限定
默认可以接受泛型类型的子类
现在泛型的上限是fruit,所以现在泛型所等代表的只能是fruit类及其子类
集合中泛型限定的使用 集合中不能使用泛型上限
集合中泛型下限的使用
?extends T:上限:类型是T及其子类
?super T:下限:类型是T及其父类