本文主要介绍JAVA中常见容器间的关系和主要区别。JAVA中的容器种类很多,且各有特点。为此特意进行学习研究,写下此文,作为一点总结。若有错误,欢迎拍砖。
上图是JAVA常见的各个容器的继承关系,我们就顺着继承关系说一下各个接口或者类的特点吧。
public static void main(String args[]) {
List<String> l = new ArrayList<String>();
l.add("aa");
l.add("bb");
l.add("cc");
Iterator iter = l.iterator();
while(iter.hasNext()){
System.out.println((String)iter.next());
}
// for循环的版本
// for(Iterator<String> iter=l.iterator();iter.hasNext();){
// String str = (String)iter.next();
// System.out.println(str);
// }
}
运行结果:
很明显,iterator用于while循环更方便简洁一些。
我们直接打开API文档进行查看
文档中写道,JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。也就是一般不会直接使用Collection,而是会使用它的子类,如List或Set。
在图中我标注了4点,不同的Collection子类对于有序性、重复性、null、线程同步都有不同的策略。基于此,Collection的介绍就这样,下面就其具体的子类来进行介绍。
ListIterator <E> listIterator(int index) 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始
关于ArrayList和Vector的区别,再次回顾一下: 名称 扩容方式(默认) 线程安全 速度 有效个数的属性 ArrayList 增长50% 线程不安全 快 size Vector 增长一倍 线程安全 慢 elementCount 共同点 如果新增的有效元素个数超过数组本身的长度,都会导致数组进行扩容 – remove,add(index,obj)方法都会导致内部数组进行数据拷贝的操作,这样在大数据量时,可能会影响效率 –
写在后面:List接口的排序可以通过Collections.sort()来进行定制排序。 只需要继承Comparable接口后,重写compareTo()**方法。 代码如下:
public class Student extends Thread implements Comparable {
private int age;
private String name;
private String tel;
private int height;
public Student( String name,int age, String tel, int height) {
this.age = age;
this.name = name;
this.tel = tel;
this.height = height;
}
public static void main(String args[]) throws InterruptedException{
Student stu1 = new Student("张三",21,"156482",172);
Student stu2 = new Student("李四",18,"561618",168);
Student stu3 = new Student("王五",19,"841681",170);
Student stu4 = new Student("赵七",20,"562595",180);
List<Student> list = new ArrayList<Student>();
//乱序插入
list.add(stu3);
list.add(stu1);
list.add(stu4);
list.add(stu2);
System.out.println("-----------排序前----------");
Iterator<Student> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
/*
* 使用Collections的sort方法让集合排序,使用其方法必须要重写
* Comparable接口的compareTo()方法
* */
Collections.sort(list);
System.out.println("-----------按照年龄排序后----------");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).toString());
}
}
//重写compareTo方法,用age来比较。也可以用别的来比较
@Override
public int compareTo(Object o) {
//使用当前对象的年龄和其他对象的年龄比较,如果<0返回负数,>0返回正数,=0返回0
int z = this.age - ((Student)o).getAge();
if(z<0)
return -1; // 返回其他负数也行
else if(z == 0)
return 0;
else
return 1; //返回其他正数也行
}
//重写toString,便于输出
@Override
public String toString(){
return name+","+age+","+tel+","+height;
}
输出结果如下:
此接口用于模拟“队列”数据结构(FIFO)。新插入的元素放在队尾,队头存放着保存时间最长的元素。
简单回顾一下上述三个接口的区别
容器名 | 是否有序 | 是否可重复 | null的个数 |
---|---|---|---|
List | 有序 | 可重复 | 允许多个null |
Set | 无序 | 不可重复 | 只允许一个null |
Queue | 有序(FIFO) | 可重复 | 通常不允许插入null |
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/222881.html原文链接:https://javaforall.cn