java集合大总结

来源:互联网 发布:电脑检测软件 编辑:程序博客网 时间:2024/05/13 23:55

首先,出现今天的需求主要是打算把数据结构,java集合,真实场景的处理都好好的再过一遍。我写了一个实现约瑟夫环的算法,想着在arraylist和linkedlist之间做选择,对比。很多时候功能做出来后,很少是能再去修改,情愿做一个新的。现在想想这个习惯应该改一下。

从整体上来看下集合家族。

玩java的时候,先接触的是数组,那么对于集合的理解也是相对于数组的,所以说下区别:

1.数组是大小固定的,并且在同一个数组只能存放类型一样的数据(基础类型/引用类型)。

2.java集合可以存储和操作数目不固定的一组数据,所有的java集合都在java.util包中,集合只能存放引用类型的数据,不能存放基础数据类型。java集合分3个类型:set(集)、list(列表)、map(映射)。他们3个都是接口。

可以看到Collection是集合类的上级接口,继承它的接口主要有set和list。而很容易混淆的是Collections,它是针对集合类的一个工具类,它提供了一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作。

同样的,Array类提供了动态创建和访问java数组的方法。Arrays类是数组的工具类,提供了1.给数组赋值2.对数组排序3.比较数组4.查找数组元素,这些操作方法。

图的右侧,还有comparable和comparator已经写过了就不多少了。

这个图上错综的分支树,熟悉的要很熟悉,不熟悉的知道怎么回事。说不定冷知识那天刚好要用到。

Arraylist和linkedlist写过了,这里不写。从java认证的题目来一下。

几个面试常见问题:
1.ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?
    A:Vector和HashTable是线程同步的(synchronized)。性能上,ArrayList和HashMap分别比Vector和Hashtable要好。

2.大致讲解java集合的体系结构:
   A:List、Set、Map是这个集合体系中最主要的三个接口。
      其中List和Set继承自Collection接口。
      Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。
      List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。
      Map也属于集合系统,但和Collection接口不同。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashM ap、TreeMap和Hashtable是三个主要的实现类。
      SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。

3.集合中键值是否允许null小结

  • List:可以有多个null,可以有重复值。
  • HashSet:能插入一个null(因为内部是以 HashMap实现 ),忽略不插入重复元素。
  • TreeSet:不能插入null (因为内部是以 TreeMap 实现  ,元素不能重复,如果待插入的元素存在,则忽略不插入,对元素进行排序。
  • HashMap:允许一个null键与多个null值,若重复键,则覆盖以前值。
  • TreeMap:不允许null键(实际上可以插入一个null键,如果这个Map里只有一个元素是不会报错的,因为一个元素时没有进行排序操作,也就不会报空指针异常,但如果插入第二个时就会立即报错),但允许多个null值,覆盖已有键值。
  • HashTable:不允许null键与null值(否则运行进报空指针异常)。也会覆盖以重复值。基于线程同步。

4.对List的选择:

  • 对于随机查询与迭代遍历操作,数组比所有的容器都要快。
  • 从中间的位置插入和删除元素,LinkedList要比ArrayList快,特别是删除操作。
  • Vector通常不如ArrayList快,则且应该避免使用,它目前仍然存在于类库中的原因是为了支持过去的代码。
  • 最佳实践:将ArrayList作为默认首选,只有当程序的性能因为经常从list中间进行插入和删除而变差的时候,才去选择LinkedList。当然了,如果只是使用固定数量的元素,就应该选择数组了。

5.对Set的选择:

  • HashSet的性能总比TreeSet好(特别是最常用的添加和查找元素操作)。
  • TreeSet存在的唯一原因是,它可以维持元素的排序状态,所以只有当你需要一个排好序的Set时,才应该使用TreeSet。
  • 对于插入操作,LinkedHashSet比HashSet略微慢一点:这是由于维护链表所带来额外开销造成的。不过,因为有了链表,遍历LinkedHashSet会比HashSet更快。

6.对Map的选择:

  • Hashtable和HashMap的效率大致相同(通常HashMap更快一点,所以HashMap有意取代Hashtable)。
  • TreeMap通常比HashMap慢,因为要维护排序。
  • HashMap正是为快速查询而设计的。
  • LinkedHashMap比HashMap慢一点,因为它维护散列数据结构的同时还要维护链表。

7.Stack基于线程安全,Stack类是用Vector来实现的(public class Stack extends Vector),但最好不要用集合API里的这个实现栈,因为它继承于Vector,本 就是一个错误的设计,应该是一个组合的设计关系。

 

8.Iterator对ArrayList(LinkedList)的操作限制:

  • 刚实例化的迭代器如果还没有进行后移(next)操作是不能马上进行删除与修改操作的。
  • 可以用ListIterator对集合连续添加与修改,但不能连续删除。
  • 进行添加操作后是不能立即进行删除与修改操作的。
  • 进行删除操作后可以进行添加,但不能进行修改操作。
  • 进行修改后是可以立即进行删除与添加操作的。
最后附带上约瑟夫环的代码。
/** * 集合的大小会变化,变成后面剩下一个人。 *  * @param N *            人数 * @param M *            报数 * @param list */public void playGame(int N, int M, ArrayList<Integer> list) {int k = 0;while (list.size() > 0) {k = k + M;// 第m人的索引位置k = k % (list.size()) - 1;// 判断是否到队尾if (k < 0) {System.out.println(list.get(list.size() - 1));list.remove(list.size() - 1);k = 0;} else {System.out.println(list.get(k));list.remove(k);}pointList(list);}}/** * 打印集合 *  * @param list */public void pointList(ArrayList<Integer> list) {for (Integer integer : list) {System.out.print("<" + integer + ">");}}




0 0
原创粉丝点击