泛型:需要定义一个类,可以接收所有的数据类型,使用object可以达到要求,泛型只允许设置引用数据类型,如果要定义基本数据类型则可以使用基本数据类型的包装类完成,进行引用传递的时候,如果设置泛型则只能接收泛型设置的类型,但是这样做方法意义很受局限,如果不设置泛型,接收到的内容可以被随意修改,容易发生安全问题,对于以上问题解决,可以使用泛型通配符来完成, <?> 代表可以接收任意类型,但是不能任意修改
Collection接口
下面的子接口 List Set 的实现子类
List接口: ArrayList LinkedList
Set接口: TreeSet HashSet TreeSet 有序的 HashSet无序
ArryList 有序的 ,可重复的, 顺序为增加的时候的顺序
Set 无序的 不可重复的 TreeSet 通过实现Comparable接口可对属性进行排序
Map接口
Map同样为接口,接口不能直接使用,必须通过实现类完成使用,在Map存在如下的实现类:
HashMap TreeMap LinkedHashMap
HashMap也是最常见的子类,它的特点为:无序存储
HashMap 底层是哈希表数据结构,线程不同步不安全,代替了hashtable,可以存null键值
Hashtable :主要和HashMap对比,古董类.哈希表数据结构,线程同步安全,不可以存储null键和值
LinkedHashMap:继承了HashMap,同样实现Map接口,可以有序的(类似ArratList的)存放数据
TreeMap:底层二叉树结构,可以对map集合的键进行指定顺序的排序,按照key进行排序,进行排序的时候必须配合comparable接口使用
Vector 和 ArrayList的区别 ?
线程安全 Vector 效率低 遍历: Enumeration
非线程安全 ArrayList 效率高 ListIterator
Map集合:不是Collection接口的子接口 自己独立的接口就是Map
TreeMap HashMap HashTable LinkedHashMap
HashMap HashTable的区别?
线程安全 HashTable key或者 value 不允许为null
非线程安全 HashMap key或者 value允许为null
TreeMap 可以按照key进行排序 ,必须实现Comparable接口
LinkedHashMap 可以顺序存储 ,顺序为存放的顺序
Map的特点: 是以键 值 对 存储的 ,Key 唯一的 不能重复的 value是可以重复的
集合的输出:
Iterator 迭代输出(推荐使用)
Foreach 增强for循环
ListIterator 双向迭代(了解即可) 只能在List接口中使用
Enumeration 枚举输出 只能用在Vector类中(了解)
1.什么是集合框架:集合框架就是用于存储数据的容器
特点:对象封装数据,对象多了也需要存储,结合用于存储对象,但是对象个数确定的时候可以用数组,不确定就用可变长度的集合
集合只能存储引用数据类型,存储的对象可以是不同的数据类型
2.数据结构:容器中存储数据的方式,集合容器在不断向上抽取过程中形成了集合体系
3.Java.util Collection接口:
子接口为List 和Set
List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引,元素可以重复
Set: 无序 (存入和取出顺序可能不一致),不可以存取重复元素,必须保证元素唯一性
方法:
添加 :add(Object) addAll(collection)添加一个集合中所有元素
删除: clear(); remove() 注意:删除成功集合的长度会改变 removeAll()
判断:boolean contains(obj) 集合中是否包含某指定的元素 boolean isEmpty()
获取:int size()集合中有几个元素
获取集合中全部的元素: Iterator iterator()迭代器
将集合变成数组:toArray()
iterator接口 : Iterator it = coll.iterator()//获取容器中迭代对象
将容器内部取出方法按照一个统一的规则向外提供形成的接口
boolean hasNext()如果仍有元素可以迭代,则返回true
for(Iterator it = coll.iterator();it.hasNext(); ){
System.out.println(it.next())
4.List: 有序, 元素有索引,元素可以重复
ArrayList:底层数据结构为数组,线程不同步,查询速度快
LinkedList:底层数据结构为链表,线程不同步 ,增删元素速度块
Vector:底层数据结构为数组,线程同步,查询增删都慢,已被Arraylist替代
方法:add(index,element) remove(index)
Object get(index)获取指定索引元素
List sublist(start,end)获取子列表
int indexOf(obj) :获取指定元素第一次出现的索引位,如果该元素不存在返回-1;所以,通过-1,可以判断一个元素是否存在
修改:Object set(index,element) :对指定索引位进行元素的修改
获取所有元素:
ListIterator listIterator():list 集合特有的迭代器。
LinkedList特别的方法:addFirst() addLast() removeFirst
pollFirst();获取链表中的第一个元素,但是会删除链表中的第一个元素
peekFirst();获取链表中的第一个元素。如果链表为空,返回 null。
可变长度数组的原理:当元素超出数组长度,会产生一个新的数组,将原数组的数据复制到新数组之中,再将新的元素添加到新数组中 arraylist元素住50%延长,初始容量10,vector按照原数组100%延长
5.Set接口:方法和Collection中一致,但是set接口取出只能用迭代器
HashSet:底层数据结构哈希表,线程不同步,无序,高效 ,子类LinkedHashSet:有序
TreeSet:对Set集合中元素进行制定顺序排序,不同步,底层是二叉树
TreeSet集合排序的两种方式Comparable和Comparator
1:让元素自身具备比较性,需要元素对象实现 Comparable 接口,覆盖compareTo 方法。
2:让集合自身具备比较性,需要定义一个实现了 Comparator 接口的比较器,并覆盖 compare 方法,并将该类对象作为实际参数传递给 TreeSet 集合的构造函数。第二种方式较为灵
保证元素唯一性:通过元素的hashcode方法和equals方法完成的,hashcode值相同去判断equals
6
put方法的返回值,反回的是map中存在相同key的原始数据,如果map中没有相同的key则反回null 如果存在相同的key反回的内容会第一次key的value
Map集合存储和Collection不同:
Collection一次存储一个元素,Map一次存储一对
Collection 是单列集合;Map 是双列集合。Map 中的存储的一对元素:一个是键,一个是值,键与值之间有对应(映射)关系。特点:要保证 map 集合中键的唯一
方法: put(key,value)当存储的键相同时,新的值会替换老的值,并将老值返回,没有键重复,返回null
remove() boolean cintainsKey() containsvalueValue()
取出 int size() 返回长度 value get(key)
获取Map中的所有元素:
Map 没有迭代器,将Map转化为具有迭代器的set集合.,之所以转成set,是因为Map具备键值唯一性,set集合底层用的就是map的方法
取出 map 集合中所有元素的方式:entrySet()方法。
Set entrySet = map.entrySet();
Iterator it = entrySet.iterator();
while(it.hasNext()) {
Map.Entry me = (Map.Entry)it.next();
System.out.println(me.getKey()+"::::"+me.getValue()
使用集合的技巧:
看到Array就是数组结构,有角标,查询速度很快
看到link就是链表结构 增删快,而且特有的方法 addFirst() removeFirst() getFirst()......
看到hash就是哈希表,就想到哈希值,就想到唯一性,就想到存入该结构的元素必须覆盖hashCode,equals方法
看到tree就是二叉树,就要想到排序,就要想到用到比较
两种比较方式
comparable:覆盖了compareTo方法
comparator:覆盖compare方法
LinkedHashSet LinkedHashMap这两个集合保证存入顺序和取出顺序一致,保证哈希表有序
什么时候使用集合:
存储的是一个元素就用Colection 存储对象存在映射关系时就是用Map集合
保证唯一性就用Set 不保证唯一就用List
将集合变成数组好处:限定了对集合中的元素进行增删操作,只要获取这些元素即可
增强 for 循环:foreach 语句,foreach 简化了迭代器。
格式:// 增强 for 循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭
代的容器
for( 元素类型 变量名 : Collection 集合 & 数组 ) { …
}
高级 for 循环在使用时,必须要明确被遍历的目标
TreeSet是可以实现排序的,但是前提是排序的类必须实现Comparable接口(排序)重写comparto方法(去重),只有实现了此接口才能确认出对象的大小TreeSet是通过comparable接口里面comparTo方法是否反回0来确认重复元素的存在
HashSet它的重复元素是依靠HashCode 以及equals方法来确认重复元素的
Map.Entry接口
虽然现在已经清楚了Map的基本的操作,但是还要清楚Map的数据到底是如何存储的,
通过观察源码发现Map都被封装在Map.Entry里面,在Map接口里面静态方法 public static Map.Entry
在这个Map.Enrty 是一个接口,在这个接口里面存在两个重要的操作方法
获取Key public K getKey();
获取Value public V getValue();
在map集合里面,map.enrty的主要作用就是把key 和value进行包装使用
使用Iterator遍历Map
1利用Map中提供的entrySet把Map变为Set集合
2 利用Set接口中Iterator 方法Set集合变为Iterator迭代
3 利用Iterator 迭代输出每一组map.entry ,通过getKey 和 getValue
//1 通过map中的entrySet 把一个map变为set集合
Set<Map.Entry<String, Integer>> set=map.entrySet();
//2 通过Set接口中Iterator方法把set变为iteratro迭代
Iterator<Map.Entry<String, Integer>> iter=set.iterator();
while(iter.hasNext()) {
//3 迭代map.entry
Map.Entry<String, Integer> me=iter.next();
//分别输出key 和 value 通过getKey 和 getValue
System.out.println(me.getKey());
System.out.println(me.getValue());
}