集合
1集合框架概述
集中中储存的都是对象的引用(地址)
为什么会出现这么多的容器呢?
因为每个容器对数据的存储方式都有所不同,这个存储方式称之为:数据结构
2 Collections
创建集合容器使用Collection接口的子类ArrayList
ArrayList a1 =new ArrayList();
2.1添加元素
a1.add(“java01”);
a1.add(“java02”);
2.1.1add方法的参数类型是Object,以便于接任意类型对象
2.1.2集合中存储的都是对象的引用(地址)
2.2获取个数,集合长度
a1.size();
2.3删除元素
a1.remove(“java01”);删除单个元素
a1.clear()//清空集合
2.4判断元素
a1.contains()
a1.isEmpty()
2.5交集
a1.retainAll(a2):取两个集合中相同的元素,然后放置回a1
A1.removeAll(a2):去除与a2交集的部分,然后放置回a1
2.6迭代器
Iterator it =a1.iterator();//获取迭代器用于取出集合中的元素
while(it.hasNext)//如果仍有元素可以迭代,返回true
{
it.next();//返回下一个元素
}
什么是迭代器:集合的取出元素的方式
取出方式可以直接访问集合的元素,所以取出方法定义在集合的内部
因此取出方式就被定义为内部类
而每个容器数据结构不同
所以取出的动作细节也都不一样,但是都有共性内容:判断和取出,可以共性抽取
因此这些内部类都符合一个规则,该规则就是Iterator,并通过一个对外提供的方法iterator()方法来获取集合的取出对象
3.List
Collction
|--List: 元素时有序的,元素可以重复,因为该集合体系有索引
|--Set:元素是无序的,元素不可以重复
List:特有方法,凡是可以操作角标的方法都是该体系特有的方法
增:
add(index,element);
addAll(index,Collection);
删:
remove(index);
改:
set(index,element);
查:通过角标获取元素
get(index);
subList(from,to);
listIterator();列表迭代器
For遍历:
for (int x=0;x<a1.size();x++)
{
sop(a1.get(x));
}
迭代器:
Iterator it =a1.iterator();
while(it.hasNext()){
sop(it.next())
}
listIterator();列表迭代器
在迭代时,不可以通过集合对象的方法操作集合中的元素(不能增删等)
因为会发生异常
所以在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的
只能对元素进行判断,取出,删除等的操作
如果想要对其他的操作如添加,修改等,就需要使用其子接口,ListIterator
该接口具备删除remove,添加add,修改set等功能,但此功能是List特有的
ListIterator列表迭代器,是List集合持有的迭代器,是Iterator的子接口。
逆向遍历
it.hasPrevious() 查询前一个是否有元素
It.previous()
4.List集合中的对象
ArrayList:底层数据结构使用的数组结构。特点:查询速度很快,但是增删稍慢,不同步的(默认长度为10,超过就new一个新的元素,50%的延长)
LinkedList:底层使用的链表结构。特点:增删速度快,但是查询稍慢,不同步
Vector:底层使用的数组结构,同步的(默认长度为10,超过100%的延长)
1.Vecter使用:
Vector v =new Vector();
v.add(“Java01”);
v.add(“Java02”);
Enumeration en=v.elements();
While(en.hasMoreElements())
{
en.nextElement();
}
枚举:就是Vecor特有的取出方式,枚举和迭代器是十分类似的
2.LInkedList:特有方法
addFirst():从头部开始添加
addLast():从尾部开始添加
getFirst():只获取头值
getLast():只获取尾值
removeFirst():获取头元素,同时 元素被删除
removeLast():获取尾元素,同时,元素被删除
如果LinkedList内无元素,get或者remove,会出现NoSuchElementException
JDk1.6出现替代方法
添加
offerFirst()
offerLast()
获取
peekFirst()
peekLast()
获取元素,但是不删除元素,如果集合中没有元素,就会返回null
删除
pollFirst()
pollLast()
获取元素,同时删除元素,如果集合中没有元素,就会返回null
LinkedLisr练习:
使用LinkedList模拟一个堆栈或者队列数据结构
堆栈:先进后出,如同一个杯子
队列:先进先出,如同一个水管
例:
Import java.util.*
Class Queue
{
Private LinkedList link;
Queue()
{
Link=new LinkedList();
}
Public void myAdd(Object obj)
{
link.addFirst(obj);
}
Public Object myGet()
{
return link.removeLast();//removeLast队列,removeFirst 堆栈
}
Public boolean isNull()
{
Return link.isEmpty();
}
}
Class LinkedListTest
Public static void main(String[] args)
{
Queue q1=new Queue();
q1.myAdd(“java01”);
q1.myAdd(“java02”);
q1.myAdd(“java03”);
q1.myAdd(“java04”);
While(!q1.isNull)
System.out.println(q1.myGet());
}
ArrayList练习一:
去除ArrayList中的重复元素
import java.util.*;
class ArrayListTest
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add("java01");
al.add("java02");
al.add("java01");
al.add("java03");
al.add("java01");
al.add("java01");
sop(al);
al=singleElement(al);
sop(al);
}
public static ArrayList singleElement(ArrayList al)
{
ArrayList newAl= new ArrayList();
ListIterator it=al.listIterator();
while (it.hasNext())
{
Object obj=it.next();
if (!newAl.contains(obj))
{
newAl.add(obj);
}
}
return newAl;
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
public static ArrayList singleElement(ArrayList al)
{
ArrayList newAl= new ArrayList();
ListIterator it=al.listIterator();
while (it.hasNext())
{
Object obj=it.next();
if (!newAl.contains(obj))
{
newAl.add(obj);
}
}
return newAl;
}
import java.util.*;
/*
将自定义对象当做元素传入ArrayList集合中,并去除重复元素
比如,人作为对象,拥有相同名字和年龄的人视为同一个人
*/
class ArrayListTest2
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add(new Person("lisi01",30));
al.add(new Person("lisi02",32));
al.add(new Person("lisi03",34));
al.add(new Person("lisi04",35));
al.add(new Person("lisi01",30));
al.add(new Person("lisi02",32));
//sop(al);//[Person@659e0bfd]
al=singleElement(al);
Iterator it =al.iterator();
while (it.hasNext())
{
Person p=(Person) it.next();
sop(p.getName()+"--"+p.getAge());
}
}
public static ArrayList singleElement(ArrayList al)
{
ArrayList newAl= new ArrayList();
ListIterator it=al.listIterator();
while (it.hasNext())
{
Object obj=it.next();
if (!newAl.contains(obj))
{
newAl.add(obj);
}
}
return newAl;
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public boolean equals(Object obj)//contains底层调用的是equals方法,覆盖equals方法
{
if(!(obj instanceof Person))
return false;
Person p=(Person) obj;
return this.name.equals(p.name) && this.age==p.age;//比较是否是同一个的名字和年龄
}
}
5 set
Set:元素是无序(存入和取出的顺序是不一定一致的)的,元素不可以重复
|--HashSet:底层数据结构是哈希表
HashSet是如何保证元素的唯一性的那?
是通过元素的两个方法,hashcode和equals来完成的
如果元素的hashcode是一致的,才会判断equals是否为true
如果元素的hashcode值不同,就不会调用equals
对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法
|--TreeSet
Set集合的功能和Collection是一致的
/*
将自定义对象当做元素传入HashSet集合中
比如,人作为对象,拥有相同名字和年龄的人视为同一个人
*/
import java.util.*;
class HashSetTest
{
public static void main(String[] args)
{
HashSet hs=new HashSet();
hs.add(new Person("lisi01",30));
hs.add(new Person("lisi02",32));
hs.add(new Person("lisi03",34));
hs.add(new Person("lisi04",35));
hs.add(new Person("lisi04",35));
hs.add(new Person("lisi02",32));
//sop(al);//[Person@659e0bfd]
Iterator it =hs.iterator();
while (it.hasNext())
{
Person p=(Person) it.next();
sop(p.getName()+"--"+p.getAge());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int hashCode()
{
System.out.println(this.name+"--hashcode");
return name.hashCode()+age*39;
}
public boolean equals(Object obj)//contains底层调用的是equals方法,覆盖equals方法
{
if(!(obj instanceof Person))
return false;
Person p=(Person) obj;
System.out.println(this.name+"--equals--"+p.name);
return this.getName().equals(p.getName()) && this.age==p.age;//比较是否是同一个的名字和年龄
}
} |
|