Java入门知识汇总之合集框架,提高就要不断的巩固基础技能

Java入门资料之合集框架

8、Map集合和Collection集合的区别?

1,

Map中一次存储是键值对。

Collection中一次存储是单个元素。

2,

Map的存储使用的put方法。

Collection存储使用的是add方法。

3,

Map集合没有迭代器,Map的取出,是将Map转成Set,在使用迭代器取出。

Collection取出,使用就是迭代器。

4,

如果对象很多,必须使用集合存储。

如果元素存在着映射关系,可以优先考虑使用Map存储或者用数组,

如果没有映射关系,可以使用Collection存储。

8、迭代器:Iterator(Map集合没有迭代器)

(1)迭代器就是取出集合元素的方式

(2)迭代器的作用

因为每个集合中元素的取出方式都不一样,于是就把元素的取出方式进行抽取,并定义在集合内部,

这样取出方式就可以直接访问集合内部的元素;

而每个容器的数据结构不同,所以取出动作的细节也不一样,但是有共性内容:判断和取出。

那么就将共性内容进行抽取,从而形成了接口Iterater

(3)获取迭代器的方法:

Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。

Iterator<E> iterator() 返回在此 set 中的元素上进行迭代的迭代器。

(3)迭代器方法:

boolean hasNext() 如果仍有元素可以迭代,则返回 true。

E next() 返回迭代的下一个元素。

void remove() 从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)。

9、列表迭代器:ListIterator

(1)List集合特有的迭代器ListIterator是Iterator的子接口,在迭代时,不可以通过集合对象的

方法操作集合中的元素,因为会发生ConcurrentModificationException(当方法检测到对象的并发修改,

但不允许这种修改时,抛出此异常)

(2)Iterator方法有限,只能对元素进行判断、取出和删除的操作

ListIterator可以对元素进行添加和修改动作等。

(3)获取列表迭代器方法:

ListIterator<E> listIterator() 返回此列表元素的列表迭代器(按适当顺序)。

ListIterator<E> listIterator(int index)

返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。

(4)列表迭代器方法:

void add(E e) 将指定的元素插入列表(可选操作)。

boolean hasPrevious() 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。

int nextIndex() 返回对 next 的后续调用所返回元素的索引。

E previous() 返回列表中的前一个元素。

int previousIndex() 返回对 previous 的后续调用所返回元素的索引。

void set(E e) 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。

10、堆栈和队列

堆栈:先进后出,比如杯子里的水

队列:先进先出,比如水管的水

11、集合类各种容器的使用注意细节:

(1)迭代器:

**迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException。

也就是在迭代循环中调用一次next方法一次就要hasNext判断一次,比如语句

sop(it.next()+"..."+it.next())会发生上述异常。

**迭代器的next方法返回值类型是Object,所以要记得类型转换,应用泛型后就不用强转

(2)List集合:

**List集合里面的元素因为是带角标,所以List集合里面的元素都是有序的,

另外List集合可以包含重复元素,也可以包含null。

**List集合有迭代器Iterator,还有一个特有迭代器列表ListIterator

**List集合中判断元素是否相同都是用equals方法,无论contains、remove都依赖equals方法

比如往ArrayList集合里面存放学生,同名同年龄视为同一个人,此时就需要在学生类复写Object类

里面的equals方法(非常重要!!!要注意!!)

(3)Set集合:

**Set接口里面存放的是元素是无序的,不可以有重复元素,可以包含null

**Set集合只有一种取出方式,就是迭代器Iterator

**Set集合功能和Collection是一致的,没有特殊方法

|--->HashSet:

**集合里面存放的元素是无序的,唯一的

**底层数据结构是哈希表,哈希表结构的数据都是无序的,哈希表结构的操作效率都高效

**线程不同步

**保证元素唯一性的原理是:通过复写hashCode和equals方法

****如果两元素的hashCode值相同,则继续判断两元素equals是否为真

