java集合框架

List结构的集合类

ArrayList类,LinkedList类,Vector类,Stack类。

import java.util.*;//集合类基本上在 util 包中

1.ArrayList类

无同步性,线程不安全
相当于C++的vector,只能存储对象。
//定义 ArrayList 对象
ArrayList al=new ArrayList();
在这里插入图片描述

2.LinkedList类

比ArrayList更灵活,可以添加到表头,也可以添加到表尾。

LinkedList al=new LinkedList();
al.addFirst(emp1);//addFirst 方法是可以插入在数组之前
a1.addFirst(emp2);//addLast 表示把 emp3 加载(链表)队列的后面
al.remove(emp1);//将 ll 中的 emp1 数据删除
al.removeAll(ll);//清除整个链表

3.Vector类

具有同步性,线程安全,同一时刻只有一个线程可以访问。
vector和ArrayList类似,但不同是vector是同步访问,包含许多传统方法,不是框架。

Vector vv=new Vector();
vv.add(emp1);
vv.get(0);

Java中Vector和ArrayList的区别

首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下:

1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
2.Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
3.LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
4.vector是线程(Thread)同步(Synchronized)的,所以它也是线程安全的,而Arraylist是线程异步(ASynchronized)的,是不安全的。如果不考虑到线程的安全因素,一般用Arraylist效率比较高。
5.如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度
的50%.如过在集合中使用数据量比较大的数据,用vector有一定的优势。

6.如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是0(1),这个时候使用vector和arraylist都可以。而
7.如果移动一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑到使用Linkedlist,因为它移动一个指定位置的数据
所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)。
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,
都允许直接序号索引元素,但是插入数据要设计到数组元素移动 等内存操作,所以索引数据快插入数据慢,
Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差
,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!

7.笼统来说:LinkedList:增删改快
ArrayList:查询快(有索引的存在)
list::保存大量数据

4.Stack类

Stack stack=new Stack();
Stack stack=new Stack();
stack.get(0)

Map结构类

HashMap 类,Hashtable 类

1.HashMap 类

主要采用键值结构。

HashMap hm=new HashMap();
hm.put("s001", emp1);//不允许key重复,重复覆盖
hm.containsKey("s002")//判断是否有这个key
Emp emp=(Emp)hm.get("s002");//取这个key的值
迭代器遍历:
//遍历 HashMap 中所有的 key 和 value 值
//Iterator 迭代
Iterator it=hm.keySet().iterator();
//hasNext 返回一个 boolean 值
while(it.hasNext()){
	//如果有下一个取出 key 值
	String key=it.next().toString();
	//通过 key 取出 value
	Emp emp=(Emp)hm.get(key);
	System.out.println("名字:"+emp.getName());
	System.out.println("工资:"+emp.getSal());
}

2.Hashtable 集合类

同步性线程安全

//遍历
for(Iterator it=ht.keySet().iterator();it.hasNext();){
	String key=it.next().toString();
	Emp emp=(Emp)ht.get(key);
	System.out.println("名字:"+emp.getName()+"\t 工资:"+emp.getSal());
}

HashMap 和 e Hashtable 集合类的区别

HashMap 与 Hashtable 都是 java 的集合类,都可以用来存放 java 对象,这是他们的相同点,但是
他们也有区别。
1、历史原因
Hashtable 是基于陈旧的 Dictionary 类的,HashMap 是 java 1.2 引进的 Map 接口的一个实现。
2、同步性
Hashtable 是线程同步的。这个类中的一些方法保证了 Hashtable 中的对象是线程安全的。而
HashMap 则是线程异步的,因此 HashMap 中的对象并不是线程安全的。因为同步的要求会影响执行的效
,所以如果你不需要线程安全的集合那么使用 HashMap 是一个很好的选择,这样可以避免由于同步带
来的不必要的性能开销,从而提高效率。
3、值
HashMap 可以让你将空值作为一个表的条目的 key 或 value 但是 Hashtable 是不能放入空值的
(null)

