java基础内容学习.docx
《java基础内容学习.docx》由会员分享,可在线阅读,更多相关《java基础内容学习.docx(22页珍藏版)》请在冰豆网上搜索。
java基础内容学习
1课程名称:
集合
2知识点概述
2.1、上次课程
2.2、作业讲解
2.3、本次预备讲解的知识点
1、Collection接口、List接口、Set接口的作用及关系
2、Map接口的作用
3、集合的四种输出方式及使用区别
4、集合的常用操作子类
3、具体内容
3.1、认识类集
在编程时,常常需要集中存放多个数据,当然我们可以使用数组来保存多个对象。
但数组的长度不可变化,一旦在初始化数组是指定了数组的长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数组就有点无能为力了;而数组也无法保存具有映射关系的数据,如成绩表:
语文--79,数学—80,这种数据看上去像两个数组,但这两个数组直接的元素具有一定的关联关系。
为了保存数量不确定的数据,以及保存具有映射关系的数据(也称为关联数组),java提供了集合类,集合类主要负责保存,盛放其他数据,因此集合类也被称为容器类。
所有的集合类都位于java.util包下。
Java的集合类主要由以下接口派生而出:
1.Collection系类接口——单值操作接口
a)Collection接口派生出Set、Queue、List三个子接口
2、Map系类接口——对值操作接口,由key-value对组成
常用实现类为:
HashMap、properties、SortedMap
此外还经常用到如下接口:
1、SortedSet、SortedMap排序的操作接口
2、Interator、ListInterator输出集合中元素的接口
结构如图:
三种常用集合特点
|-Set集合无序不能重复
|-List集合有序可重复
|-map集合Key不可重复、value可重复
3.2、Collection接口
3.2.1、collection接口的定义
Colletion接口的定义
publicinterfaceCollection
extendsIterable
在JDK1.5之后,collection接口使用了泛型的定义,在操作时必须指定具体的操作类型,这样可以保证类操作的安全性,避免发生ClassCastException异常
Collection接口是单值存放的最大父接口,可以向其中保存多个单值(单个对象)数据,Collection接口里定义了如下操作集合元素的方法:
(详见API)
No
方法
类型
描述
1
publicbooleanadd(Ee)
普通
向集合中添加元素
2
publicbooleanaddAll(Collection
extendsE>c)
普通
向集合中添加一组数据,泛型指定了操作上限
3
publicvoidclear()
普通
清空所有集合中的所有元素
4
publicbooleancontains(Objecto)
普通
判断是否有指定的内容,查找
5
publicbooleancontainsAll(Collection
>c)
普通
查找一组数据是否存在
6
publicbooleanequals(Objecto)
普通
比较对象是否相等
7
publicinthashCode()
普通
返回hash码
8
publicbooleanisEmpty()
普通
判断集合是否为空
9
publicIteratoriterator()
普通
为interator接口实例化,迭代输出
10
publicbooleanremove(Objecto)
普通
从集合中删除指定的对象
12
publicbooleanremoveAll(Collection
>c)
普通
从集合中删除一组对象
13
publicbooleanretainAll(Collection
>c)
普通
从集合中保留指定的集合
14
publicintsize()
普通
获取集合中元素的个数
15
publicObject[]toArray()
普通
取得集合中全部的元素,以数组的形式返回
16
publicT[]toArray(T[]a)
普通
返回包含此collection中所有元素的数组,可指定返回数组的类型
在一般开发中,往往很少直接直接使用Collection接口进行开发,基本上都是是其使用子接口,子接口主要有List、set、Query和StortedSet
3.2.2、collection子接口的定义
Collection接口虽然是集合的最大接口,但如果直接使用Collection接口进行操作,则表示操作意义不明确,所以在java开发中不提倡直接使用collection接口,主要子接口介绍如下:
|-List:
可以存放重复的内容
|-Set:
不能存放重复内容,所有的重复内容靠hashCode()和equals()两个方法区分
|-Queue:
队列接口
|-SortedSet:
可以对集合中的数据进行排序
3.3、List接口
List是Collection的子接口,其中可以保存各个重复的内容,此接口定义如下:
publicinterfaceList
extendsCollection
但与Collection不同的是,在List接口中大量的扩充了Collection接口,拥有了比Collection接口中更多的方法定义,其中有些方法还比较常用。
List对Collection接口的扩展方法如下:
详见API
No
方法
类型
描述
1
publicadd(intindex,Eelement)
普通
将元素element放入在List集合的index出
2
publicaddAll(intindex,Collection
extendsE>c
普通
将集合c所包含的所有元素都放入在List集合的index出,泛型指定了操作上限
3
publicEget(intindex)
普通
返回集合index索引处的元素
4
publicintindexOf(Objecto)
普通
返回对象o在集合中第一次出现的位置索引,如果此集合不包含该元素,则返回-1。
5
publicBooleancontainsAll(Collection
>c)
普通
查找集合C中的数据是否存在指定集合中存在
6
publicintlastIndexOf(Objecto)
普通
返回此集合中最后出现的指定元素的索引;如果集合不包含此元素,则返回-1
7
publicListIteratorlistIterator()
普通
返回listIterator实例
8
publicListIteratorlistIterator(intindex)
普通
返回从指定位置开始的listiterator实例
9
publicEremove(intindex)
普通
从集合中删除指定位置的元素
10
publicEset(intindex,Eelement)
普通
用指定元素替换列表中指定位置的元素
12
publicListsubList(intfromIndex,inttoIndex)
普通
返回集合中指定的下标fromIndex(包括)和toIndex(不包括)之间的子集合,
如果使用想要使用此接口,则需要通过其子类进行实例化
3.3.1、List接口的常用子类
1、子类ArrayList
ArrayList是List的子类,可直接通过对象的多态性为List接口实例化,此类的定义如下:
publicclassArrayList
extendsAbstractList
implementsList,RandomAccess,Cloneable,Serializable
可看出ArrayList继承了AbstractList,AbstractList类的定义如下:
publicabstractclassAbstractList
extendsAbstractCollection
implementsList
此接口实现了List接口,所以可以直接使用ArrayList为List接口实例化
示例代码:
(向集合中添加元素)
说明:
从程序运行中可以发现,使用List中的add(intindex,Eelement)方法可以在集合中指定位置增加元素,而其他两个add()方法只能在集合的最后进行内容的追加
示例代码:
(删除元素)
说明:
可同下标和对象的方式直接对集合进行删除
示例代码:
(输出List中的内容)
说明:
List集合增加到的顺序就是输出后的顺序,本身顺序不会改变
实例代码:
(将集合变为对象数组)
示例代码:
(集合中的其他操作)
2、LinkedList子类、Queue接口
LinkedList表示链表的操作类,即java中已经为开发者提供好了一个链表程序,开发者直接使用即可,无需重复开发,LinkedList类的定义如下:
publicclassLinkedList
extendsAbstractSequentialList
implementsList,Deque,Cloneable,Serializable
此类实现了List接口,但同时也实现了Queue接口。
Queue表示的是队列操作接口,采用FIFO(先进先出)的操作方法,就好像一队人排队那样,队列中有对头和队尾,队头永远指向新加入的对象,Queue是Collection的子接口,其定义如下:
publicinterfaceQueue
extendsCollection
Queue接口定义的方法如下:
详见API
NO
方法
1
add(E e)
2
element()
3
offer(E e)
4
peek()
5
poll()
6
remove()
在LinkedList类中除了实现以上的方法外,还提供了如下方法:
详见API
NO
方法
1
addFirst(E e)
2
addLast(E e)
3
offer(E e)
removeFirst()
removeLast()
示例代码:
(链表的开头和结尾增加数据)
示例代码 :
(找到链表头)
示例代码:
(以先进先出的方式取出全部的数据)
3.4、Set接口
Set接口也是Collection的子接口,但是与Collection和List接口不同的是,Set接口中不能加入重复的元素。
Set接口定义如下:
publicinterfaceSet
extendsCollection
从定义可以发现set接口和List接口没有头太大差异,但是Set接口的主要方法和Collection一致的,也就是说set接口并没有对Collection接口进行扩充,只是比Collection接口的要求更加严格了,不能增加重复元素
Set接口的实例不能像List接口那样进行双向输出,因为此接口没有提供像list接口定义的get(intindex)方法
3.4.1、Set接口的常用子类
1、散列的存放:
HashSet
HashSet是set接口的一个子类,主要的特点是:
里面不能存放重复元素,而且采用散列的存储方式,所以没有顺序
实例代码:
(HashSet类)
说明:
从程序运行结果可以看出,重复元素只能增加一次,而且程序运行时向集合加入元素的顺序并不是集合中保存的顺序,证明HashSetl类中的元素是无序排列的
2、有序存放:
TreeSet
如果想对输入的数据进行排序,则要使用TreeSet子类,TreeSet类定义如下:
publicclassTreeSet
extendsAbstractSet
implementsNavigableSet,Cloneable,Serializable
TreeSet继承了AbstractSet类,此类定义如下:
publicabstractclassAbstractSet
extendsAbstractCollection
implementsSet
示例代码:
(验证TreeSet)
说明:
程序在向集合中添加数据时是没有顺序的,但输出之后是有序的,所以TreeSet是可以排序的子类
3、关于TreeSet排序的说明
既然TressSet本身是可以排序的,那么现在定义一个自己的类,是否也可要进行排序操作呢?
示例代码:
(自定义类排序)
说明:
出现类型转换异常,因为TreeSet中的元素是有序存放的,所以对于一个对象必须指定好其排列规则,且TressSet中的每个对象所在的类都必须实现Comparable接口才可正常是使用
示例代码:
(指定排列规则)
说明:
从程序运行结果中发现,重复的“吕子乔”没有加入,但年龄重复的“美嘉“没有添加到集合中,这是由于采用了比较器造成的,因为比较器操作时如果某个属性没有进行比较的指定,则也会认为是同一个对象,所以此时应该在Person类中compareTo方法中增加姓名比较
示例代码:
(修改Person比较器)
说明:
此时,运行结果中出现了年龄重复的“美嘉”,而且去掉了重复内容,但此时重复内容去掉,并不是真正意义上的去掉重复元素。
因为此时靠的是Comparable完成的,而如果换成HashSet则也会出现重复内容,所以要想真正的去掉重复元素,则必须深入研究Object类
4、关于重复元素的说明
观察以下代码:
示例代码:
(加入重复对象)
说明:
从程序运行结果可以发现“吕子乔”元素重复了,也就是说,此时的程序并没有像Set接口规定的那样是不允许有重复元素的,而如果此时想要去掉重复元素,则必须首先进行对象是否重复的判断,而要想进行这样的判断则一个类就必须重写Object类中的equals方法,才能完成对象是否相等的判断,但是只重写equals()方法是不够的,还需要重写hashCode()方法,此方法表示一个哈希编码,可以简单的理解为表示一个对象的编码。
一般的哈希吗是通过公式进行计算的,可以将类中的全部属性进行适当的计算,以获取不能重复的哈希码
示例代码:
(去掉重复元素)
说明:
集合中的重复元素消失了,就是因为equals()和hashCode()共同作用的结果
3.5、SortedSet接口
从TreeSet类的定义中可以发现,TreeSet类中实现了StrtedSet接口,此接口主要用于排序操作,即实现此接口的子类都属于排序的子类,SortedSet接口定义如下:
publicinterfaceSortedSet
extendsSet
此接口也继承了Set接口,此接口中定义了如下方法:
NO
方法
1
comparator()
2
first()
3
headSet(E toElement)
4
last()
5
subSet(E fromElement,E toElement)
6
tailSet(E fromElement)
示例代码:
(验证SortedSet接口)
3.6、集合的输出
之前我们知道,如果输出Collection,set集合中的内容,可以将其转换为数组输出,而是用list则可直接通过get()方法输出,但这些不是集合的标准输出方式,在类集合中提供了如下4中常见的输出方式:
1、Iterator:
迭代输出,是用最多的方式
2、ListIterator:
是Iterator的子接口,功能与Lterator类似
3、Enumeration:
是一个旧接口,功能与Iterator类似
4、foreach:
JDK1.5以后的新功能,可以输出输出或集合
3.6.1、Iterator迭代输出
1、Iterator接口
在使用集合输出时必须形成一个思路,“只要碰到了集合输出的操作,就一定使用Iterator接口”,因为这是一个最为标准的做法
Iterator是专门迭代输出接口,所谓迭代输出就是将元素一个一个进行判断,判断其是否有内容,如果有内容则把内容取出,Iterator接口的定义如下:
publicinterfaceIterator
Iterator接口在使用时也要使用泛型,当然此处的泛型最好与集合中的泛型类型一致,此此接口定义的方法如下:
(详见API)
NO
方法
说明
1
hasNext()
2
next()
3
remove()
2、Iterator接口的相关操作
Iterator接口,可以直接使用Collection接口中定义的Iterator()方法为其实例化,既然Collecting接口中存在了此方法,则List和Set接口中也一定存在此方法,所有也可以通用使用Iterator接口输出。
示例代码:
(输出Collection中的全部内容)
说明:
集合类的标准输出形式,(重点掌握),将集合中的元素一个一个输出
示例代码:
(使用Iterator删除指定内容)
示例代码:
(迭代输出时删除元素的注意点)
正常情况下,一个集合要把内容交给iterator输出,但集合操作也存在一个remove()方法,如果在使用iterator输出集合时自己调用了删除的方法,则会出现运行错误。
示例代码:
(不正确的删除方法)
说明:
从程序运行结果中可以发现,内容却是被删除了,但迭代输出在内容被删除之后就终止了。
因为集合本身内容被破换掉,所有迭代输出将出现错误,会停止输出。
3.6.2、ListIterator双向迭代输出
1、ListIterator接口简介
Iterator接口的主要功能是由前向后单向输出,而此时如果实现由后向前或是由前向后的双向输出,则必须使用Iterator的子接口----ListIterator,定义如下:
publicinterfaceListIterator
extendsIterator
此接口比Iterator接口中定义了更多的方法,具体如下:
(详见API)
NO
方法
说明
1
add(E e)
2
hasNext()
3
hasPrevious()
4
next()
5
nextIndex()
6
previous()
7
previousIndex()
8
remove()
9
set(E e)
与Iterator接口不同的是,ListIterator接口只能通过List接口实例化,即只能输出list接口的内容,在List接口中定义可以为ListIterator接口实例化的方法ListIterator().
2、ListIterator接口的相关操作
示例代码:
(进行双向迭代)
说明:
1、此输出方式只有list接口才可以做到
2、如果想完成由后向前的输出,则一定要先进行由前向后的输出
示例代码:
(增加即替换元素)
说明:
虽然add()或set()方法可以增加和替换集合中的元素,但在开发中不建议使用。
3.6.3、java的新支持:
foreach
foreach除了可以完成数组输出,对于集合同样支持,语法如下:
for(类对象:
集合)
{
//集合操作
}
示例代码:
(使用foreach输出)
说明:
虽然foreach使用较简单,在实际的开发中iterator还是较多
3.7、Map接口
3.7.1、Map接口简介
Collection、List、set接口都是单值的操作,即每次只能操作一个对象,而map与他们不同的是,每次操作是一对对象,即二元偶对象,map中的每个元素都使用key—value对的形式存储在集合中。
Map接口的定义如下:
publicinterfaceMap
map也使用了泛型,必须同时设置还key或value的类型,在map中美一对key—value都表示一个值,map接口提供的如下方法:
(详见API)
NO
方法
clear()
containsKey(Object key)
containsValue(Object value)
entrySet()
equals(Object o)
get(Object key)
hashCode()
isEmpty()
keySet()
put(K key,V value)
putAll(Map
extendsK,?
extendsV> m)
remove(Object key)
size()
values()
3.7.2、Map.Entry接口简介
Map.Entry是Map内部定义的一个接口,专门用来保存key---value的内容,Map.Entry定义如下:
publicstaticinterfaceMap.Entry
Map.Entry是使用static关键字声明的内部接口,此接口可以通过“外部类.内部类”的形式直接调用,本接口定义方法如下:
NO
方法
说明
1
equals(Object o)
2
getKey()
3
getValue()
4
hashCode()
5
setValue(V value)
我们可以把Map理解成一个特殊的Set,只是该set里包含的集合元素时Entry对象。
3.7.3、Map接口的常用子类
Map接口常用的子类如下:
1、HashMap:
无序存放,是新的操作类,key不允许重复
2、Hashtable:
无序存放,是旧的操作类,key不允许重复
3、TreeMap:
可以排序的map集合,按集合的key排序,key不允许重复
1、新的子类:
HashMap
HashMap本身是Map子类,直接使用此类为map接口实例化即可。
Hashmap定义如下:
publicclassHashMap
extendsAbstractMap
implementsMap,Cloneable,Serializable
HashMap是AbstractMap的子类,abstractMap类的定义如下:
publicabstractclassAbstractMap