集合框架 泛型

泛型:需要定义一个类,可以接收所有的数据类型,使用object可以达到要求,泛型只允许设置引用数据类型,如果要定义基本数据类型则可以使用基本数据类型的包装类完成,进行引用传递的时候,如果设置泛型则只能接收泛型设置的类型,但是这样做方法意义很受局限,如果不设置泛型,接收到的内容可以被随意修改,容易发生安全问题,对于以上问题解决,可以使用泛型通配符来完成, <?> 代表可以接收任意类型,但是不能任意修改

 

 

 

 

 

 

 

 

Collection接口

下面的子接口  List   Set 的实现子类 

List接口:  ArrayList   LinkedList   

Set接口:    TreeSet  HashSet    TreeSet 有序的 HashSet无序

ArryList  有序的 ,可重复的, 顺序为增加的时候的顺序

Set  无序的 不可重复的   TreeSet 通过实现Comparable接口可对属性进行排序

Map接口

Map同样为接口,接口不能直接使用,必须通过实现类完成使用,在Map存在如下的实现类:

HashMap   TreeMap  LinkedHashMap

HashMap也是最常见的子类,它的特点为:无序存储

HashMap 底层是哈希表数据结构,线程不同步不安全,代替了hashtable,可以存null键值

Hashtable :主要和HashMap对比,古董类.哈希表数据结构,线程同步安全,不可以存储null键和值

LinkedHashMap:继承了HashMap,同样实现Map接口,可以有序的(类似ArratList的)存放数据

TreeMap:底层二叉树结构,可以对map集合的键进行指定顺序的排序,按照key进行排序,进行排序的时候必须配合comparable接口使用

Vector   和 ArrayList的区别 ? 

线程安全  Vector  效率低   遍历: Enumeration

非线程安全    ArrayList 效率高   ListIterator

Map集合:不是Collection接口的子接口 自己独立的接口就是Map

TreeMap  HashMap  HashTable  LinkedHashMap

HashMap  HashTable的区别?

线程安全 HashTable   key或者 value 不允许为null

非线程安全 HashMap  key或者 value允许为null

TreeMap 可以按照key进行排序 ,必须实现Comparable接口

LinkedHashMap  可以顺序存储 ,顺序为存放的顺序

Map的特点: 是以键 值 对 存储的 ,Key 唯一的 不能重复的  value是可以重复的

集合的输出:

Iterator  迭代输出(推荐使用)

Foreach 增强for循环

ListIterator 双向迭代(了解即可) 只能在List接口中使用

Enumeration 枚举输出  只能用在Vector类中(了解)

1.什么是集合框架:集合框架就是用于存储数据的容器

特点:对象封装数据,对象多了也需要存储,结合用于存储对象,但是对象个数确定的时候可以用数组,不确定就用可变长度的集合

集合只能存储引用数据类型,存储的对象可以是不同的数据类型

2.数据结构:容器中存储数据的方式,集合容器在不断向上抽取过程中形成了集合体系

3.Java.util Collection接口:

子接口为List 和Set

List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引,元素可以重复

Set: 无序 (存入和取出顺序可能不一致),不可以存取重复元素,必须保证元素唯一性

方法:

添加 :add(Object) addAll(collection)添加一个集合中所有元素

删除: clear(); remove() 注意:删除成功集合的长度会改变 removeAll()

判断:boolean contains(obj) 集合中是否包含某指定的元素 boolean isEmpty()

获取:int size()集合中有几个元素

获取集合中全部的元素: Iterator iterator()迭代器

将集合变成数组:toArray()

iterator接口 : Iterator it = coll.iterator()//获取容器中迭代对象

将容器内部取出方法按照一个统一的规则向外提供形成的接口

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

