集合:是数据存储的容器;长度可变,存放的是对象的引用(哈希值,即地址值),并非实际的基本数据类型;
一、Collection接口
是集合类的根接口,java中没有提供这个接口的直接实现类,但是却让其被继承产生了两个接口Set和List。
Set中不能包含重复的元素;(无序,不重复)
List是一个有序的集合,可包含重复元素,提供按索引访问方式(有序、可重复)
存放有序对象,可重复;List关注索引,查询速度快,因为往list集合里插入或删除,伴随着后面数据的移动,所以插入删除速度较慢。
collection方法:
1、增
boolean add(Object o);
boolean addAll(Collection<?> c);
2、删
void clear(Object o);
boolean remove(Object o);
boolean romoveAll(Collection<?> c);
3、判断
boolean contains(Object o);
boolean containsAll(Collection<?> c);
4、迭代器
Iterator<E> iterator();
5、交集
boolean retainAll(Collection<?> c);//交集元素相对于集合元素是否发生改变
6、查看
int size(Object o);//集合元素的个数
7、转化
Object[] toArray(Object o);//将集合转为字符串
List方法:
1、void add(int index,E element)角标
2、boolean addAll(int index,Collection c)
3、E get(int index)//根据角标获取值
4、int indexOf(Object o)//第一次出现的
5、int lastIndexOf()
6、ListIterator<E> listIterator() //
7、List<E> subList(index,end);截取
8、E set(index,E);//替换
9、E remove();//返回集合元素
集合遍历:
Collection coll = new ArrayList();
coll.add(123);
coll.add(12.3);
coll.add("你好");
1、以字符串直接输出
System.out.println(coll);
2、转为数组
Object obj = coll.toArray();
for(Object o:obj){
Student stu = (Student)o;
System.out.println(stu.name);
}
3、迭代器遍历
a)Iterator:迭代输出
b)ListIterator:Iterator是子接口,专门用于List内容输出。
Iterator it = coll.iterator();
while(it.hasNext()){
Object o = it.next();
System.out.println(o);
}
二、Map接口
与collection接口没有关系,相互独立。Map包含key-value对。Map只能有唯一的key,但可以包含相同的value。
HashMap是常用的Map,根据key键的Hashcode存储数据,根据key可以直接获取它的值(value=get(key)),具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。因为键对象不可重复,所以HashMap最多只允许一条键Null,是非线程同步。
Hashtable是hashMap的线程安全版,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable写入比较慢,不允许记录null。
LinkHashMap保存记录的插入顺序,比HashMap慢,有HashMap全部特性。
TreeMap实现SortMap接口,能够把它保存的记录根据键排序(自然顺序),也可以指定排序的比较器。不允许key为空,非线程同步。
Map方法:
1 增 :V put(K key,V value)将值和键关联
2 判断:boolean containsKey(Object key)
3 boolean containsValue(Object Value)
4 视图:Set<Map.Entry<K,V>> entrySet() 返回键值对set视图
Set<K> keySet() 返回键的set视图
Collection<V> values() 返回value值的collection视图
5 查看:int size() 查看集合里键值对数量
6 获取:V get(key) 从key获取value值
比较
Vector和ArrayList:
1、vector是线程同步的,而ArrayList是线程异步,不考虑线程,ArrayList效率高。
2、如果集合中元素数目大于目前集合数组的长度,vector增长率为目前数组100%,
而ArrayList增长率为目前数组长度的50%,如果在集合中使用数据量比较大的数据,用vector有优势。
3、如果查找一个指定位置数据,两者使用时间是相同,如果频繁访问数据,这两个都可以。
而如果移动一个指定位置会导致后面元素都发生移动,要考虑linklist。
ArrayList和LinkedList
1、ArrayList是实现基于动态数组的数据结构,LinkedList基于链表的数据结构。
2、对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
HashMap与TreMap
1、HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着
某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
2、在Map中插入、删除定位元素,hashmap是最好的选择。但如果您要按照自然顺序和自定义
顺序TreeMap是最好的选择。使用HashMap要求添加的键类明确定义hashcode()和equals()的实现。
两个map中元素一样,顺序不一样,导致hashcode()不一样。
三、迭代器
所有的集合类都实现了Iterator接口,这是遍历集合中元素的接口,主要包含方法:
1、hasNext()是否还有下一个元素
2、next()返回下一个元素
3、remove()删除当前元素
四、工具类
collections :是操作collection的工具类
方法:
1、二分查找,在list集合里查找对象
int binarySearch(list,Object);
2、反转集合元素
void reverse(List )
3、重新排序:将list集合顺序打散
void shuffle(List)
4、排序:将list集合元素按照自然顺序进行排序
sort(List)
泛型
在一个集合里全部存储字符串,遍历打印
* 假使,不小心存入一个int类型的数据–运行时会出现强制转化错误!
泛型:<类型>—规定只能存储指定类型
1、将运行时的错误提前到编译时发现
2、规定集合里存储的字符串
3、在自定义类中使用
4、方法上 修饰符<类> 返回值类型 方法名
泛型里的类型不能是基本数据类型,需要的是基本数据类型的包装类integer
5、接口上
interface 接口名<类型>