一、集合和数组概念
在Java中,数组是存储某一类型的数据的容器,但是这个容器有局限性,因为定义后的数组长度不可变,超出长度后,再存放数据就会报错(例如:数组下标越界)。而且数组只能存放基本数据类型和对象
在开发过程中,大多时候数据长度是不确定的,这就需要有不定长的容器来存放数据,这就涉及到集合Collection,Java 中的集合Collection都采用了泛型实现,可以存入任何类型的对象数据,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。它以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,从而大大提高了软件的开发效率
二、集合分类
Java的集合类主要由两个接口派生而出: Collection和Map, Collection和Map是Java 集合框架的根接口,这两个接口又包含了一些子接口或实现类。
Java集合框架是一个用来代表和操纵集合的统一架构,包含如下内容:
接口:代表集合的抽象数据类型。例如: Collection、List、Set、Map 等。定义多个接口,便于以不同的方式操作集合对象
实现(类):接口的具体实现。例如:ArrayList、LinkedList、HashSet、HashMap。
算法:实现接口的对象里的方法中执行的计算,例如:Collections 工具类提供了对集合进行排序,遍历等多种算法实现。
Collection接口下有三个子接口,List,Queue,Set及最常用的三个类,ArrayList,LinkedList,HashSet。
Map接口下最常用的是HashMap。
1、Collection接口
Collection 是最基本的集合接口,是单列集合的顶层父类,一个独立元素的序列。一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。Collection 接口存储一组不唯一,无序的对象。
1)List集合是一个有序的队列,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,允许有相同的元素。List 接口存储一组不唯一,有序(插入顺序)的对象。
List的实现类有LinkedList、ArrayList、Vector、Stack。
2)Set集合是一个不允许有重复元素的集合。存储一组唯一,无序的对象。
Set的实现类有HashSet、TreeSet。
HashSet依赖于HashMap,他实际上是通过HashMap实现的;
TreeSet依赖 于TreeMap,他实际是通过TreeMap实现的。
2、Map接口
是双列集合的顶层父类接口,是一个映射接口,即key-Value键值对。允许使用键来查找对应的值,从某种意义上来说,他将数字和对象关联在一起。Map中的每一个元素包含"key"和"key对应的value"。
1)Map.Entry:描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。
Entry将键值对的对应关系封装成了对象。
即键值对对象,在遍历Map集合时,可以从每一个键值对(Entry)对象中获取对应的键与对应的值。
相关方法
getKey()方法:获取Entry对象中的键
getValue()方法:获取Entry对象中的值
entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。
2)Map的实现类有:HashMap ,TreeMap。LinkedHashMap 继承自 HashMap 。
3、迭代器Iterator
1)Iterator通常被称为轻量级对象,创建它的代价很小,它是遍历集合的工具,通常通过Iterator迭代器来遍历集合。Collection依赖于Iterator,Collection的实现类都要实现iterator()函数,返回一个Iterator对象。
三、List接口
- ArrayList介绍
ArrayList是一个数组队列,也是一个动态数组,底层是Object数组,容量是自增长的,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点。它继承与AbstractList。
ArrayList线程是非安全的,一般使用在单线程的情况下。要保证同步,可以使用:List list = Collections.synchronizedList(new ArrayList());
进行包装,默认容量为10.
ArrayList可以有null值
ArrayList集合特点:底层采用的是数组结构
ArrayList al=new ArrayList();//创建了一个长度为0的Object类型数组
al.add("abc");//底层会创建一个长度为10的Object数组 Object[] obj=new Object[10]
//obj[0]="abc"
//如果添加的元素的超过10个,底层会开辟一个1.5*10的长度的新数组
//把原数组中的元素拷贝到新数组,再把最后一个元素添加到新数组中
原数组:
a b c d e f g h k l
添加m:
a b c d e f g h k l m null null null null
常用方法:add
,addAll
,remove
,indexOf
,subList
,contains
,isEmpty
…
- LinkedList介绍
LinkedList 是一个继承于AbstractSequentialList的双向链表。实现了List、Deque、Cloneable、Java.io.serializable接口,它也可以被当作堆栈、队列或双端队列进行操作,。
LinkedList 是非线程安全的,集合中的元素允许为空,保存的元素为有序的,实现了List接口,则允许集合中的元素是可以重复的。经常用在增删操作较多而查询操作很少的情况下。
1)LinkedList中定义了两个属性
size:LinkedList对象中存储的元素个数。
header:LinkedList是基于链表实现的&#