您的位置:首页 > 编程语言 > Java开发

Java集合内容 复习(1)

2014-11-02 18:44 323 查看
1.队列(queue),双端队列(deque)
 特点:在队列的尾部添加元素,在队列的头部删除元素
队列通常有两种实现方式:a.使用循环数组(ArrayDeque类)b.使用链表(LinkedList类)
2.Set 与List
 List 有序,
ArrayList list=new ArrayList();
String str=new String("abc");
list.add(new String("abc"));
list.add(new String("abc"));
list.add(str);
list.add(str);
System.out.println(list.size());
输出结果:4
Set无序,不可重复
HashSet set=new HashSet();
String str1=new String("abc");
set.add(new String("abc"));
set.add(new String("abc"));
set.add(str);
set.add(str);
System.out.println(set.size());
输出结果:1(分别new出来的对象也看作相同的元素)
a.对于HashSet来说,它是如何保证元素的唯一性的呢?
(通过对象的hashcode方法与equals方法来完成对象的唯一性的)
如果对象的hashcode值不同,则视为不同元素,直接存放到哈希表中,如果对象的hashcode值相同,则在判断equals方法,若值为true,视为相同,不存,否则视为不同元素,进行存储。
b.对于TreeSet来说:他可以对Set集合中的元素进行排序,是不同步的
(他判断元素唯一性的方式是根据compareTo方法,他的返回结果如果是0,就是相同元素,不存,若是自定义类产生的对象,则该类必须实现comparable接口,并覆盖它的compareTo方法)
  如果我们要用到一个类,该类是由别人定义,但这个类中并没有定义compareTo方法,(我们没有权利修改这个类),或者说这个类中已经定义了compareTo方法,(但他的比较策略不是我们想要的),我们想要存到TreeSet容器中的该类对象时按我们自身的想法进行排序而不是这个类中定义的compareTo方法,此时,如果我们想要解决这个问题就必须让集合自身具备比较功能,即:我们自定义一个类去实现comparator接口,覆盖compareTo方法,讲该类对象作为参数传递给TreeSet集合的构造函数
   TreeSet(Comparator  comp);                                                                  
3、在java中,实际上所有链表都是双向的(即,存放着指向前驱节点和后序节点的引用)
4、为了避免多个迭代器对集合进行并发操作时发生并发修改异常,可以遵循下述简单规则:可以根据需要给容器附加许多的迭代器,但是这些迭代器只能读取列表,另外,再单独附加一个既能读又能写的迭代器
5、链表只负责跟踪对列表的结构性修改,例如,添加元素,删除元素(导致列表的长度发生变化),set操作不被视为结构性修改(用于修改元素的值的,并不会导致集合的长度发生变化)。
6、 避免使用以整数索引表示链表中位置的所有方法,如果需要对集合进行随机访问,使用数组或者ArrayList,而不要使用LinkedList(虽然LinkedList提供了get(i)方法,可以取出第i个元素,但是效率极低,需要从第一个元素依次往后遍历,(即使内部做了优化,当i的大小大于链表长度的一半时,会从后面遍历))。
7、ArrayList 默认构造一个大小为10的空列表,它内部封装了一个动态再分配的对象数组,是不同步的(Vector是同步的,多线程使用)
8、Set
  散列集(HashSet)、树集(TreeSet)
散列集是能够快速查找元素的数据结构,期缺点是无法控制元素的出现顺序,
散列集为每个对象计算一个整数,叫散列码,散列码是由对象的实例域产生的,例如String类的散列码是由String类的hashCode方法产生的。
  如果自定义类,就要负责实现这个类的hashCode方法,自己实现的hashCode方法应该与equals方法兼容,既:如果a.equals(b)为true,a与b必须具有相同的散列码
HashSet(int 初始容量,float 装填因子);
初始容量就是桶数,,默认值16,通常,如果可以预计最终会有多少个元素要插入到散列集中的话,可以将桶数设置为预计元素个数的75%到150%。装填因子决定何时对散列表进行再散列。是0.0到1.0之间的数,例如,如果装填因子是0.75,那么如果表中超过75%的位置已经填入元素,这个表就会用双倍的桶数自动进行再散列,并将所有元素插入这个表中,然后丢弃原来的表。
 



3、数集(TreeSet)

有序(这里的有序指大小有序,而List中的有序指存取顺序一致)。

(当前实现使用的是红黑树)

将一个元素添加到树中要比添加到散列表中慢,但是与将元素添加到数组或链表的正确位置上相比还是快很多。

Javase 1.6开始,TreeSet类实现了NavigableSet接口,这个接口增加了几个便于定位元素以及反向遍历的方法。





3、队列与双端队列

  Queue(队列),可以在尾部添加一个元素,在头部删除一个元素

  Deque(双端队列),可以有效地在头部和尾部同时添加或删除元素

Javase 1.6中引入了Deque接口,并由ArrayDeque和LinkedList类实现,这两个类都提供了双端队列。,而且在必要时可以增加队列的长度。

  11、优先级队列(PriorityQueue类)

优先级队列使用了一个优雅且高效的数据机构,(堆 heap),堆是一个可以自我调整的二叉树,对树进行添加和删除操作,可以让最小的元素移动到根,而不必花费时间对元素进行排序。与Treeset一样,一个优先级队列既可以保存实现了Comparable接口的类对象,也可以保存在构造器中提供比较器的对象。使用优先级队列的典型事例是“任务调度”,有一个任务都有一个优先级,任务可以以随机顺序添加到队列中,每当启动一个新的任务时,都将优先级最高的任务从队列中删除。

 

12、映射表(Map)

  两个常用的类:HashMap与TreeMap,(还有一个SortedMap,可以返回映射表中最小元素和最大元素)。

他们的区别在于键,散列映射表是对键进行散列,树映射表是对键进行比较,散列或比较函数只能用于键,与键关联的值不能进行散列或比较。

三个概念:键集,值集,键值对集

Set<K>  keySet();

Collection<K>  values();

Set<Map.Entry<K,V>>  entrySet();

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java