数组存储弊端
在Java中存储对象可以使用数组或者集合,但使用数组存储可能会出现以下弊端:
- 一旦数组创建完毕,它的长度将是不可变的,如果要修改长度,只能通过创建一个新的数组,将原数组拷贝过去,这样将会增加开销。
- 在数组中不能直接获得存放对象的个数
Java 集合框架的基本接口
将常用的Java 集合可分为Collecion 和 Map 两种体系
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存放的,也是不可重复的。