Java集合框架

2017-06-27  本文已影响0人  冯员外_SundarFung
集合:

1,是可以存储很多元素的容器。
2,这个容器用于存储对象。
3,而且该容器的长度是可变的。

集合和数组的区别:

1,
数组是固定长度,
集合是可变长度。
2,
数组可以存储引用类型,也可以存储基本类型。
集合只能存储引用类型。

集合框架的由来:

集合有很多种,因为每一个集合中的数据结构(数据在容器中存取的具体的方式)都不一样。
但都具备共性功能,就不断地向上抽取。就形成了集合框架。该框架的顶层Collection接口。

学习框架原则:看顶层,用底层。

了解一下api中的Collection中的共性方法。
Collection中的共性方法:

1,添加:
   add(Object)
   addAll(collection)
2,删除:
   remove(object)
   removeAll(collection)
   clear();
   retainAll(collection);
3,判断:
   contains(object)
   containsAll(collection)
   isEmpty();
4,获取:
   size();
   iterartor();获取迭代器。每一个集合都具备。
5,转换 
   toArray(); 将集合转成数组。  

迭代器的使用:

 for(Iterator it = collection.iterator(); it.hasNext() ; ){
   System.out.println(it.next());
 } 

迭代器:是容器中的一个内部类,因为该类要直接访问容器中的元素。
同时对外提供了公共的访问规则Iterator接口。
这样的好处,不需要知道具体的容器,只要是Collection中的容器
都可以通过该种取出方法取出体系中的所有容器中的元素。
降低了具体容器和取出方式的耦合性。
想要获取集合中的迭代器对象,就可以通过iterator方法来完成。

Collection

List:特有方法:都是围绕的索引展开的。

 1,添加:
  add(index,element);
  add(index,collection);
 2,获取:
  get(index):通过角标获取元素。
  indexOf(object);
  lastIndexOf(object);
  subList(fromindex,toindex);
 3,删除:
  remove(index):通过角标删除元素,并返回被删除的元素。
 4,修改:
  set(index,element); 
 5,特有的迭代器。ListIterator。可以在迭代时进行元素的增删改查。

List具备着对容器中的元素进行增删改查的功能。只有该集合有。为啥呢?因为索引。

List
Set

Collection集合的子类对象阅读技巧。

具体的容器是什么结构?是否是同步?

通过名称就可以获得。容器的前缀名是数据结构的名字。后缀名是所属体系的名字。
凡是后缀名是体系名的集合,通常都是不同步的。

(二叉树结构也叫红黑结构左红右黑)默认元素的自然排序。可以对Set集合中的元素进行指定方式的排序。TreeSet判断元素唯一性的方式是比较方法的返回值是否为0,如果是0视为元素相同,不存。如果比较时主要条件相同就要看次要条件。弊端是不能存重复的

哈希表提升了查询速度,并保证了元素的唯一性,元素不唯一性会破坏表结构。
如果哈希值不同,直接存。如果哈希值相同,要进一步判断内容是否相同,用的是equals方法,如果equals返回true是相同元素则不存。如果返回false,不相同,则存储
元素要往哈希表结构的容器中存储,必须具备hashCode和equals方法,Object中已经提供了这两个方法。堆内存(存数据,对象)用的数据就是哈希表。因为对象的自身特点不同,有可能哈希算法的依据也不同。所以有可能要覆盖hashCode方法。Object的hashCode方法是本地方法调用的是windows的底层算法 几乎很少有冲突,,所以就没法保证唯一性,所以要定义自己的算法来覆盖。

技巧:为了保证唯一 一般在age后乘以一个数,因为很有可能两个人名字不同年龄不同但是算出的哈希值相同,这样会多判断一次equals,equals进栈会低效,所以为保证性能与唯一
乘以个数。。。。
TreeSet 不让它自动排序 可以控制return值 存入顺序和取出顺序一致则return正数 存入顺序和取出顺序相反return负数。

TreeSet判断元素唯一性的方式,是比较方法的返回值是否为0.如果是0,视为元素相同,不存。

排序方式有两种:
1,让元素自身具备比较性,该元素需要实现Comparable接口,覆盖compareTo方法。让元素具备了自然排序。该种方式有弊端,如果元素自身具备的自然排序不是所需要的,怎么办?还有,万一元素根本就不具备自然排序怎么办?
2,可以让容器自身具备比较性,而且应该添加元素之前。所以应该在容器对象创建时,就必须明确比较性。那就应该参考该容器的构造函数。发现可以指定一个比较器,定义一个Comparator接口的子类,并覆盖compare方法。将Comparator接口的子类对象作为参数传递给TreeSet集合的构造函数。

数据结构:数据存取的方式结构

两种数据结构:
堆栈:先进后出First In Last Out (FILO)
队列:先进先出First In First Out (FIFO)

既要速度快 又要有序 可以选择LinkedHashSet


Map

Map实现类用于保存具有映射关系的数据。Map保存的每项数据都是key-value对,也就是由key和value两个值组成。Map里的key是不可重复的,key用户标识集合里的每项数据。同一个Map对象的任何两个key通过equals方法比较总是返回false。

HashMap,TreeMap是我们经常会用到的集合类。

Map集合与Set集合、List集合的关系

1.与Set集合的关系
如果 把Map里的所有key放在一起看,它们就组成了一个Set集合(所有的key没有顺序,key与key之间不能重复),实际上Map确实包含了一个keySet()方法,用户返回Map里所有key组成的Set集合。
2.与List集合的关系
如果把Map里的所有value放在一起来看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是Map中索引不再使用整数值,而是以另外一个对象作为索引。

怎样决定何时使用HashMap何时使用TreeMap?

对 于插入、删除、定位元素频繁的操作,HashMap提供了最好的效率。如果想要按key的排序来遍历,那么TreeMap是不二选择。某些情况下,依赖集 合的大小,先向HashMap中添加元素,然后转换为TreeMap再按key的排序进行遍历也许会带来效率上的提高。

HashMap

HashMap的数据结构:

数组的特点是:寻址容易,插入和删除困难;

而链表的特点是:寻址困难,插入和删除容易。

哈希表结合了两者的优点。

哈希表有多种不同的实现方法,可以理解将此理解为“链表的数组”

HashTable与HashMap的区别

HashTable和HashMap存在很多的相同点,但是他们还是有几个比较重要的不同点。

我们从他们的定义就可以看出他们的不同,HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。

HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。如下:当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以。

Hashtable的方法是同步的,而HashMap的方法不是。所以有人一般都建议如果是涉及到多线程同步时采用HashTable,没有涉及就采用HashMap,但是在Collections类中存在一个静态方法:synchronizedMap(),该方法创建了一个线程安全的Map对象,并把它作为一个封装的对象来返回,所以通过Collections类的synchronizedMap方法是可以我们你同步访问潜在的HashMap。

遍历不同:HashMap仅支持Iterator的遍历方式,Hashtable支持Iterator和Enumeration两种遍历方式。

上一篇下一篇

猜你喜欢

热点阅读