Iterable是一个超级接口,被Collection所继承。它只有一个方法: Iterator
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
不同的Collection子类对于有序性、重复性、null、线程同步都有不同的策略。
List是有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
用户插入的顺序或者指定的位置就是元素插入的位置。它与Set不同,List允许插入重复的值。
List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问
。还提供了一个方法(如下)来获取从列表中指定位置开始的列表迭代器。
ListIterator <E> listIterator(int index)
返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始
List 接口提供了两种搜索指定对象的方法。从性能的观点来看,应该小心使用这些方法。在很多实现中,它们将执行高开销的线性搜索。
List 接口提供了两种在列表的任意位置高效插入和移除多个元素的方法。
1.5倍
)Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步
,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢
。所以现在已经不太常用了。
Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出)
名称 | 扩容方式(默认) | 线程安全 | 速度 | 有效个数的属性 |
---|---|---|---|---|
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;
}
}
一个null
。容器名 | 是否有序 | 是否可重复 | null的个数 |
---|---|---|---|
List | 有序 | 可重复 | 允许多个null |
Set | 无序 | 不可重复 | 只允许一个null |
Queue | 有序(FIFO) | 可重复 | 通常不允许插入null |
Map不是
collection的子接口或者实现类。Map是一个接口。
Map用于保存具有“映射关系”的数据。每个Entry都持有键-值两个对象。其中,Value可能重复,但是Key不允许重复(和Set类似)。
Map可以有多个Value为null,但是只能有一个Key为null。
是一个古老的Map实现类。
如同Set->SortedSet->TreeSet一样,Map也有Map->SortedMap->TreeMap的继承关系。
强引用
,这意味着只要该HashMap对象不被销毁,该HashMap所引用的对象就不会被垃圾回收。弱引用
,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,当垃圾回收了该key所对应的实际对象之后,WeakHashMap也可能自动删除这些key所对应的key-value对。这个类也和HashMap类似,区别在于,在IdentityHashMap中,当且仅当两个key严格相等(key1==key2)时,IdentityHashMap才认为两个key相等
IdentityHashMap不是Map的通用实现,它有意违反了Map的常规协定。并且IdentityHashMap允许key和value都为null。
同HashMap,IdentityHashMap也是无序的,并且该类不是线程安全的,如果要使之线程安全,可以调用Collections.synchronizedMap(new IdentityHashMap(…))
方法来实现。
原文:https://www.cnblogs.com/whoisxxq/p/14875882.html