集合:
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 :有序的(存入的顺序和取出的顺序保持一致),该集合中的元素都有索引,可以有重复元素。
- Set :不允许有重复元素。
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
- Vector:底层数据结构是一个数组。 而且数组可以增长。其实数组增长的原理:存储元素时,超出数组角标,会创建新数组,将原数组的数据复制到新数组中,并将新元素存储到新数组中。它是同步的。效率非常低。
- ArrayList:底层数据结构也是可变长度的数组,是不同步的,比Vector效率高。查询元素的速度很快。
- LinkedList:底层数据结构是链表数据结构,是不同步的。对元素的增删操作很快。
Set
- HashSet:数据结构是哈希表,是不同步的。
- TreeSet:数据结构是二叉树结构。是不同步的。可以对Set集合中的元素进行指定方式的排序。默认用的元素的自然排序。
Collection集合的子类对象阅读技巧。
具体的容器是什么结构?是否是同步?
通过名称就可以获得。容器的前缀名是数据结构的名字。后缀名是所属体系的名字。
凡是后缀名是体系名的集合,通常都是不同步的。
- ArrayList:数据结构是数组。所属于List体系。看到数组必须想到索引,必须要知道查询速度快。
- LinkedList:数据结构是链表,看到链表就要想到,增删速度快,而且要接的 add,get,remove的first last方法。
- HashSet:数据结构是哈希表,看到哈希就必须想到对元素进行hashCode和equals方法的复写。
- TreeSet:数据结构是二叉树,看到树,就要想到比较排序,就要想到两个接口,Comparable Comparator。
(二叉树结构也叫红黑结构左红右黑)默认元素的自然排序。可以对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两种遍历方式。