- (为什么要用)集合:容器,存储对象,长度可变
- (集合与数组的区别)数组:容器,存储对象或基本数据类型,长度不可变】
- 集合体系:
Collection Set:无序,元素不重复 List:有序,元素可重复,通过角标操作 ArrayList:数组,查找快,插删慢 LinkLst :链表,查找慢,插删块 Vector :数组,都慢 Stack :先进后出
有限种类的集合类,来容纳无限种类的数据对象;用集合类来容纳不同种类的数据,这种容纳是建立在未知的基础上。
-
JAVA中集合类分类:三类
-
集(Set):
-
和数学上的“集合”概念相对应,是最简单的一种集合。
-
Set集合中不区分元素的顺序。
-
Set集合中不包含重复元素,即任意的两个元素e1和e2都有e1.equals(e2)=false,并且最多有一个null元素。
-
-
列表(List):
-
List列表区分元素的顺序,能够精确的控制每个元素插入的位置,用户能够使用索引(元素在List中的位置)来访问List中的元素。
-
List允许包含重复元素。
-
-
映射(Map):
-
保存的是“键-值”对信息,即Map中存储的每个元素都包括起标识作用的“键”和该元素的“值”两部分,查找数据时不需提供相应的“键”,才能查找到该“键”所映射的“值”。因此,Map集合中不能包含重复的“键”,并且每个“键”最多只能映射一个值。
-
-
-
集合理放的是对象的地址
-
JDK集合框架常用API关系结构
斜体字:接口;实线箭头:继承关系;虚线箭头:实现关系
需注意:1.Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”。
2.Collection接口有多个子接口,其中最重要的两个java.util.Set和java.util.List分别描述集Set和列表List。
Collection接口:
-
常用方法:
-
add (): 添加
-
addAll(): 全部添加
-
retaAll(): 2个集合的交集
-
public boolean add [E e]: 添加,成功返回true
-
public boolean remove (Object o): 删除
-
public boolean isEmpty(): 是否为空
-
public boolean contains(): 是否包含
-
public vpid clear(): 全部删除
-
public Object[] toArray(): 转数组
-
public int size(): 个数
import java.util.*; class CollectionDemo { public static void main(String[] args) { //创建一个容器 ArrayList al = new ArrayList();//Callection al = new ArrayList(); //添加元素 al.add("abc1");//字符串为引用类型 al.add("abc2"); al.add("abc3"); al.add("abc4"); System.out.println(al.size());//看看大小//4 System.out.println(al);//[abc1,abc2,abc3,abc4] System.out.println(al.contains("abc3"));//t al.remove("abc3"); System.out.println(al);//[abc1,abc2,abc4] al.clear(); System.out.println(al.size());//0 System.out.println(al);//[] } }
-
遍历:
-
hasNext(): 是否有元素
-
next(): 下一个
-
remove(): 移除
import java.util.*; class IteratorDemo { public static void iterator(){ ArrayList al = new ArrayList(); al.add("abc1"); al.add("abc2"); al.add("abc3"); al.add("abc4"); Iterator it = al.iterator(); //System.out.println(it.next());//abc1 while (it.hasNext()) { System.out.print(it.next()+" ");//abc1 abc2 abc3 anc4 } System.out.println(); for(int i=0;i<al.size();i++){ System.out.print(al.get(i)+" ");//abc1 abc2 abc3 abc4 } } public static void main(String[] args) { iterator(); } }
-
-
java.util.List :
-
列表结构,允许程序员对列表元素的插入位置进行精确控制,并增加了根据元素索引来访问元素、搜索元素等功能。
-
继承父接口Collection的基础之上,新增的方法:
-
void add(int index, E element): 放第几个
-
boolean add(E e): 将对象e插入到列表最后
-
E remove(int index): 删除指定
-
boolean remove(Object o): 删除连表里第一个指定内容的元素
-
E get(int index): 遍历,返回Object
-
int size():元素个数,用在遍历里
-
int indexOf(Object obj): 返回某元素的位置,没有找到-1
-
List<E> subList(int fromIndex, int toIndex): 返回之间的值
-
void clear() :全部清除
import java.util.*; class ListDemo { public static void main(String[] args) { List l = new ArrayList(); l.add("abc1"); l.add("abc2"); l.add("abc3"); l.add("abc4"); System.out.println(l);//[abc1,abc2,abc3,abc4] l.add(1,"qq");//添加 System.out.println(l);//[abc1,qq,abc2,abc3,abc4] l.remove(0);//删除// System.out.println(l);//[qq,abc2,abc3,abc4] System.out.println(l.indexOf("abc3"));//返回下标//2 List l2 = l.subList(1,3); System.out.println(l2);//[abc2,abc3] System.out.println(l.get(2));//abc3 for(int i=0;i<l.size();i++){ System.out.print(l.get(i)+" ");//qq abc2 abc3 abc4 } } }
-
-
Java.util.List接口的实现类有多个,分别体现了列表的不同分化形式。
-
ArrayList
-
LinkedList
-
数组:逻辑上相邻的两个元素在物理上也是相邻的 内容 增删慢,查找块
链式:逻辑上相邻的两个元素在物理上不相邻,通过“链条”连接 地址 增删块,查找慢 -
构造方法:
-
LinkedList()
-
LinkedList(Collection c)
-
LinkedList(<E>c)
-
-
其他方法:
-
添加:void addFirst(E obj)、void addLast(E obj); 找不到抛异常。offer,找不到返回Null
-
获取:E getFirst()、Object getLast(); peek
-
删除:E removeFirst、Object removeLast(); poll
import java.util.*; class LinkedListDemo { public static void main(String[] args) { LinkedList l = new LinkedList(); l.addFirst("abc1"); l.addFirst("abc2"); l.addFirst("abc3"); l.addFirst("abc4"); System.out.print(l);//[abc1,abc2,abc3,abc4] System.out.println(); //l.addLast("abc1"); // l.addLast("abc2"); // l.addLast("abc3"); //l.addLast("abc4"); //System.out.print(l);//[abc4,abc3,abc2,abc1] //System.out.println(); System.out.println(l.getFirst());//4 System.out.println(l.getFirst());//4 System.out.println(l.removeFirst());//4 System.out.println(l.removeFirst());//3 while (!l.isEmpty())//是否为空 { System.out.print(l.removeFirst());//全删,会输出//2,1 } } }
-
-
-
Vector
-
向量
-
构造方法:
-
Vector():空,初始值为10
-
Vector(int initialCapacity):指定初始容量,0容量增量
-
Vector(int int initialCapacity,int capacityIncrement):全初始
-
Vector(<E> c):泛型
-
-
其他方法:
-
addElement(E obj):添加
-
insertElementAt(E obj,intindex):指定添加
-
setElementAt(E obj,intindex):替换指定
-
boolean removeElement(Object obj):删除第一个
-
void removeElementAt(int index):删除指定
-
void removeAllElement():删除所有
-
int size():长度
-
E elementAt(int index):依次访问
import java.util.*; class VectorDemo { public static void main(String[] args) { Vector v = new Vector(); v.addElement("one"); v.addElement("tow"); v.addElement("three"); System.out.println(v); for(int i=0;i<v.size();i++){ System.out.println(v.elementAt(i)); } v.insertElementAt("zero",0); System.out.println(v); v.insertElementAt("another three",3); System.out.println(v); v.setElementAt("four",4); System.out.println(v); v.removeAllElements(); System.out.println(v); } }
-
-
-
Stack
-
Stack是Vector类的子类
-
特点: “后进先出”(Last In First Out)类型的容器,即最后一个被“压(push)”进堆栈中的对象,会被第一个“弹(pop)”出来。
-
构造方法
-
Stack() :用于创建支持“后进先出”访问方式的对象 例:Stack st=new Stack(); Stack <String> st = new Stack();
-
-
其他方法
-
E peek() :返回栈顶元素,但没有弹出栈顶元素
-
E pop() :弹出栈顶元素,并返回其中的对象。
-
E push(E item) :向堆栈顶端压入item对象,同时将item对象返回。
-
boolean empty() :判断堆栈是否为空,如果该堆栈为空,返回true,反之返回false。
import java.util.*; class StackDamo { public static void main(String[] args) { Stack st = new Stack(); //Stack <String> st = new Stack(); st.push("First Element"); st.push("second Element"); st.push("third Element"); while(st.empty() != true){ System.out.println(st.pop().toString()); //System.out.println(st.peek().toString());、、死循环 } //不好的用法,把堆栈当成Vector用 int i = 0; st.addElement("bad usage1"); st.addElement("bad usage2"); st.addElement("bad usage3"); //破坏了堆栈的特性 for(i=0;i<st.size();i++){ System.out.println(st.elementAt(i)); } } }
-
-
-
课后作业:
使用LinkedList模拟一个队列
//duilie
import java.util.*;
import java.lang.*;
class MyStack
{
private LinkedList link;
public MyStack(){
link=new LinkedList();
}
public void myAdd(Object obj){
link.addLast(obj);
}
public Object myGet(){
return link.removeFirst();
}
public boolean isNull(){
return link.isEmpty();
}
}
class Test
{
public static void main(String []args){
MyStack st=new MyStack();
st.myAdd("one");
st.myAdd("two");
st.myAdd("three");
st.myAdd("four");
while(!st.isNull()){
System.out.println(st.myGet());
}
}
}
使用LinkedList模拟一个堆栈
import java.util.*;
import java.lang.*;
class MyStack
{
private LinkedList link;
public MyStack(){
link=new LinkedList();
}
public void myAdd(Object obj){
link.addFirst(obj);
}
public Object myGet(){
return link.removeFirst();
}
public boolean isNull(){
return link.isEmpty();
}
}
class Test
{
public static void main(String []args){
MyStack st=new MyStack();
st.myAdd("one");
st.myAdd("two");
st.myAdd("three");
st.myAdd("four");
while(!st.isNull()){
System.out.println(st.myGet());
}
}
}