----------- android培训、java培训、java学习型技术博客、期待与您交流! ---------
集合
关键词:集合框架 堆栈 队列 二叉树 List Set
(1)为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
(2)数组和集合类同是容器,有何不同?
2.1数组虽然也可以存储对象,但长度是固定的;
2.2集合长度是可变的;
2.3数组中可以存储基本数据类型,集合能存储任意对象(其实存储的是地址引用);
(3)集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
集合容器因为内部的数据结构不同,有多种具体容器。向上抽取共性,集合框架。
框架的顶层Collection接口体系:
(本来是用XMind做好的,要搬到博客上才发现贴图太麻烦,就用缩进做了个大概,各位看官先凑活看吧)
List接口(常用实现子类)
ArrayListLinkedListVector
Set接口(常用实现子类)
HashSetTreeSet
Collection的常见功能:
1.添加:
1.1 boolean add(Object obj):
1.2 boolean addAll(Collection coll):
2.删除:
2.1 boolean remove(Object obj):
2.2 boolean removeAll(Collection coll):
2.3 void clear( );
3.判断:
3.1 boolean contains(Object obj)
3.2 boolean containsAll(Collection coll);
3.3 boolean isEmpty( ):判断集合中是否有元素
4.获取:
4.1 int size( );
4.2 iterator( ):取出元素的方式:迭代器——原理:内部类实现
该对象必须依赖于具体的容器因为每一个容器的数据结构都不同。所以迭代器对象是在容器中进行内部实现的。
只要通过容器获取到该实现的迭代器的对象即可。
在迭代过程中,不要使用集合操作元素,容易发生异常(并发线程异常)
可以使用Iterator接口的子接口ListIterator来完成
Iterator接口就是对所有的Collection容器进行元素的公共接口
5.其他:
5.1 boolean retainAll(Collection coll):取交集
5.2 Object[ ] toArray( ):将集合转换成数组
-----------------------------------------------------------------------------------------------------------------
Collection
|
|
List:有序:存入和取出的顺序一致;元素都有索引(角标);元素可以重复
|
|
Set: 元素不重复,无序。(也有可能有序)
--------------------------------------------------------------------------------------------------------------
List:常见方法
(1) 添加:
1.1 void add( index, element):
1.2 void add(index, collection):
(2) 删除:
2.1 Object remove(index):
(3) 修改:
3.1 Object set(index element):
(4) 获取
4.1 Object get(index):——List专有
4.2 int indexOf(Object);
4.3 int lastIndexOf(Object);
4.4 List subList(from, to);
ListIterator接口可以实现在迭代过程中完成对元素的增删改查;且只有List集合具备该迭代功能
List:常用子类(不同步的子类为了效率)
|——Vector:内部是数组数据结构,此实现是同步的。增 删 查询,速度慢
|——ArrayList:内部是数组数据结构,此实现是不同步的。替代了Vector,查询速度快
|——LinkedList:内部是链表数据结构,此实现是不同步的。增删元素速度快
(链表结构———铁索连舟)
LinkedList类中方法
addFirst():
addLast():
JDK1.6中为:
offerFirst():
offerLast():
getFirst():获取但不移除,如果链表为空,调用此方法时会抛出异常
getLast():
JDK1.6中为:
peekFirst():获取但不移除,如果链表为空,调用此方法时会返回null;
peekLast()
removeFirst():获取但移除,如果链表为空,调用此方法时会抛出异常
removeLast():
JDK1.6中为:
pollFirst():获取但移除,如果链表为空,调用此方法时会抛出异常
pollLast():
ArrayList类中方法:
(如何在ArrayList集合存储自定对象)
Set:不包含重复元素的Collection,是无序。
判断元素唯一性的方式:就是根据比较方法的返回结果是否为0,为0就是相同元素,不存。
Set接口中的方法与Collection接口中的一种
|——HashSet( )内部数据结构是哈希表;此实现不同步;
| |——LinkedHashSet( ):有序
|
|——TreeSet( )使用元素的自然顺序对Set集合元素进行排序;此实现是不同步
使用TreeSet( )方法来进行排序方式1:
让元素自身具有比较功能:让元素实现compare接口覆写compare()方法;
排序方式2:(如果对象没有排序标准)
如果不具备自然顺序,可以让集合自身具备比较功能:定义一个类实现Compareto接口,并覆盖compare方法,将该类对象最为参数传递给TreeSet集合的构造函数。
二叉树:也叫红黑树;一种数据结构,可以用来排序
关于哈希表:
可以理解为类似为数组,根据算法来对元素进行运算并获取其存储位置。
(如果,再次查找这个元素,不必遍历数组,而是在用算法进行一次运算,得到位置后,到该位置上进行验证)
哈希表确定元素是否相同:
1.判断的两个元素的哈希值是否相同;如果相同,再判断两对象的内容是否相同。
2.判断哈希值相同,用判断对象的hashCode的方法;判断内容相同,用equals方法。(如果哈希值冲突,内容不同,则要么串联,要么顺延等多种方法来解决)
3.注意:如果哈希值不同,不必判断内容。
泛型:(直译)广泛的类型
Java是一种强类型语言,它为每一种数据确定了强制的类型;
泛型是JDK1.5出现的安全机制;加强了编译时期的数据类型安全,编译完成后生成的class文件,中是不带泛型的,这个称为泛型的擦除。这样做的原因是为了兼容运行的类加载器。
泛型的补偿:在运行时通过获取元素的类型进行转换动作。()不用使用者进行强制转换了
优点:
1.将运行时期的问题ClassCastException转到了编译时期;(提高了编译时期的安全系数,确保了类型的安全)
2.避免了强制类型转换的麻烦;
< >应用情景:
当操作的引用数据类型不确定的时候。就使用< >。将要操作的引用数据类型传人即可。其实,< >就是一个用于接收具体引用数据类型的参数范围。
在程序中,只要用到带有< >的类型或者接口,就要明确传入的具体引用数据类型
泛型在集合中应用广泛,因为,集合可以接受多种类型的参数,需要用泛型来指定类型。
注意:泛型中不能传人基本数据类型。因为集合是存储对象(引用数据类型不定)的一种容器;
迭代器的泛型数据类型和获取迭代器对象集合的泛型数据类型一致。
泛型类:在JDK1.5版本后,使用泛型来接收类中要操作的引用数据类型被称为泛型类。
适用情景:当引用的数据类型不确定时。
使用好处:将运行时的错误提前暴露在编译阶段。
泛型方法:将泛型定义在方法上。
当方法是静态时,不能访问类上定义的泛型。如果静态方法使用泛型,只能将泛型定义在方法上。
泛型接口:把泛型定义在接口上;
泛型通配符用法:
通配符 ? 代表含义:未知类型;一般情况下泛型左右两边要一致
当数据类型未知的情况下可以用?表示。
泛型的限定:只有符号条件的一部分类型可以通过
? extends E:接收E类型或者是E的子类型对象。泛型限定上限
? super E:接收E类型或者是E的父类型对象。泛型设定下限
适用情景:
当往集合中存元素的时候,多用泛型限定上限,因为取出元素都是按照类型上限来进行运算的,不会出现类型安全隐患。
集合的一些技巧:
根据命名来判断和记忆:后缀名就是该集合所属的体系;
1.存取集合中的元素需要唯一用 Set
|——需要指定顺序:TreeSet
|——不需要指定顺序:HashSet
|——需要一个和存储一致的顺序: LinkedHashSet
2.存取集合中的元素不需要唯一用 List
|——需要频繁增删:LinkedList
|——不需要频繁增删:ArrayList
3.如何记忆每一个容器的结构和所属体系
Set
|——HashSet
|——TreeSet
List
|——ArrayList
|——LinkedList
前缀名就是该集合的数据结构。
Array:代表数据有角标,查询快;
Link:代表链表,增删快;方法 add get remove first / last
Hash:代表哈希表,唯一性;覆写hashcode方法 和 equals方法。
Tree:代表二叉树,排序;接口Comparable, Comparator。
通常这些常用的集合容器都是不同步的,效率较高。
Collections:工具类
常用方法:
排序 - sort()
折半 - binarySearch()
逆序 - reverseOrder()
乱序 - shuffle()
复制 - copy()