JAVA基础--集合

来源:互联网 发布:linux altium designer 编辑:程序博客网 时间:2024/05/12 08:12

集合的基本接口是Collection接口。

public interface Collection<E>{    boolean add(E element);    Iterator<E> iterator();    ....}

1.迭代器Iterator

调用next()之前,先调用hasNext()方法;

 java迭代器认为处于两个元素之间,当调用next()时候,迭代器就越过下一个元素,并返回刚刚越过那个元素的引用。

2.删除元素

Iterator iterator = c.iterator();iterator.next();iterator.remove();

大部分集合类实现了Collection接口,Map相关的集合类实现了Map接口。

常见的集合

1)链表--有序,插入删除方便

List<String> staff = new LinkedList<String>();staff.add("Aron");staff.add("Bob");staff.add("Carl");Iterator<String> iterator = staff.iterator();String first = iterator.next();String second = iterator.next();iterator.remove();System.out.println(staff);
Collection接口的add方法,默认在链表的最后添加元素。如果每次想在Iterator当前位置添加元素,需要使用ListIterator接口

List<String> staff = new LinkedList<String>();staff.add("Aron");staff.add("Bob");staff.add("Carl");Iterator<String> iterator = staff.iterator();ListIterator<String> it = staff.listIterator();String first = it.next();String second = it.next();it.remove();it.add("Dell");System.out.println(staff);//结果[Aron,Dell,Carl]

注意:调用next()之后,remove将删除迭代器左侧的元素,调用previous之后,remove将删除迭代器右侧的元素。

set方法会用一个新元素取代上一个返回的元素

String oldValue = it.next();

it.set(newValue);

链表程序

List<String> a = new LinkedList<String>();a.add("Aron");a.add("Carl");a.add("Eric");List<String> b = new LinkedList<String>();b.add("Bob");b.add("Doug");b.add("Frances");b.add("Gloria");// 两个链表合并ListIterator aIter = a.listIterator();Iterator bIter = b.iterator();while (bIter.hasNext()) {if (aIter.hasNext()) {aIter.next();}aIter.add(bIter.next());}System.out.println(a);// 每隔一个元素删除一个元素bIter = b.iterator();while (bIter.hasNext()) {bIter.next();if (bIter.hasNext()) {bIter.next();bIter.remove();}}System.out.println(b);a.removeAll(b);System.out.println(a);

为什么要用ArrayList取代vector?

原因:Vector类的所有方法都是同步的。可以由两个线程安全的访问一个Vector对象。但如果由一个线程访问Vector,代码要再同步上耗费大量时间。ArrayList方法是不同步的,因此建议在不需要同步时使用ArrayList, 而不要使用Vector。

2)散列集--查找方便,无法控制元素顺序

java中散列表使用链表数组实现,散列表为每一个对象计算一个整数,称为散列码。

要查找某个元素的位置,先计算散列码,然后与列表总数取余,如果该列表已有元素(散列冲突),这时与列表中所有对象进行比较,查看这个对象是否存在。

如果散列表太满,就需要再散列装填因子(默认0.75)决定何时再散列。

/** * <span style="color:#ff0000;">List基于链表,HashSet基于散列表,TreeSet基于红黑树,双端队列基于ArrayDeque和LinkedList,优先级队列基于堆</span> */public static void main(String[] args) {Set<String> words = new HashSet<String>();long totalTime = 0;int num = 0;String strs = "asdfcxadsfwefzsd";for (char word : strs.toCharArray()) {long callTime = System.currentTimeMillis();words.add(word + "");callTime = System.currentTimeMillis() - callTime;totalTime += callTime;}Iterator<String> iter = words.iterator();for (int i = 0; i <= 20 && iter.hasNext(); i++) {System.out.println(iter.next());}System.out.println("......");System.out.println(words.size() + " distinct words. " + totalTime+ " milliseconds");}
3.树集--构建时候,可以构建一个带比较器的树。 

/** * 可以通过实现Comparable接口,自定义排列顺序 * */public class App implements Comparable<String> {public static void main(String[] args) {SortedSet<String> sort = new TreeSet<String>();sort.add("aaa");sort.add("bbb");sort.add("ccc");for (String s : sort) {System.out.println(s); // 按顺序输出}}public int compareTo(String str) {return this.hashCode() - str.hashCode(); //在一个小的范围内,可以使用。否则X-Y可能会溢出}}
//带比较器的树SortedSet<String> sort = new TreeSet<String>(new Comparable<Item>(){public int compare(Item a, Item b){String desA = a.getDescription();String desB = b.getDescription();return desA.compareTo(desB);}});






0 0
原创粉丝点击