Vector和ArrayList的关系
底层算法都是数组
ArrayList是集合框架里提供的新的变长数组,Vector是ArrayList的前身
Vector相对于ArrayList来说,线程安全,但是性能更低.
在集合中,存储的都是对象的引用,而不是对象的数据
package _01_Vector;
import java.util.Vector;
public class Demo1 {
/**
* @param args
*/
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("wqy");
Vector v1 = new Vector();
v1.add("hello");
v1.add(sb);
System.out.println(v1);
sb.append("1");
System.out.println(v1);
}
}
在集合中存储的都是对象,基本数据类型无法存储,但是java5开始有自动装箱了.
集合中add和addall的区别
Stack栈
底层是数组 特点:后进先出
三个操作:
压入到栈顶 push 就是add
弹出栈顶元素 peek 返回最后一个元素,但是不删除
移除栈顶元素 pop 删除最后一个元素
package _01_Vector;
import java.util.Stack;
public class StackDemo {
/**
* @param args
*/
public static void main(String[] args) {
Stack s = new Stack();
s.push("1");
s.push("2");
s.push("3");
s.push("4");
Object o = s.peek();
System.out.println(o);
s.pop();
System.out.println(s);
}
}
ArrayList
LinkedList 底层使用的单链表操作/双向链表/单向队列/双向队列.
集合的迭代操作
从上图的集合框架图可以看出最上面有个Iterator的接口,Collection里有个iterator()方法
package _02_Iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Demo1 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator car = list.iterator();
while(car.hasNext()){
System.out.println(car.next());
}
}
}
Iteratable接口中,只要某一个类,实现了Iterable接口,就可以作为for-each循环的目标: (也就是说foreach是建立在iterator)
操作数组的时候:底层其实就是一个普通的for循环操作集合的时候:底层其实就是使用iterator
package _02_Iterator;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
public class Demo1 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator car = list.iterator();
while(car.hasNext()){
System.out.println(car.next());
}
System.out.println("----------------------------------------");
for(Iterator it = list.iterator();it.hasNext();){
System.out.println(it.next());
}
System.out.println("----------------------------------------");
Vector v1 = new Vector();
v1.add("1");
v1.add("2");
v1.add("3");
v1.add("4");
v1.add("5");
Enumeration elements = v1.elements();
while(elements.hasMoreElements()){
System.out.println(elements.nextElement());
}
}
}
上述代码中for使用iterator空间使用更合理
foreach也可以使用
for (Object object : list) {
System.out.println(object);
}
set接口和HashSet类
不记录序列,不能重复的,无序的
HashSet和ArrayList中都有构造方法可以相互转换
这里主要说明下HashSet是如何判断两个元素是否相同的,通过HashCode和equals方法
下面代码中只针对了age进行判断,所以打印后出现两个元素.
package _03_HashSet;
import java.util.HashSet;
import java.util.Set;
public class Demo1 {
public static void main(String[] args) {
Person p1 = new Person("小孩",6);
Person p2 = new Person("青年",26);
Person p3 = new Person("老人",6);
Set s1 = new HashSet();
s1.add(p1);
s1.add(p2);
s1.add(p3);
System.out.println(s1);
}
}
class Person{
String name;
int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
return true;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}