集合
单列集合(collection)
List接口:
1.有序(插入)
2.可以重复
3.有下标
迭代器
迭代器创建:
通过集合.iterator();创建迭代器。
迭代器.hasnext();方法查找当前位置值是否存在
迭代器.next();查找到当前位置值是否存在,并将迭代器游标后移一位
;
迭代器迭代完成之后,迭代器的位置在最后一位。 所以迭代器只能迭代一次
ArrayList集合
List集合实际上就是在Collection接口的基础上增加了一些带下标索引的方法
[ArrayList其底层实现使用数组]
list.add(5,“熊大”);//集合指定位置添加元素
list.set(1, “可丽”);//修改指定下标位置上的元素
list.remove(0);//删除指定下标位置上的元素
list.get(4);//获取指定下标位置上的元素
list.indexOf(“ikun”);//查找元素所在的下标,不存在返回-1
遍历集合
* 1.通过迭代器遍历
* 2.通过for循环,和size()方法
* 3.通过增强for循环forech
* for(遍历类型 任意变量名:集合|数组){}
for (String e : list) {
System.out.println(e);
}
泛型
泛型:参数化类型 [JDK1.5之后]
泛型的作用实际上就是将类型转换
的检查提前
到了编译期
泛型擦除: [JDK1.7之后]
集合类型<泛型> 变量名 = new 集合类型<>();
LinkList集合
常用的方法与ArrayList一致。自己独有一些向首尾添加移除等方法(可以模拟对列、堆栈等数据结构)
//可以模拟队列结构(先进先出)
list.offer(“尾巴”);//在队列的尾部添加元素
list.peek();//获取队列头部元素(不删除)
list.poll();//获取队列头部元素(删除)
//可以模拟堆栈结构(先进后出)
list.push(“堆”);//向栈中添加元素(压栈)
list.pop();//从栈从取出元素(弹栈)
Set接口
1.无序(插入)
2.不可重复
3.无下标
HashSet类
特点:无序 (插入顺序),无下标,不可重复。
HashSet 去重原理:
HashSet确定对象是否重复,是先判断hashcode再判断equals,两者都相等则认为是相同对象则不会向HashSet中添加。可以通过重写hashcode和equals方法来改变内部判断。
LinkedHashSet类
特点:有序,无下标,不可重复 。
[与HashSet内的方法一致,去重原理一致]
底层维护了链表结构,实现有序存入。
TreeSet类
特点:无序(有字典顺序),无下标,不可重复。
[与HashSet内的方法一致,采用树的储存结构]
TreeSet类实现了Comparable接口,通过ComparTo方法(返回值为int类型)来对存储的元素进行比较。
1、排序: 返回值大于0升序,返回值小于0降序
2、去重(返回值为0)TreeSet
认为返回0,两个对象就是相同的对象
Collections工具类
Collections.reverse() 将集合中的元素反转
Collections.shuffle() 将集合中的元素随机打乱
Collections.sort() 将集合中的元素排序 (必须要实现Comparable接口)
ArrayList
、LinkedList
、Vector
的区别:
ArrayList和Vector底层使用数组实现(增删慢、查询快
)
ArrayList是当添加元素的时候,才会扩容数组,默认长度为10, Vector是当创建对象的是,就创建长度为10的数组
ArrayList线程不安全,效率高Vector是线程安全的
,效率低
LinkedList底层使用双向链表实现(增删快、查询慢
)
双列集合
定义:即集合中元素由两个部分组成(key-value)
键的特点:无序,无下标,不重复。
值的特点:无序,无下标,可重复。
HashMap集合
put方法:
一、通过传入的key值,调用hash(key)方法获取随机的hash值。
【第一次创建数组时会扩容16空间的数组】
二、通过获取的hash值与数组长度-1进行与(&)运算,获取一个下标值[这样获取的下标值比较随机,因为在hash(key)方法中会将通过key获取的值进行无符号右移(>>>)16位]
1)若下标所在的位置为null,则直接new一个新的node对象放入当前位置
2)若不为空,判断hash值和equals是否相等:
1.若相等则将之前的值覆盖【返回之前的Vaule值】
2.若不相等:(1)若数组所在位置为红黑树则将newnode对象添加到红黑树上。(2)若数组所在的位置为链表则将newnode对象添加到链表的尾部【这里的链表为单向链表,当链表长度大于8并且数组长度大于64时链表将被转换为红黑树进行储存】
返回值不为null时为oldValue
链表的长度大于8,数组的长度大于64将链表转换为红黑树