一,集合:就是装数据的容器
集合和数组的区别:
1:数组是定长,集合无限制
2:数组存放同一类型的数据,集合可以放 任意类型的数据
3:集合只能存放类类型数据
框架:所有集合类的一个统称就是框架
二,Collection里面常用的api
不是说集合只存放类类型吗?为什么能存放8种基本类型?
原因是8种基本类型自动装箱,比如int装箱成Integer,然后Integer向上转型成Object,而Object是一个类类型。
增加:
add(Object):给集合里面添加元素
addAll(Collection):给集合里面加一个集合
删除:
Remove(Object):删除集合里面的一个元素
removeAll(Collection):删除一个集合里面的另一个集合
查询:
retainAll(Collection)把两个集合里面的交集存入第一个集合中
c.retainAll(c1);//把c和c1里面的交集放到c里面去
isEmpty():判断集合是否为空
Clear():清空集合
size():输出集合里元素个数
Contains(Object):一个集合是否包含某一个元素
ContainsAll(Collection):一个集合里是否完全包含另一个集合
toArray():将一个集合转成数组
Iterator():迭代器
简单的说,迭代器就是一个接口Iterator,实现了该接口的类就叫做可迭代类,这些类多数时候指的就是java.util包下的集合类。
hasNext():如果迭代器中还有元素,则返回true。
next():返回迭代器中的下一个元素
remove():删除迭代器新返回的元素。
三,List分支:
存储有顺序,元素能重复,可以根据下标查找元素(有索引)
c.add(0, “雷霆”):在0下标处加入“雷霆”
addAll(2, c1):在2下标处加入c1集合
indexOf(“红魔”):获取集合中元素的下标位置
c.get(3):获取集合对应下标处的元素
c.set(4, “煤老板”):改指定位置的值,把4下标的元素改成煤老板
c=c.subList(1, 4):(截取1到4位置的元素)截取新集合,含左不含右
listIterator():
ListIterator是一个功能更加强大的, 它继承于Iterator接口,只能用于各种List类型的访问。可以通过调用listIterator()方法产生一个指向List开始处的ListIterator, 还可以调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
####ArrayList:查询速度快,增删效率低,底层使用数组实现,集合的初始大小为10,每次集合放满的时候自动增加原来的一半
LinkedList:查询速度慢,增删效率高,底层使用链表实现
LinkedList下的常用api:
addFirst():给第一个位置添加元素
addLast():给最后一个位置添加元素
getFirst():获得集合中的第一个元素
getLast():获得集合中的最后一个元素
remove(0):删除0下标的元素
remove(“勇士”):删除对应元素
removeFirst():删除并返回第一个
removeLast():删除并返回最后一个
利用模板设计模式测一下ArrayList和linkedList的特点
1,测试增加效率:
主要是看执行前后的时间差
package 集合;
import java.util.ArrayList;
import java.util.LinkedList;
abstract class Template{//抽象类
public void template(){
long start=System.nanoTime();
code();
long end=System.nanoTime();
System.out.println(end-start);
}
public abstract void code();
}
//**********************************************
class MyArrayList extends Template{
ArrayList list=new ArrayList();
public void code() {
for (int i = 0; i <100000; i++) {
list.add(0,1);
}
} //ArrayList的添加速度
}
//**********************************************
class MyLinkedList extends Template{
LinkedList list=new LinkedList();
public void code() {
for (int i = 0; i <100000; i++) {
list.add(0,1);
}
} //LinkedList的添加速度
}
//********************************************
public class Demo {
public static void main(String[] args) {
MyArrayList list=new MyArrayList();
MyLinkedList list1=new MyLinkedList();
list.template();
list1.template();
}
}
结果:
2,测试查询效率:
package 集合;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
abstract class Template{
public void template(){
long start=System.nanoTime();
code();
long end=System.nanoTime();
System.out.println(end-start);
}
public abstract void code();
}
//**********************************************
class MyArrayList extends Template{
ArrayList list=new ArrayList();
public void code() {
for (int i = 0; i <100000; i++) {
list.add(i);//加
}
for (int i = 0; i <100000; i++) {
list.get(i);//查询
}
}
}
//**********************************************
class MyLinkedList extends Template{
LinkedList list=new LinkedList();
public void code() {
for (int i = 0; i <100000; i++) {
list.add(i);//加
}
for (int i = 0; i <100000; i++) {
list.get(i);//查询
}
}
}
//***********************************************
public class Demo {
public static void main(String[] args) {
MyArrayList list=new MyArrayList();
MyLinkedList list1=new MyLinkedList();
list.template();
list1.template();
}
}
结果:
####**Vector:**向量,是最早的集合类(JDK1.0),现在已经过时了!
Vector现在不怎么用,是因为它自己的方法后面都要加一个Element。
c.addElement("德玛");
c.removeElement("德玛");
经典面试题
ArrayList和vector的区别:
1:ArrayList线程不安全,vector线程安全(加了锁)
2:ArrayList集合放满后每次增加原来的一半, vector增加为原来的一倍
Stack:栈(先进后出),继承自Vector,所以它也过期了
它里面的输入输出时push(),pop().
虽然它是个先进后出的栈结构,但是因为它继承了Vector,它也可以依靠循环按照顺序输出,所以他这就矛盾了,所以它过时了。
自定义一个栈的类:
package 集合;
import java.util.LinkedList;
public class MyStack {
private LinkedList list=new LinkedList();
//*************************************
public void push(Object obj){//加元素
list.add(obj);
}
//***************************
public Object pop(){//删除并输出元素
return list.removeLast();
}
//****************************
public static void main(String[] args) {
MyStack s=new MyStack();
s.push("凉菜");
s.push("烤肉");
s.push("啤酒");
s.push("冰封");
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
}
}
输出结果: