java集合框架总结

[color=red]一.Conllection
[/color] Conllection是java.util下的接口,是java中集合的父接口,谈到Conllection,我们就会想起Conllections,他们有什么区别,Conllections是java.util下的一个类,包含着java中对集合操作的各种静态方法。而这次蓝杰上课主要讲了Conllection接口下几个常用和比较重要的接口和这些接口下的几个实现类,下面主要介绍这几个接口和类的用法和区别。


[color=red]二,Conllection下的子接口
[/color]
1.Set
2.List
注意点:Map不是Conllection的子接口。


[color=red]三.Set的常用实现类及用法[/color] 1.Set是没有重复项目无序的集合(及Set中没有重复的元素)
2.set接口下常用的实现类有HashSet、LinkedHashSet、TreeSet。
下面以HashSet为实例介绍Set用法。


Set是接口所以是不能用来实例化对象的,所以实例化对象用其实现类
Set set=new HashSet(); 这样一个Set对象就有了。


我们知道集合的作用是我们可以利用它来放置元素,下面以元素(Student类对象)为实例介绍[color=red]如何向Set中添加元素[/color]。 由于java中为集合都提供的泛型机制,所以上面的实例化可以修改成
Set<Student> set=new HashSet();
set中提供了添加元素add()方法,所以set.add(new Student());便可完成对元素的添加


那么怎么在set中寻找到我们需要的元素呢?
这个要求遍历set,和数组不一样,set中元素是无序的,所以一个简单的for循环使不能遍历set的,[color=red]java中为set提供了遍历set的迭代器Iterator[/color]
Public interface Iterator{ 

  Public Boolean hasNext(};

  Public Object next(};

 Public void remove(};

}

hashNext(),下一个位置是否有元素,有便返回true,否则返回false,
next(),返回下一个元素
remouve()删除下一个元素
有了这个迭代器和这些方法我们就可以实现在set寻找元素了。
以下是代码:
//获取迭代器
Iterator iterator=hashset.iterator();
while(iterator.hasNext()){
Student stu=(Student) iterator.next();
if(stu.getScore()==score){
System.out.println(stu.toString());
}
}



同样的要[color=red]删除set中指定的元素[/color],调用remove方法就行了,代码如下:
//获取迭代器
Iterator iterator=hashset.iterator();
//实例化一个新的Hashset对象,用来存储要删除的对象
HashSet hashset2=new HashSet();
while(iterator.hasNext()){
//获取学生对象
Student stu=(Student) iterator.next();
if(stu.getScore()<score){
iterator.remove();
}
}

set中还提供了[color=red]removeall(Conllect<> c),[/color]方法,所以在删除学生时,可以再实例化一个新的set对像,将符合条件的学生先保存在新的set对象中,在调用removeall()方法同样也可以实现。
[color=red]注意[/color]:不能在利用iterator得到符合条件的学生对象时,用set.remove(stu);来删除学生对象,这样是不允许的。这样做会抛出“ConcurrentModificationException”这样的异常,当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。


[color=red]四、List有序允许有重复元素的集合[/color]
常用实现类有:ArrayList、LinkedList
ArrayList的用法和Vector相差无几,用for循环便能完成迭代。故利用ArrayList对学生信息的增删改查这边就不做介绍。
[color=red]注意点[/color]在迭代时,因为每次删除一个元素后,ArrayList的长度也就相应的减少了1,所以如果简单的用for(int i=0;i<arraylist.size();i++){}这样去迭代是不行了,因为每次去掉一个元素,arraylist中的所有元素就进了以为,当再i++时就一次跳过两次就使有些元素没有做判断,直接跳过了。所以i++只能放在没有删除元素的条件下进行.
以下是代码:
//定义一个删除学生信息的方法
public void remove(ArrayList<Student> arraylist,int score){
//遍历arraylist删除学生学分小于score的学生信息
for(int i=0;i<arraylist.size();){
//获取学生对象
Student stu=arraylist.get(i);
if(stu.getScore()<score){
arraylist.remove(i);
}else{
i++;
}
}
}


[color=red]五、Map[/color] 用于关键字/数值对,像个Dictionary
[color=red]常用实现类[/color]:HashMap、LinkedHashMap、TreeMap
要用Map实现对学生信息的增删改查和上面所介绍的差别比较大,Map中没有add()方法,与之对应的是put(key,value)方法,参数是一对k-v组合。而要获取map中指定元素只能用get(key)方法,该方法返回与key对应的value,所以在对学生信息查找和删除这一块要利用到[color=red]map中keyset()方法[/color],获取存储key的set,利用set便可获取我们要查找和删除的value对应的key,在利用remove(key),便可完成我们要的操作。
下面是代码:
//定义录入学生信息的方法
public void mapAdd(Map<String,Student> map){
//实例化一个产生随机数的对象,给学生的学分赋值
Random rand=new Random();
//实例化学生对象
for(int i=0;i<20;i++){
Student stu=new Student("姓名是:"+(char)(65+i),rand.nextInt(20));
map.put(stu.getName(), stu);
}
}

//定义查找学生信息的方法
public void chaozhao(Map<String,Student> map,int score){
//获取keyset
Set<String> set=map.keySet();
//获取set中的迭代器
Iterator<String> iterator=set.iterator();
System.out.println("学分为"+score+"的学生是:");
//利用迭代器进行迭代
while(iterator.hasNext()){
//获取key
String key=iterator.next();
//根据key获取学生对象
Student stu=map.get(key);
if(stu.getScore()==score){
//输出符合条件学生的信息
System.out.println(stu.toString());
}
}
}

