容器的基本概念
Collection函数库是util包下的一些接口和类,类用来产生对象存放数据,接口是访问数据的方式。
List有序可重复,Set无序不可重复,Map是键值对
。
List类
List list = new ArrayList();add();size();isEmpty();remove();set();get();
ArrayList
底层实现是数组,线程不安全,效率高,查询快,增删改慢;LinkedList
底层实现是链表,线程不安全,效率高,增删改快,查询慢;Vector
线程安全,效率低。
源码中查找元素使用了二分法提升效率。
实现ArrayList
实现ArrayList需要定义Object数组变量装对象,size表示容量;定义无参和有参构造器便于初始化;数组扩容问题:重定义size并拷贝元素到新数组;数组扩容用于添加add方法之中判断;get()要判断index是否越界;remove(int index)用arraycopy改变索引位置;remove(Object o)底层用equals判断;set()修改元素并返回值。
实现LinkedList
先定义一个节点类,有指向前,后,和装元素的属性,提供访问和改变方法;主类中应该有first,last,size域;add()添加元素应该判断链表头是否为空;get(int index)以first开始遍历至index返回Node.obj;remove(int index)是把后一个前指针指向前一个的后指针;add(int index,Object o)把新元素的前指针指向上一个元素的后指针,新元素的后指针指向旧元素的前指针。
Map和HashMap的基本用法
Map类中存储的键值对通过键来标识,键值不能重复
。
put(k,v)
:存放对象;get(k)
:通过k得到v;remove(Object k);containsKey(k);containsValue(v);int size();boolean isEmpty();clear();void putAll(Map m);
HashMap和HashTable的区别在于后者线程安全,效率低。
实现HashMap
要另外定义一个类存放key和value属性;以类对象数组存放键值对;取元素key或value循环判断得到结果;判断键重复时覆盖值;
利用hashcode取余提高查询效率。
Map底层实现:数组+链表
(数组存放链表,链表存放键值对)。
Map中使用hashcode出现负数:
hash = hash<0?-hash:hash;
int a = hash%arr.length;
equals和hashcode
Java中规定:两个内容相同的对象(即equals为true)应该具有相同的hashcode值,反之则不然。
数据的存储
1.利用JavaBean+构造器->创建实例填充数据->用容器List装载实例进行容器操作数据。
2.用Map装载字段名和记录->用List装载Map对象->利用Map的特性访问数据。
3.一个表对应一个类,一个字段对应一个属性
。
Set和HashSet
Set的不可重复是利用了Map的键元素不可重复!
迭代器遍历List和Set
所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
Iterator对象称作迭代器,实现了对容器类元素的遍历操作。
boolean hasNext();Object next();void remove();
<--在执行完next之后该操作只能执行一次。