----------------- android培训、java培训、期待与您交流!-----------------
集合框架--
java集合(Collection)就是用来存储对象的容器,不同的对象具有不同的数据结构,java中提供了几种常见的结构用来存储对象
Collection <E> 是所有collection层次结构中的根接口,
1 --List 有序的集合,允许重复元素,允许元素为null。凡有操作角标方法都是该集合体系下的方法,
因为该集合体系有索引。判断集合元素是否相同是使用equals()方法。
a -- Vector 底层是数组结构,线程同步,效率低,已被ArrayList取代。
b -- ArrayList 底层结构与Vector相同,但线程不同步,更安全。查询速度快,增删速度慢。
c -- LinkedList 底册是链表结构,增删速度快,查询速度慢,线程不同步。
2 --Set 无序的集合,不允许重复元素,最多允许一个null元素。Set实现的基础是hashMap结构。
a-- HashSet 底层结构是哈希表,线程不同步。
b-- TreeSet 底层结构是二叉树,特点有序集合(有默认的自然排序,也可自定义比较器排序)。
Map<k,v> 一个不是Collection体系的接口,map提供key到value的映射关系。一个map不能包含相同的key,每个key与value相对应。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
1 -- HashTable 底层基于哈希表 ,键,值 不能为空。线程同步,jdk1.0出现,效率低。已被1.2的HashMap取代。
2 -- HashMap 底层基于哈希表,允许键值为空(只有一个),线程不同步。
3 -- TreeMap 底层基于二叉树,线程不同步。可对集合中对象进行排序。
这就是java集合的一个大致常用的使用集合容器,这些多个容器的出现,不同的数据有着不同的数据结构,他们有着不同的存储方式。
在看看Collection定义了集合框架的共性方法:
1,添加add(e);addAll(collection);
2,删除 remove(e);removeAll(collection);clear();
3,判断。contains(e); isEmpty();
4,获取 iterator();size();
5,获取交集。retainAll();
6,集合变数组。toArray();
下面来来具体看看List集合的使用方式与应用
1 ArrayList ArrayList实现了可变大小的数组。每个ArrayList实例都有一个容量,即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加。
<span style="font-size:14px;"> /**
* ArrayList 基本使用方式
*/
public static void arraylistD(){
ArrayList<String> al =new ArrayList<String>();
al.add(0,"a1"); al.add("a2");al.add("a3");al.add("a4"); //添加数据--可在指定位置添加
al.remove(0); //删除指定位置数据
al.set(1, "new a1"); //修改数据
al.get(2); //获取指定位置数据
al.indexOf("a3"); //获取数据的位置
System.out.println(al);
// al.clear(); //清除集合元素
// 迭代器---就是集合元素的 取出方式
for (Iterator<String> it = al.iterator(); it.hasNext();) {
//迭代器的使用,用于便利元素----迭代时,只能使用迭代器中的方法,是不能使用集合对象中的方法来操作元素的
String s=it.next();
// it.remove();
System.out.println(s);
}
// Iterator<>迭代器中的方法有限,hasNext()、next()、remove()只能对元素进行判断,取出,删除。不能进行添加,修改的操作
// 这时如果要进行添加修改那么就要使用List集合体系特有的迭代器
for (ListIterator<String> it = al.listIterator(); it.hasNext();) {
String s = it.next();
if (s.equals("a2")) {
it.set("set aa");
// it.add("00000");
}
System.out.println(s);
}
}</span>
2 LinkedList
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的 获取,删除,添加方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
下面看看具体代码
/**
* LinkedList 特有方法演示
*/
public static void linkedlistD(){
LinkedList< String> link =new LinkedList<String>();
link.addFirst("addFirst 1"); //在前|后添加元素
link.addLast("addLast 2");
link.offerFirst("offerFirst 3"); //jdk1.6新方法
link.offerLast("offerLast 4");
System.out.println(link);
//获取元素方法,但不删除元素,无元素则报异常NoSuchElementException
System.out.println(link.getFirst() +"--get--"+ link.getLast());
//jdk1,6-获取元素,不删除元素,无元素则返回null
System.out.println(link.peekFirst() +"--peek--"+link.peekLast());
//获取元素,不删除元素,若无元素则报异常NoSuchElementException
System.out.println(link.removeFirst() +"--remove--"+link.removeLast());
//jdk1.6-获取元素,但元素会被删除,若无元素则返回null
System.out.println(link.pollFirst()+"--poll--"+link.pollLast());
}
再来看看一个用链表进行简单的堆栈和队列模拟
<span style="font-family:Arial;font-size:12px;">/**
* 使用LinkedList模拟队列结构
*/
class Duilie{
private LinkedList<Object> linkedList;
Duilie(){
linkedList = new LinkedList<Object>();
}
public void rudui(Object o){
linkedList.addLast(o);
}
public Object chudui(){
return linkedList.removeFirst();
}
public boolean isNull(){
return linkedList.isEmpty();
}
}
/**
* 使用LinkedList模拟堆栈结构
*/
class Duizhan{
private LinkedList<Object> linkedList;
Duizhan(){
linkedList = new LinkedList<Object>();
}
public void jinzhan(Object o){
linkedList.addLast(o);
}
public Object chuzhan(){
return linkedList.removeLast();
}
public boolean isNull(){
return linkedList.isEmpty();
}
}
public class LinklistTest {
public static void main(String[] args) {
Duilie d =new Duilie();
d.rudui("zhy 0"); d.rudui("zhy 1");
d.rudui("zhy 2"); d.rudui("zhy 3");
System.out.println("队列--");
while (!d.isNull()) {
print(d.chudui());
}
print("堆栈--");
Duizhan dz = new Duizhan();
dz.jinzhan("zhy 0"); dz.jinzhan("zhy 1");
dz.jinzhan("zhy 2"); dz.jinzhan("zhy 3");
while (!dz.isNull()) {
System.out.println(dz.chuzhan());
}
}
}</span>
ArrayList和LinkedList总结1 ArrayList是基于动态数组的数据结构,LinkedList基于链表的数据结构。
2 对于访问查询数据,ArrayList要优于LinkedList,因为LinkedList只能移动指向标(c中指针)一个一个的去查询
3 对于要对数据进行增删操作,那么LinkedList要优于ArrayList,因为ArrayList要移动数据而LinkedList只要断开或添加指向
特殊条件时-----若只对单个数据插入或删除,ArrayList的速度反而优于LinkedList。
添加删除数据越来,LinkedList的效果越明显