for(Iterator it = coll.iterator();it.hasNext(); ){

System.out.println(it.next())

4.List: 有序, 元素有索引,元素可以重复

ArrayList:底层数据结构为数组,线程不同步,查询速度快

LinkedList:底层数据结构为链表,线程不同步 ,增删元素速度块

Vector:底层数据结构为数组,线程同步,查询增删都慢,已被Arraylist替代

方法:add(index,element) remove(index)

Object get(index)获取指定索引元素

List sublist(start,end)获取子列表

int indexOf(obj) :获取指定元素第一次出现的索引位,如果该元素不存在返回-1;所以,通过-1,可以判断一个元素是否存在

修改:Object set(index,element) :对指定索引位进行元素的修改

获取所有元素:

ListIterator listIterator():list 集合特有的迭代器。

LinkedList特别的方法:addFirst() addLast() removeFirst

pollFirst();获取链表中的第一个元素,但是会删除链表中的第一个元素

peekFirst();获取链表中的第一个元素。如果链表为空,返回 null。

可变长度数组的原理:当元素超出数组长度,会产生一个新的数组,将原数组的数据复制到新数组之中,再将新的元素添加到新数组中 arraylist元素住50%延长,初始容量10,vector按照原数组100%延长

5.Set接口:方法和Collection中一致,但是set接口取出只能用迭代器

HashSet:底层数据结构哈希表,线程不同步,无序,高效 ,子类LinkedHashSet:有序

TreeSet:对Set集合中元素进行制定顺序排序,不同步,底层是二叉树

TreeSet集合排序的两种方式Comparable和Comparator

1:让元素自身具备比较性,需要元素对象实现 Comparable 接口,覆盖compareTo 方法。

2:让集合自身具备比较性,需要定义一个实现了 Comparator 接口的比较器,并覆盖 compare 方法,并将该类对象作为实际参数传递给 TreeSet 集合的构造函数。第二种方式较为灵

保证元素唯一性:通过元素的hashcode方法和equals方法完成的,hashcode值相同去判断equals

6

put方法的返回值,反回的是map中存在相同key的原始数据,如果map中没有相同的key则反回null  如果存在相同的key反回的内容会第一次key的value

Map集合存储和Collection不同:

Collection一次存储一个元素,Map一次存储一对

Collection 是单列集合;Map 是双列集合。Map 中的存储的一对元素:一个是键,一个是值,键与值之间有对应(映射)关系。特点:要保证 map 集合中键的唯一

方法: put(key,value)当存储的键相同时,新的值会替换老的值,并将老值返回,没有键重复,返回null

remove() boolean cintainsKey() containsvalueValue()

取出 int size() 返回长度 value get(key)

获取Map中的所有元素:

Map 没有迭代器,将Map转化为具有迭代器的set集合.,之所以转成set,是因为Map具备键值唯一性,set集合底层用的就是map的方法

取出 map 集合中所有元素的方式:entrySet()方法。

Set entrySet = map.entrySet();

Iterator it = entrySet.iterator();

while(it.hasNext()) {

Map.Entry me = (Map.Entry)it.next();

System.out.println(me.getKey()+"::::"+me.getValue()

使用集合的技巧:

看到Array就是数组结构,有角标,查询速度很快

看到link就是链表结构 增删快,而且特有的方法 addFirst() removeFirst() getFirst()......

看到hash就是哈希表,就想到哈希值,就想到唯一性,就想到存入该结构的元素必须覆盖hashCode,equals方法

看到tree就是二叉树,就要想到排序,就要想到用到比较

两种比较方式

comparable:覆盖了compareTo方法

comparator:覆盖compare方法

LinkedHashSet LinkedHashMap这两个集合保证存入顺序和取出顺序一致,保证哈希表有序

什么时候使用集合:

存储的是一个元素就用Colection 存储对象存在映射关系时就是用Map集合

保证唯一性就用Set 不保证唯一就用List

将集合变成数组好处:限定了对集合中的元素进行增删操作,只要获取这些元素即可

增强 for 循环:foreach 语句,foreach 简化了迭代器。

格式:// 增强 for 循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭

代的容器

for( 元素类型 变量名 : Collection 集合 & 数组 ) { …

}

高级 for 循环在使用时,必须要明确被遍历的目标

TreeSet是可以实现排序的,但是前提是排序的类必须实现Comparable接口(排序)重写comparto方法(去重),只有实现了此接口才能确认出对象的大小TreeSet是通过comparable接口里面comparTo方法是否反回0来确认重复元素的存在

HashSet它的重复元素是依靠HashCode 以及equals方法来确认重复元素的

Map.Entry接口

虽然现在已经清楚了Map的基本的操作,但是还要清楚Map的数据到底是如何存储的,

通过观察源码发现Map都被封装在Map.Entry里面,在Map接口里面静态方法 public static Map.Entry

在这个Map.Enrty 是一个接口,在这个接口里面存在两个重要的操作方法

获取Key  public K getKey();

获取Value public V getValue();

在map集合里面,map.enrty的主要作用就是把key 和value进行包装使用

使用Iterator遍历Map

1利用Map中提供的entrySet把Map变为Set集合

2 利用Set接口中Iterator 方法Set集合变为Iterator迭代

3 利用Iterator 迭代输出每一组map.entry ,通过getKey 和 getValue

//1 通过map中的entrySet 把一个map变为set集合

Set<Map.Entry<String, Integer>> set=map.entrySet();

//2 通过Set接口中Iterator方法把set变为iteratro迭代

Iterator<Map.Entry<String, Integer>> iter=set.iterator();

while(iter.hasNext()) {

//3 迭代map.entry

Map.Entry<String, Integer> me=iter.next();

//分别输出key  和 value 通过getKey  和 getValue

System.out.println(me.getKey());

System.out.println(me.getValue());

}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值