Java集合类
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。
1、Iterator接口
Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能从前往后遍历,被遍历后的元素不会再遍历到,通常无序集合实现的都是这个接口,比如HashSet,HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,比如ArrayList。
2、Collection (集合的最大接口)继承关系
add方法的参数类型是Object。以便于接收任意类型对象。
集合中存储的都是对象的引用(地址)。
3、List接口
——List 可以存放重复的内容
——ArrayList 线程不安全,查询速度快
——Vector 线程安全,但速度慢,已被ArrayList替代
——LinkedList 链表结果,增删速度快
4、Set接口
Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
——HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的hashCode值相同,才会判断equals是否为true。
如果元素的hashCode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
——TreeSet:二叉排序树
有序的存放:TreeSet 线程不安全,可以对Set集合中的元素进行排序
通过compareTo或者compare方法来保证元素的唯一性,元素以二叉树的形式存放。
5、Map接口
Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性
——HashMap:底层是数组+链表+红黑树,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代。
——TreeMap:底层是二叉排序树数据结构。线程不同步。可以用于给map集合中的键进行排序。
6、集合的遍历
——4种常见的输出方式
——Iterator: 迭代输出,使用最多的输出方式
——ListIterator: Iterator的子接口,专门用于输出List中的内容
——Enumeration
——foreach
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModificationException异常。所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的listIterator方法获取。
7、集合、数组之间的转化
集合转数组:
List<String> list=new ArrayList<String>();
list.add("1");
...
String[] array = new String[list.size()];
list.toArray(array);//等价于list.toArray(new String[list.size()]);
数组转集合:
String[] array = new String[] {"zhu", "wen", "tao"};
// String数组转List集合
List<String> mlist = Arrays.asList(array);
8、Integer
Integer常用的 方法
valueOf(int i):将int型的参数转化为Integer型的
valueOf(String s):将String类型参数转化为Integer类型的
parseInt(String s):将String类型参数转化为int类型的十进制
intValue():将integer类型的值转为int类型