一、集合框架的概述
1.集合和数组都是对多个数据进行存储的,简称JAVA容器
2,Java的集合可以分为Collection和Map两种体系
两个都是接口
Collection接口:单列数据,定义了存取一组对象的方法集合
有分:List:元素有序可重复、---》动态数组
Set元素无序不可重复的集合 --->高中讲的集合
Map接口:双列数据,保存具有映射关系
就丫的是“key-value”
HashMap、LinkedHashMap、TreeMap、Hashtable、Properties;
Collenction中方法
//在向Collection接口的实现类的对象中添加数据obj时,要求obj所在类重写equals方法,不然很多功能都是通过equals方法来进行比较的
1.a.add(x):将元素e添加,注意是元素
2.b.addAll(a):用于将一个集合中所有元素添加到另一个集合中。
3.isEmpty(a):阿巴阿爸
4.b.equals(a):用于比较两个集合
//注意ArrayList是有序集合,当里面元素顺序不一样的时候返回false
5.a.remove(“xxx”):用于删除元素
6.a.removeAll(b):类似于差集,把集合b中有a也有的全删了
7.size:元素个数
8.clear:清空结合
9.a.contains(obj):通过元素的equals方法来判断是否是同一个对象
//集合里面没有基本数据类型,所以123其实是自动装箱成为了包装类,所以当我们建立自定义类却没有重写equals方法的时候此方法就会出现些问题
10.a.containsAll(b):也是调用equals方法将两个集合的每一个元素挨个比较
11.toArray、与asList
Object【】 a=b.toArray()
实现Collection与数组的转换,注意在使用asList的时候要保证
a=Array.asList()里面是引用型数据而非基本数据类型,不然会识别为一个
迭代器(iterator)
迭代器就是为了容器而生的,就是将容器的东西一个个再给你获取
使用方法
创建迭代器
Iterator iterator = 容器.iterator()
while(iterator.hasNext()){
iterator.next();
}
迭代器的遍历使用过游标进行的,每次集合对象调用迭代器都会产生一个新的迭代对象并将游标还原为初始位置
List接口:
List接口下面有三个实现类
ArrayList,LinkedList,Vector
三者的异同点:
同:都实现了List接口所以都是有序可重复的
异:ArrayList与LinkedList相对于Vector线程安全性低,执行速度快
ArrayList与LinkedList底层实现的接口不同,ArrayList与Vector的底层是基于数组的,而LInked是双向链表,所以它更方便频繁的增删改查。
ArrayList与Vector的扩容区别:ArrayList每次扩容请求的是元空间的1.5倍Vector为2倍,Vector作为一种古老的模式其开销主要来源于它的强制同步
而现在同步完全可以由程序员自己来控制
ArrayList的源码分析:
jdk7:当创建出来ArrayList对象的时候,如果是默认没有传参会自动创建【10】Object数组,
当向里面添加数据超过是10个之后会自动进行扩容(原数组的1.5倍)后向旧数组的数据放到新数据组中
jdk8:在new 对象的时候,如果默认没有传参,只会进行声明为Object数组,而不会分配容量,当第一次往里面添加是会自动分配【10】容量。
List接口方法:
增:add(Object b)
删:remove(int a),remove(Object) b
改:set(int index,Object b)
查:get(int a)
插:add(int i,Object b)
Set接口的框架:
Collection接口:单列集合,用于存储一个一个的对象
set接口:存储无序的,不可重复的数据(类似高中集合)
HashSet:作为一个set接口的主要实现类:线程不安全,可以存放null值
linkedHashSet:作为HashSet的子类,遍历其内部数据时,可以按照添加的顺序去遍历,主要这不是有序
TreeSet:可以按照添加对象的指定属性,进行排序
set接口:
一、特性
无序性:指的是数据的存储不按照数组,而是采用哈希值的方式进行
不可重复:指的是数据通过equals的比较
二、添加元素的过程:以HashSet为例
我们向HashSet中添加元素a,首先调用元素a所在类的Hashcode()方法,计算元素a的哈希值,然后去查看HashSet底层数组中的存放位置,判断数组此位置上是否已经有元素:
如果此位置上没有其他元素,则元素a添加成功
如果此位置上有其他元素b(或存在以链表形式存在的多个元素),则比较元素a和元素b的hash值是否相同:不同添加a,
如果hash值相同,则开始调用元素a所在类的equlas()方法
TreeSet:能进行排序
TreeSet里面的值必须为同一个类型,对于自定义类可以自定义Hashcode方法与Tocomparated比较方法。
HashSet复习题:鸭皮的这题是真的狗也是真的经典
public void test6(){
HashSet set = new HashSet();
Person p1 = new Person(1001, "AA");
Person p2 = new Person(1002, "BB");
set.add(p1) ;
set.add(p2);
System.out.print(set);
System.out.println();
p1.name="cc";
// set.remove(p1);
// System.out.println(set);
set.add(new Person(1001,"cc"));
System.out.println(set);
set.add(new Person(1001,"AA"));
System.out.println(set);
}
出了点小问题:按理说HashSet里面当将p1.name的值改变之后,在进行删除的时候是按照改变值去运算哈希值,那么久不可能找到原值运算出来的Hash值,也就没有什么删除可言,但...居然喵的真给删除了
增添数据,时候也是一样上面虽然是改变了值但其位置仍然是原先Hash值得位置。
Map
Map的实现类
Map简述
Map与Collection并列存在。用于保存具有映射关系的数据:key-value
Map 中的 key 和 value 都可以是任何引用类型的数据
Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法
常用String类作为Map的“键”
key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value
Map接口的常用实现类:HashMap、TreeMap、LinkedHashMap和Properties。其中,HashMap是 Map 接口使用频率最高的实现类
Map是有序的
HashMap底层实现原理:
jdk7之前数组+链表
jdk7之后数组+链表+红黑树