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
- [ java ] java基础集合!
- JAVA基础之集合
- java基础之集合
- java基础:集合connection
- java基础之 集合
- java基础10 集合
- java基础--集合
- java基础---集合类
- java基础知识点集合
- java基础 集合迭代器
- JAVA基础之集合
- Java集合框架基础
- java基础--HashSet集合
- java基础_09_集合
- 【Java基础】集合
- Java基础之 集合
- java基础__集合
- JAVA基础集合
- SAT数学:必背公式之三角函数
- 封装,继承和多态
- 学习Android切割图片并保存到项目文件夹
- 彻底解决Spring MVC 中文乱码 问题
- UVALive 3135--Argus+自定义优先队列的优先规则
- JAVA基础--集合
- 解读XMP-元数据在ALAssetRepresentation
- PL/SQL Developer 连接远程的Oracle 服务器
- Netflix工程总监眼中的分类算法:深度学习优先级最低
- #ifndef、#def、#endif说明
- cocos2d-x3.0 + vs2012环境配置
- Android 自定义侧滑菜单
- gradle多渠道打包及友盟统计-eclipse版本
- GRE作文——看门见山直述观点