Java 集合类学习笔记

数组存储弊端

在Java中存储对象可以使用数组或者集合,但使用数组存储可能会出现以下弊端:

  • 一旦数组创建完毕,它的长度将是不可变的,如果要修改长度,只能通过创建一个新的数组,将原数组拷贝过去,这样将会增加开销。
  • 在数组中不能直接获得存放对象的个数

Java 集合框架的基本接口

Java 集合类学习笔记_第1张图片 Java集合框架的基本接口图

将常用的Java 集合可分为Collecion 和 Map 两种体系

Java 集合类学习笔记_第2张图片

Collection中重要的方法

  •  contains(Object obj) 
    判断集合中是否包含指定的obj元素,如果包含,返回true,否则返回false.
    判断依据:根据元素所在类的equals()方法进行判断
    注意:如果存入集合中的元素是自定义类的对象,要求该自定义类重写equals()方法
    @Test
    public void testCollection(){
    	/*
    	 * 此处contains调用的时String的equals()方法
    	 */
    	Collection coll = new ArrayList();
    	coll.add("aa");
    	System.out.println(coll.contains("aa"));
    	coll.add(new String("bb"));
    	System.out.println(coll.contains(new String("bb")));
    }
    /*
     *运行结果:
     *true
     *true
     */

     

  •  containsAll(Collection coll)
    判断当前集合中是否包含coll中的所有元素
  • retainAll(Collection coll)
    求当前集合与coll的共有元素(交集),返回给当前集合
  • remove(Object obj)
    删除集合中的obj元素。若删除成功,返回true。否则,返回false
  • removeAll(Collection coll)
    从当前集合中删除包含在coll中的元素(差集)
  • toArray()
    将集合转化为数组
  • iterator()
    返回一个Iterator接口实现类的对象,进而实现集合的遍历

List 接口

ArrayList 底层是用数组实现的(是List的主要实现类), LinkedList底层是用链表实现的(适合频繁的插入和删除操作), Vector是线程安全的,但是效率要低于ArrayList。

Set 接口

Set 的无序性是指元素在底层存储的位置是无序的(根据哈希值来存储),添加进Set中的元素所在类,一定要重写equals()和hashCode()方法。

LinkedHashSet

LinkedHashSet 使用链表维护添加进集合的顺序,所以遍历LinkedHashSet集合时,是按照添加进去的顺序遍历的。

HashSet

HashSet的底层是用HashMap实现的。

TreeSet

  • 向TreeSet中添加的元素必须是同一个类的,且能比较大小(Java中只有实现了compareTo接口才能比较)
  • 遍历可以按照元素所在类的指定顺序(实现了compareTo接口)遍历,像String,包装类等默认从小到大的顺序遍历;TreeSet可以看成有顺序的集合
  • 向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0(会添加失败),程序会认为这两个对象是相同的,所以compareTo()与hashCode()以及equals()三者要保持一致。

HashMap

HashMap是Map的主要实现类。Key是用Set来存放的,不可重复。value是用Collection来存放的,可重复。一个key-value对,是一个Entry。所有的Entry是用Set存放的,也是不可重复的。

Java 集合类学习笔记_第3张图片

你可能感兴趣的:(Java)