集合
集合的出现:数组能够保存多个对象,但是在某些情况下不确定保存对象的个数,所以就引入了集合。(数组长度不可变)
集合:集合时一系列特殊的类,可以存储任意类型的对象,并且长度可变,统称为集合。
按存储结构分为单列集合Collection和双列集合Map.这是两个接口。
List接口
List接口继承自Collection接口,将实现了List接口的对象称为 list集合,list集合中允许出现重复元素。特点:是线性存储,通过索引访问指定元素,元素有序,存入顺序和取出顺序一致。
Arraylist集合
Arraylist是list接口的一个实现类,内部封装了一个长度可变的数组对象。
Arraylist的底层是使用一个数组来保存元素,增加或删除指定位置的元素会创建新的数组,效率低下,不适合做删改操作。通过索引访问元素很快捷,适合。
Jdk提供了一个Vector集合,它是List接口的实现类,用法和Arraylist完全相同,区别是Vector集合是线程安全的,Arraylist线程不安全。
Linkedlist集合
为了克服Arraylist集合删改效率低的问题,可以使用Linkedlist。集合内部维护了一个双向的循环链表,链表中的元素通过引用的方式连接前一个和后一个元素。
Iterator接口
为了遍历集合中的元素,jdk提供的接口。它同属于集合框架,和Collection、Map一个层级,但Collection、Map主要用于存储元素,而Iterator主要用于迭代访问Collection中的元素。
Iterator对象被称为迭代器。
注意:在使用Iterator迭代器对集合中的元素进行迭代时,如果调用了集合对象的Remove()方法删除元素,会报并发修改异常ConcurrentmodificationException。原因是集合中删除了元素导致迭代器预期的迭代次数发生改变,导致迭代结果不准确。
解决方式:用迭代器本身的remove()方法即可
Listerator接口
Iterator迭代器hasNext()和next()方法,实现集合中元素的迭代,迭代方向是从集合中的第一个元素向最后一个元素迭代,是正向迭代。Listerator中提供了hasPrevious()和previous()方法,实现反向迭代,还提供了add()方法来增加元素。
同样,遍历元素的时候如果想增加元素,只能用Listerator提供的add()方法,否则会报并发修改异常。Listerator迭代器只能用于list集合。
增强for循环和普通for循环的区别
①书写简洁
②自动遍历容器中每个元素
③只能访问容器中的元素,不能修改
set接口
Set接口中元素无序,不允许重复。
Set接口主要有两个实现类,Hashset和Treeset。
Hashset集合
Hashset集合保证不出现重复元素的原因:当HashSet集合的add() 。存入元素时,首先调用当前存入对象的hashCode()方法获取对象的哈希值,然后根据对象的哈希值计算出一个存储 位置,如果没有元素则直接存入,如果该位置有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,返回false就将元素存入集合,true说明有重复元素,将该元素舍弃。
Treeset集合
Treeset集合内部采用自平衡的排序二叉树(存储的元素会按照大小排序,并能去除重复元素)来存储元素,这样的结构可以保证Treeset集合中没有重复的元素,并且可以对元素进行排序。
元素能够排序的原因:元素每次向Treeset集合中存入一个元素时,就会将该元素与其他元素进行比较,最后将它插入到有序的对象序列中。集合中的元素在进行比较时自动调用compareTo()方法,该方法是Comparable接口中定义的,要想对集合中的元素排序,必须实现Comparable接口。
Map接口
Map接口是一种双列集合,每个元素都包含一个键值对,键和值对象之间存在一种对应关系称为映射。
hashmap集合
hashMap集合是Map接口的一个实现类,用于存储键值映射关系,不能出现重复的键。
Map集合遍历方式
①首先调用Map对象的keySet()方法,获取存储Map中所有键的Set集合,然后通过Iterator迭代Set集合的每一个元素,最后通过调用get(String key)方法,根据键获取对应的值。
②首先调用Map对象的entrySet()方法获得存储在Map中所有映射的Set集合,这个集合中存放了Map.Entry类型的元素,每个Map.Entry对象代表Map中的一个键值对,然后迭代Set集合,获得每一个映射对象,分别调用映射对象的getKey()和getValue()方法获取键和值。
LinkedHashMap
HashMap集合迭代出来元素的顺序和存入的顺序不一样,如果想让顺序一致,可以使用LinkedHashMap类。
TreeMap集合
TreeMap集合是用来存储键值映射关系的,不允许出现重复的键。TreeMap是通过二叉树的原理来保证键的唯一性。
Properties集合
Properties主要用来存储字符串类型的键和值,在开发中,经常使用Properties集合来存取应用的配置项。