public void remove(Map<String,Student> map,int score){
//获取map中keyset
Set<String> set=map.keySet();
//从获取的keyset中获取迭代器
Iterator<String> iterator=set.iterator();
//利用迭代器进行迭代
while(iterator.hasNext()){
//获取key对象
String key=iterator.next();
//根据key获取学生对象
Student stu=map.get(key);
if(stu.getScore()<score){
iterator.remove();
}
}

}

结合上面对set的操作,就显得非常简单了,map对学生信息的增删改查不是直接的,而是利用keyset(),而后利用这个set里面的key,在调用remove(),get()等方法间接完成操作。


以下是我在网上找到的一些关于java集合框架的介绍:
[color=red]浅谈JAVA集合框架 [/color]Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection classes)。集合在java中非常重要,在讨论之前,先来看几个面试中的经典问题。
1 Collection 和 Collections的区别。
2 List, Set, Map是否继承自Collection接口。
3 ArrayList和Vector的区别。
4 HashMap和Hashtable的区别。

篇尾有答案,我们开始正题。

[color=red]集合Collection接口[/color]

--Collection 是任何对象组,元素各自独立,通常拥有相同的套用规则。Set List由它派生。


基本操作 增加元素add(Object obj); addAll(Collection c);

删除元素 remove(Object obj); removeAll(Collection c);

求交集 retainAll(Collection c);

删除元素 remove(Object obj); removeAll(Collection c);

求交集 retainAll(Collection c);

访问/遍历集合元素的好办法是使用Iterator接口(迭代器用于取代Enumeration)

Public interface Iterator{

  Public Boolean hasNext(};

  Public Object next(};

 Public void remove(};

} [color=red] 集set [/color]--没有重复项目的集合

有三种特定类型的集可用

HashSet-基于散列表的集,加进散列表的元素要实现hashCode()方法

LinkedHashSet-对集迭代时,按增加顺序返回元素

TreeSet-基于(平衡)树的数据结构

[color=red]清单List [/color]--位置性集合。加进清单的元素可以加在清单中特定位置或加到末尾

有两个特定版本


ArrayList(数组表)-类似于Vector,都用于缩放数组维护集合。区别:

一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

LinkedList(链表)-是双向链表,每个节点都有两个指针指向上一节点和下一节点。

用在FIFO,用addList()加入元素 removeFirst()删除元素
用在FILO,用addFirst()/removeLast()

ListIterator提供双向遍历next() previous(),可删除、替换、增加元素

[color=red]映射表Map [/color]
--用于关键字/数值对,像个Dictionary

处理Map的三种集合

关键字集KeySet()

数值集value()

项目集enrySet()

[color=red]四个具体版本 [/color]

HashMap-散列表的通用映射表

LinkedHashMap-扩展HashMap,对返回集合迭代时,维护插入顺序

WeakHashMap-基于弱引用散列表的映射表,如果不保持映射表外的关键字的引用,则内存回收程序会回收它

TreeMap-基于平衡树的映射表

HashMap-散列表的通用映射表

LinkedHashMap-扩展HashMap,对返回集合迭代时,维护插入顺序

WeakHashMap-基于弱引用散列表的映射表,如果不保持映射表外的关键字的引用,则内存回收程序会回收它

TreeMap-基于平衡树的映射表
Collections类,用于同步集合,还能改变集合只读方式的类
e.g.:


Map mp=new HashMap();

mp=Collections.synchronizedMap(mp); //生成线程安全的映射表

mp=Collections.unmodifiableMap(mp); //生成只读映射表 Comparable 自然顺序的排序类 Comparator 面向树的集合排序类

容器分类学(Container taxonomy)

集合接口: Collection List Set;Map Iterator ListIterator。

抽象类: AbstractCollection AbstractList AbstractSet AbstractMap AbstractSequentiaList。

老版本中的集合类型

[color=red]Vector类 [/color]

Vector,就是向量。一种异构的混合体,可以动态增加容量。对它的操作简要如下

比如我们有一个Vector: Vector myVec=new Vector(a_Array.length)

取得vector的长度:myVec.size();

赋值:set(int position,Object obj) / setElementAt(Object obj, int position) –不支持动态增长

add(Object obj )/ addElement(Object obj) 在Vector末尾加入对象

e.g.:myVec.add(new a_Array[0]);

取出元素:get(int position) / getElement(int position)

Stack类

是Vector的子类。就是数据结构里讲滥了的堆栈(这个词可简称栈,不要混淆于heap-堆)。后进先出的存取方式。

Stack()构造空栈

Empty()叛空

Search()检查堆栈是否有元素

Peek()取得栈顶元素

Pop()弹栈

Push()入栈

Enumeration接口

Dictionary类

字典。关键字/数值方式存取数据,如果映射没有此关键字,取回null。

Hashtable类

是Dictionary结构的具体实现。

[color=red]面试题答案 [/color]

Collection 和 Collections的区别。

Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。

Collection是个java.util下的接口,它是各种集合结构的父接口

List, Set, Map是否继承自Collection接口? List,Set是 Map不是

[color=red]ArrayList和Vector的区别。[/color]
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

HashMap和Hashtable的区别
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现


二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的


三.值:只有HashMap可以让你将空值作为一个表的条目的key或value
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值