一、链表
1.为什么要使用链表?
数组和数组列表存在重大缺陷:如果想从数组中间位置添加或删除一个元素需要付出很大代价,
因为数组中处于被删除元素之后的所有元素都要向数组的前端移动。数组中插入一个元素也是如此。
而使用链表可以解决这个问题。
数组在连续的存储位置上存放对象引用,但链表却将每个对象存放在独立的结点中,每个结点还
存放着序列的下一个结点的引用。在java中链表都是双向的——即每个结点都还存放着指向前驱结点
的引用。
2.链表是一个有序集合,每个对象的位置十分重要,使用LinkedList.add方法只能添加到链表的尾部,有
但是常常需要将元素插入到链表的中间,集合类库中提供了子接口ListIterator,其中包含add方法。
向链表中插入元素
List<String> staff = new LinkedList<>();
staff.add("Amy");
staff.add("Bob");
staff.add("Car");
ListIterator<String> it = staff.listIterator();
it.next();
it.add("Julin");
for(String s : staff) {
System.out.println(s);
}
如果链表中有n个元素,可以在n+1个位置进行插入新的元素。例:
|ABCD
A|BCD
AB|CD
ABC|D
ABCD|
|表示插入的位置
删除链表中的元素
Java集合类库中提供了一个LinkedList表示链表。
List<String> staff = new LinkedList<>();
staff.add("Amy");
staff.add("Bob");
staff.add("Car");
Iterator<String> it = staff.iterator();
String first = it.next();
String second = it.next();
it.remove();
System.out.println("first : "+first);
System.out.println("second : "+second);
for(String s : staff) {
System.out.println(s);
}
输出的结果为:
first : Amy
second : Bob
Amy
Car
替换指定位置的元素
在链表中ListIterator中提供了set方法,可以替换指定位置的元素
ListIterator<String> it = staff.listIterator();
it.next();
it.set(newValue);
3.链表不支持快速的随机访问,如果要访问第n个元素,就必须从头开始越过n-1个元素
二、数组列表(ArrayList)
ArrayList和Vector:
Vector类的所有方法都是同步的,可以由多个线程访问一个Vector对象,但是由一个线程访问时
同步操作会耗费大量的时间。因此在不需要同步的时候使用ArrayList。
三、散列集
链表和数组可以按照意愿排列次序。但是如果想要查看某个指定的元素,却又忘记了它所在的位置,就需要
访问所有的元素。
HashSet无序不重复的。
四、树集
TreeSet树集是一个有序集合,可以以任意顺序将元素插入集合中。在对集合进行遍历时,每个值将自动
的按照排序之后的顺序呈现。
SortedSet<String> set = new TreeSet<>();
set.add("Bob");
set.add("Amy");
set.add("Car");
for(String s : set) {
System.out.println(s);
}
将一个元素添加到树中比添加到散列表中要慢,但是与将元素添加到数组或链表的正确位置上相比还是快得多。
1.为什么要使用链表?
数组和数组列表存在重大缺陷:如果想从数组中间位置添加或删除一个元素需要付出很大代价,
因为数组中处于被删除元素之后的所有元素都要向数组的前端移动。数组中插入一个元素也是如此。
而使用链表可以解决这个问题。
数组在连续的存储位置上存放对象引用,但链表却将每个对象存放在独立的结点中,每个结点还
存放着序列的下一个结点的引用。在java中链表都是双向的——即每个结点都还存放着指向前驱结点
的引用。
2.链表是一个有序集合,每个对象的位置十分重要,使用LinkedList.add方法只能添加到链表的尾部,有
但是常常需要将元素插入到链表的中间,集合类库中提供了子接口ListIterator,其中包含add方法。
向链表中插入元素
List<String> staff = new LinkedList<>();
staff.add("Amy");
staff.add("Bob");
staff.add("Car");
ListIterator<String> it = staff.listIterator();
it.next();
it.add("Julin");
for(String s : staff) {
System.out.println(s);
}
如果链表中有n个元素,可以在n+1个位置进行插入新的元素。例:
|ABCD
A|BCD
AB|CD
ABC|D
ABCD|
|表示插入的位置
删除链表中的元素
Java集合类库中提供了一个LinkedList表示链表。
List<String> staff = new LinkedList<>();
staff.add("Amy");
staff.add("Bob");
staff.add("Car");
Iterator<String> it = staff.iterator();
String first = it.next();
String second = it.next();
it.remove();
System.out.println("first : "+first);
System.out.println("second : "+second);
for(String s : staff) {
System.out.println(s);
}
输出的结果为:
first : Amy
second : Bob
Amy
Car
替换指定位置的元素
在链表中ListIterator中提供了set方法,可以替换指定位置的元素
ListIterator<String> it = staff.listIterator();
it.next();
it.set(newValue);
3.链表不支持快速的随机访问,如果要访问第n个元素,就必须从头开始越过n-1个元素
二、数组列表(ArrayList)
ArrayList和Vector:
Vector类的所有方法都是同步的,可以由多个线程访问一个Vector对象,但是由一个线程访问时
同步操作会耗费大量的时间。因此在不需要同步的时候使用ArrayList。
三、散列集
链表和数组可以按照意愿排列次序。但是如果想要查看某个指定的元素,却又忘记了它所在的位置,就需要
访问所有的元素。
HashSet无序不重复的。
四、树集
TreeSet树集是一个有序集合,可以以任意顺序将元素插入集合中。在对集合进行遍历时,每个值将自动
的按照排序之后的顺序呈现。
SortedSet<String> set = new TreeSet<>();
set.add("Bob");
set.add("Amy");
set.add("Car");
for(String s : set) {
System.out.println(s);
}
将一个元素添加到树中比添加到散列表中要慢,但是与将元素添加到数组或链表的正确位置上相比还是快得多。