java学习day08

集合概述

什么是集合?有什么用

  集合实际上就是一个容器,可以用来容纳其他类型的数据,集合不能直接存储基本

数据类型,集合当中存储的都是java对象的内存地址,实际上集合也是一个java对象,

java中每个不同的集合,底层会对应不同的数据结构,往不同的集合中存储元素,等于就

将数据放到不同的数据结构中

所有的集合类和集合接口都在java.util包下

java的集合中分为两大类:

  一类是单个方式存储元素,这类集合的超级父接口是java.util.Collection

  一类是以键值对的方式存储元素,这类集合的超级父接口是java.util.Map

List和Set接口集合

java学习day08

 

 Map接口集合

java学习day08

 

 

 

Collection接口

Collection接口中的常用方法

boolean add(Object e):向集合添加元素

int size():获取集合中元素的个数

void clear():清空集合的个数

boolean contains(Object o):判断集合中是否包含某元素

boolean remove(Object o):删除集合中的某个元素

boolean isEmpty():判断集合是否为空

Object[] toArray():将集合转换成数组

iterator():返回集合的迭代器,用于遍历集合中的对象

 

public class Test{
    public static void main(String[] args) {
        Collection c = new ArrayList();
        for (int i = 0; i < 10; i++) {
            c.add(i);//添加元素
        }
        System.out.println(c.size());//获得元素个数
        System.out.println(c.contains(0));//判断是否包含某个元素
        System.out.println(c.remove(0));//删除某个元素
        System.out.println(c.isEmpty());//判断集合是否为空
        Iterator it = c.iterator();//获得集合器
        while (it.hasNext()){//遍历元素
            System.out.println(it.next());
        }
        Object[] o = c.toArray();
        for (Object a:o) {
            System.out.println(o);
        }
    }
}

Iterator迭代器

hasNext():判断是否还有下一个元素

next():返回下一个元素

迭代器一开始并没有指向任何一个元素

集合只要发生改变迭代器就需要重新获取,使用迭代器就像是快照一样,记录某个时段

集合的元素然后迭代,在迭代集合元素过程中,不能调用集合对象的remove()方法进行删除

元素,要使用迭代器的remove()方法进行删除

为什么?

  因为迭代器就相当于拍快照,迭代器在进行迭代的时候会将拍到的快照与正在进行

  迭代的集合进行比较,如果用集合对象的remove()方法删除元素,会导致快照内容和正

  在进行迭代的集合不相等,会产生异常,而使用迭代器里边的remove()方法进行删除

  会把快照的内容也删除

List接口

List类型集合存储元素特点:

  有序可重复,存储的元素有下标。有序实际上说的是存进去是这个顺序,取出来还是这个顺序

  这里的顺序不是按照大小排序,每个List集合的元素都有下标,下标从0开始,以1递增

List接口有三个实现类,分别是ArrayList、LinkedList和Vector

List接口常用方法

  void add(int index,E element):在列表指定位置插入元素(第一个参数是下标)效率低

  E get(int index):根据下标获取元素

  int indexOf(Object o):获取指定元素第一次出现处的索引

  E remove(int index):删除指定下标位置的元素

  E set(int index,E element):修改指定位置的元素