如何选用集合类?

1、要求线程安全,使用 Vector、Hashtable
2、不要求线程安全,使用 ArrayList,LinkedList,HashMap
3、要求 key 和 value 键值,则使用 HashMap,Hashtable
4、数据量很大,又要线程安全,则使用 Vector

set集合类

HashSet类,TreeSet类
无序,不重复

HashSet<Emp> hs=new HashSet<Emp>();
Emp emp1=new Emp("s001","aa",1.2f);
hs.add(emp1);
//转换数组 o[],遍历并输出 HashSet 中的元素
Object o[]=hs.toArray();
for(int i=0;i<o.length;i++){
	System.out.println(" 工 号 :"+((Emp)o[i]).getEmpNo()+"\t 姓名:"+((Emp)o[i]).getName()+"\t 工资:"+((Emp)o[i]).getSal());
}

没有get方法获取元素,只能采用迭代器equal获取。

HashSet类

TreeSet 集合类是一个有序集合,它的元素按照升序排序,默认是自然顺序排列,也就是说
TreeSet 中的对象元素需要实现 Comparable 接口。TreeSet 与 HashSet 类一样没有 get()方法来获取列
表中的元素,所以也只能通过迭代器方法来获取。
由于 TreeMap 需要排序, 所以需要一个 r Comparator 为键值进行大小比较,当然也是用 Comparator 定
位的 Comparator 可以在创建 TreeMap 时指定,这时排序时使用 Comparator.compare
如果创建时没有指定 Comparator 那么就会使用 key.compareTo()方法,这就求 要求 y key 必须实现
e Comparable 接口
p TreeMap 是使用 e Tree 数据结构实现的,所以使用 compare 接口就可以完成定位了。

HashSet 与 TreeSet 集合类的区别:

HashSet 是基于 hash 算法实现的,性能优于 TreeSet。通常使用 HashSet,在我们需要对其中元素排序
的时候才使用 TreeSet。

Queue 结构的集合

add增加一个元索如果队列已满,则抛出一个 IIIegaISlabEepeplian 异常
remove移除并返回队列头部的元素如果队列为空,则抛出一个 NoSuchElementException异常
element返回队列头部的元素如果队列为空,则抛出一个 NoSuchElementException异常
offer添加一个元素并返回 true如果队列已满,则返回 false
poll移除并返问队列头部的元素如果队列为空,则返回 null
peek返回队列头部的元素如果队列为空,则返回 null
put添加一个元素如果队列满,则阻塞
take移除并返回队列头部的元素如果队列为空,则阻塞

offer ,add 区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的
offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由
offer() 返回的 false。
poll ,remove 区别:
remove()和 poll()方法都是从队列中删除第一个元素(head)。remove()的行为与 Collection 接口的
版本相似,但是新的 poll()方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适
合容易出现异常条件的情况。
peek ,element 区别:
element()和 peek()用于在队列的头部查询元素。与 remove()方法类似,在队列为空时,element()抛
出一个异常,而 peek()返回 null。

Java 中的 List/Set 和 Map 的区别

List 按对象进入的顺序保存对象,不做排序和编辑操作。
Set 对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于 Set,而不关心它的顺序–否则使用 List)。
Map 同样对每个元素保存一份,但这是基于"键"(key)的,Map 也有内置的排序,因而不关心元素添加的顺序。
如果添加元素的顺序对程序设计很重要,应该使用 LinkedHashSet 或者 LinkedHashMap。

Iterator迭代器:

Iterator 示例:
	Collection c=new ArrayList();
		c.add("abc");
		c.add("xyz");
		for(Iterator it=c.iterator();it.hasNext();){
			String s=(String)it.next();
			System.out.println(s);
	}

如果你把第一行代码的 ArrayList 换成 LinkedList 或Vector,剩下的代码不用改动一行就能编译,
而且功能不变,这就是针对抽象编程的原则:对具体类的依赖性最小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值