****如果两元素的hashCode值不同,则不会调用equals方法。

**当我们往HashSet集合存放自定义的元素时(比如学生对象),通常都要复写hashCode和equals方法,

而且hashCode和equals方法不通过我们调用,HashSet集合底层内部自己调用,自己拿元素去比较 |--->TreeSet

**TreeSet集合可以对存放的元素进行排序,弥补了Set集合元素无序的缺点,且元素是唯一的

**底层数据结构是二叉树,二叉树结构都是有序的

**线程不同步

**TreeSet集合要求往集合里存放的元素自身具备比较性,否则会报错

**TreeSet集合保证元素唯一性的依据是:通过compareTo或者compare方法中的来保证元素的唯一性。

TreeSet排序的第一种方式:让元素自身具备比较性,

定义元素类实现Compareble接口,覆盖compare方法,

此方式是元素的自然顺序。

TreeSet排序的第二种方式:让集合具备比较性

当元素自身不具备比较性或者具备的比较性不是

我们所需要的比较性时,此时就需要让集合具备自定义的比较性。

那如何让集合自身具备比较性呢?

可在集合初始化时,就让集合具备比较方式。

即定义一个类,实现Comparator接口,覆盖compare方法。

注:

**判断元素唯一时,当主要条件一样时,判断次要条件

**两种排序方式都在时,以比较器为主!!!

(4)Map集合:

|--Hashtable

底层是哈希表结构

线程安全的,并且键和值不能为null。

|--HashMap

底层是哈希表结构

线程不安全的,键和值可以为null。

|--LinkedHashMap

底层是链表和哈希表

线程不安全

|--TreeMap

底层是二叉树

线程不安全的

12、如果你想将一组对象按一定顺序存取,在不考虑并发访问的情况下会使用____C_____ ,

反之则会使用____A_____;如果你想存储一组无序但唯一的对象,你会使用___B______ ;

如果你想按关键字对对象进行存取,在不考虑并发访问的情况下会使用___D______ ,反之则会使用_____E____。

A. Vector

B. HashSet

C. ArrayList

D. HashMap

E. Hashtable

13、泛型:

(1)为什么会出现泛型?

因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患,

如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题。

JDK1.5后出现了泛型,用于解决集合框架的安全问题。

泛型是一个类型安全机制。

(2)泛型定义格式:通过<>来定义要操作的引用数据类型

ArrayList<String> al = new ArrayList<String>;

(3)泛型的好处:

**将运行时期出现的ClassCastException(类型转换异常)问题转移到编译时期;

**避免了强制转换的麻烦

(4)什么时候定义泛型?

泛型在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用来接收类型的。

当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可

(5)泛型的形式

**泛型类:即自定义泛型类

A:当类中要操作的引用数据类型不确定时,早起定义Object来完成扩展,现在定义泛型来完成

B:局限性:泛型类定义的泛型,在整个类中有效,如果该泛型类的方法被调用,

当泛型类的对象明确要操作的类型后,所有要操作的类型就被固定。

**泛型方法:泛型放在返回值前面,修饰符的后面

A:为了避免泛型类的局限性,让不同方法可以操作不同的类型,而且类型还不确定,

则可以将泛型定义在方法上

B:特殊之处:静态方法不可以反问类上定义的泛型如果静态方法操作的应用数据类型不确定,可以讲泛型定义在静态方法上

**泛型接口:

当泛型定义在接口上时,则子类中要指定实现接口类型,同时还可以子类也可以定义为泛型类

(6)泛型的高级应用:?通配符

**当指定两种泛型的集合,则迭代时也要定义两种泛型的迭代器,麻烦,此时可通过将迭代器的泛型

改为?,如Iterator<?> it=al.iterator();

**两种泛型限定

向上限定: ? extends E ;E可以接收E类型或者E的子类

向下限定: ? super E ;E可以接收E类型或者E的父类

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();