public class Test{
    public static void main(String[] args) {
        List l = new ArrayList();//创建List类型集合
        for (int i = 0; i < 10; i++) {
            l.add(i,i);//向集合添加元素
        }
        System.out.println(l.get(0));//获得下标为0的元素
        System.out.println(l.indexOf(5));//获得元素5第一次出现的索引
        l.remove(5);//删除指定下标的元素
        l.set(3,99);//修改指定位置的元素
        Iterator it = l.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

ArrayList集合

ArrayList集合特点:

  1、ArrayList集合底层采用了线性表这种数据结构,ArrayList集合是非线程安全的

  2、ArrayList集合初始化容量是10,当超过初始化容量后会自动扩容,扩容为原容量的1.5倍

  3、ArrayList集合底层是Object类型的数组Object[]

优化策略

  建议给定一个预估计的初始化容量,减少数组的扩容次数

数组这种数据结构的优缺点:

  优点:检索效率比较高

  缺点:随机增删元素效率比较低

但是需要注意的是:向数组末尾添加元素,效率还是很高的

LinkedList集合

LinkedList集合特点:

  1、LinkedList集合底层采用了双向链表数据结构

  2、对于链表数据结构来说,随机增删效率较高,检索效率较低

  3、链表中的元素在空间存储上内存地址不连续

Vector集合

Vector集合特点:

  Vector集合底层采用了数组这种数据结构,Vector所有的方法都有synchronized关键字

  修饰,是线程安全的,但是效率较低,现在保证线程安全有别的方案,所有Vector使用较少

Set接口

set类型集合存储元素特点:

  无序不可重复,无序表示存进去是这个顺序,取出来就不一定是这个顺序了,元素没有下标

set常用方法

  add(E e):若指定元素不存在,则将其添加到集合中

  clear():将集合清空

  contains(Object o):判断集合是否包含指定元素

  isEmpty():判断集合是否为空

  size():返回集合个数

  toArray():返回包含此集合所有元素的数组

HashSet集合

HashSet集合特点:

  HashSet集合在new的时候,底层实际上new了一个HashMap集合,向HashSet集合中

  存储元素实际上是存储到HashMap集合中,HashMap集合是一个哈希表数据结构,HashSet集合

  初始化容量是16,初始化容量建议为2的倍数,扩容是原容量的2倍

TreeSet集合

TreeSet集合实际上实现了SortedSet接口,而SortedSet接口继承了Set集合

SortedSet类型集合存储元素特点:

  SortedSet接口由于继承了Set集合,所以它的特点也是无序不可重复,但是放在SortedSet类型集合中的

  元素可以自动排序,称为可排序集合,放到该集合中的元素自动按照大小顺序或者字典顺序排序

TreeSet集合存储元素特点:

  new TreeSet集合的时候,底层实际上new了一个TreeMap集合,往TreeSet集合添加数据时, 

  实际上是将数据放到了TreeMap集合中了,TreeMap集合底层采用了二叉树数据结构

TreeSet集合新增常用方法:

  first():返回此集合中第一个(最低)元素

  last():返回此集合最后一个(最高)元素

  comparator():返回对此集合中的元素进行排序的比较器,如果此Set使用自然排序则返回null

  subSet(E fromElement,E fromElement):返回一个新的set集合,从fromElement到fromElement区间,左闭右开

  headSet(E toElement):返回一个新集合,新集合是toElement之前的所有对象,但不包括toElement对象

  tailSet(E fromElement):返回一个新的Set集合,新集合包含fromElement之后的所有对象,包括fromElement对象

Map接口

Map接口特点:

  Map接口和Collection接口没有任何关系,Map集合是以key和value键值对的方式存储元素,key

  和value都是存储java对象的内存地址,所有Map集合的key特点:无序不可重复。Map集合的key

  和Set集合存储元素特点相同

Map常用方法:

  clear():清空集合

  containsKey(Object key):判断指定是否含有该键

  containsValue(Object vlaue):判断指定值是否含有该值

  entrySet():将集合转换为Set集合

  get(Object key):通过键获取值

  isEmpty():判断集合是否为空

  keySet():将Map集合的key转换为set集合

  put(K key,V value):添加键值对

  remove(Object key):通过键删除键值对

  size():返回集合元素个数

HashMap集合

HashMap集合特点:

  HashMap集合底层是哈希表数据结构,是非线程安全的,在jdk8之后,如果哈希表

  单向链表中元素超过八个,单向链表就会变成红黑树数据结构,当红黑树上的节点数量

  小于6时,会重新把红黑树变成单向链表数据结构,这种方式是为了提高检索效率

  二叉树的检索会再次缩小扫描范围提高效率,初始化容量16,默认加载因子0.75

  扩容之后的容量是原容量的2倍,HashMap集合的key和value可以为null,key重复

  的话value会覆盖

Hashtable集合

Hashtable集合特点:

  Hashtable集合底层也是哈希表数据结构,是线程安全的,其中所有的方法都带有synchronized关键字,

  效率较低,现在使用较少,因为控制线程安全有其他更好的方案,Hashtable的key和value不能为null

  Hashtable集合初始化容量是11,默认加载因子为0.75,Hashtable集合扩容:原容量*2+1

Properties集合

Properties集合继承Hashtable集合

Properties集合特点:

  Properties是线程安全的,因为继承了Hashtable,另外Properties存储元素时采用key和value形式

  并且key和value只支持String类型,不支持其他类型,Properties称为属性类

Properties集合的常用方法

  setProperty():取

  getProperty():存

SortedMap接口

SortedMap集合的key存储元素特点:

  首先是无序不可重复,另外放在SortedMap集合key部分的元素会自动按照大小顺序排序,称为可排序集合

TreeMap集合

实现了SortedMap接口,底层数据结构是二叉树

比较器

放在TreeSet和TreeMap集合的元素要想做到排序有两种方法

  第一种:元素要实现java.lang.Comparable接口

  第二种:在构造TreeSet或者TreeMap集合的时候传入以比较器对象

集合工具类Collections

静态方法:

  synchronizedList(list):将线程不安全的变成线程安全的

  sort(list):排序,前提要有比较器

  List<String> myList = new ArrayList<>(set集合对象):Set集合变成List集合

上一篇:day08_APP手工测试


下一篇:Linux printf 函数输出问题