集合框架笔记
集合类
:(
容器
)
集合数组的区别和特点
:
1.
数组和集合
:
都是存储容器
2.
集合
(
可变长度
)
是存储对象的
,
只能存数对象
,
可以存储不同类型的对象
.
3.
数组
(
固定长度
)
一般存储数据
,
同一种类型的数据
.
集合的种类
:
1.List(
元素都带有角标
)
ListIterator
是
List
特有的迭代器
,
是
Iterator
的子接口
.
在迭代时
,
不可以通过集合中的方法来操作集合中的元素
,
会发生并发异常
.
所以在迭代时
,
只能用迭代的方法
.
而
Iterator
的方法有限
,
只能进行删除
,
判断取出的操作
,
想对元素进行添加
,
修改的时候
,
就需要其子接口
ListIterator
的方法来获取
.
迭代器代码演示 :
/*
取出元素:
迭代器:Iterator
*/
import java.util.*;
class IteratorDemo
{
public static void main(String [] args)
{
getElement();
}
public static void getElement()
{
ArrayList al1 = new ArrayList();
al1.add("java01");
al1.add("java02");
al1.add("java03");
al1.add("java04");
Iterator it = al1.iterator();
while(it.hasNext())
{
sop(it.next());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
常见的
3
个子类
:(
常见面试问题
)
ArrayList:
底层的数据结构使用的是
数组结构
;
特点
:
查询速度快
,
但是增删较慢
. (
线程不同步
)
LinkedList:
底层使用的是
链表结构
;
特点
:
增删速度快
,
查询慢
.
Vector:
底层是数组数据结构
.
与
ArrayList
功能一样
.(vector
线程是同步的
),
被
ArrayList
替代了
.
List
集合判断元素是否相同
.
依据的元素的
equals
方法
.(
其他集合跟
List
不同
),contains
底层调用的是
equals
方法
.
相关代码及练习 :
Vector:
import java.util.*;
/*
枚举与迭代其实是一样的.
*/
class VectorDemo
{
public static void main(String [] args)
{
Vector v = new Vector();
v.add("java01");
v.add("java02");
v.add("java03");
v.add("java04");
Enumeration en = v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
}
}
ArrayList:
/*
去除ArrayList中的重复元素.
*/
import java.util.*;
class ArrayListTest
{
public static void main(String [] args)
{
ArrayList al = new ArrayList();
al.add("java01");
al.add("java01");
al.add("java01");
al.add("java02");
al.add("java01");
al.add("java03");
sop("原集合 : "+al);
/*
//遍历原集合
Iterator it = al.iterator();
while(it.hasNext())
{
sop(it.next());
}
*/
//调用方法去除重复元素.
al = singleElement(al);
sop(al);
}
public static ArrayList singleElement(ArrayList al)
{
ArrayList newAl = new ArrayList();
Iterator it = al.iterator();
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);
}
}
/*
将自定义对象存储到ArrayList中,并去除相同元素.
例如:存人对象,同姓名,同年龄视为同一个人.
思路:
1.定义人对象
2.定义集合容器
3.对比
*/
import java.util.*;
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
System.out.println(this.name+"-----"+p.name);
return this.name.equals(p.name) && this.age == p.age;
}
public void setName()
{
this.name = name;
}
public void setAge()
{
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
class ArrayListTest2
{
public static void main(String [] args)
{
ArrayList al = new ArrayList();
al.add(new Person("lisi01",30)); //al.add(Object obj) Object obj = new Person("lisi01",30); 向上转型.
al.add(new Person("lisi02",31));
// al.add(new Person("lisi02",31));
al.add(new Person("lisi03",32));
al.add(new Person("lisi04",33));
// al.add(new Person("lisi04",33));
// al = singleElement(al);
sop("remove 03 :"+al.remove(new Person("lisi03",32))); //remove底层也是调用的equals方法.
Iterator it = al.iterator();
while(it.hasNext())
{
/*
Object obj = it.next();
Person p =(Person)obj;
*/
Person p = (Person)it.next();
sop(p.getName()+"-----"+p.getAge());
}
}
public static ArrayList singleElement(ArrayList al)
{
ArrayList newAl = new ArrayList();
Iterator it = al.iterator();
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);
}
}
LinkedList:
/*
LinkedList
如果集合中没有元素,会出现NoSuchElememtException异常
在JDK1.6中提供了新的方法来替代
offerFirst();
offerLast();
peekFirst();
peekLast();
pollFirst();
pollLast();
*/
import java.util.*;
class LinkedListTest
{
public static void main(String [] args)
{
LinkedList link = new LinkedList();
/*
link.addFirst("java01");
link.addFirst("java02");
link.addFirst("java03");
link.addFirst("java04");
*/
link.addLast("java01");
link.addLast("java02");
link.addLast("java03");
link.addLast("java04");
sop(link);
while(!link.isEmpty())
{
sop(link.removeFirst());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
2.Set
3.Map
特性
:
集合框架
:
顶层
: Colletion(
接口
)
基本方法演示
:
/*
集合框架
1.add方法的参数类型是Object.以便于接收任何类型
2.集合中存储的都是对象的引用(地址值).
*/
import java.util.*;
class CollectionDemo
{
public static void main(String [] args)
{
method_2();
}
public static void method_2()
{
ArrayList al1 = new ArrayList();
al1.add("java01");
al1.add("java02");
al1.add("java03");
al1.add("java04");
ArrayList al2 = new ArrayList();
al2.add("java01");
al2.add("java02");
al2.add("java05");
al2.add("java06");
al1.retainAll(al2); //al1中存放的是与al2中的交集的部分. 没有交集的话al1是空集 显示的结果为[].
//al1.removeAll(al2); //将al1与al2中相同的删除.在al1中显示的去除与al2相同的元素.
sop("al1 : "+al1);
sop("al2 : "+al2);
}
public static void base_method()
{
//创建一个集合容器,使用Collection接口的子类,ArrayList创建.
ArrayList al = new ArrayList();
//给容器添加元素
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
//打印原集合
sop("原集合 : "+al);
//获取集合长度,个数 用size(); 而非length();
sop("size : "+al.size());
//清空集合 clear()
//al.clear();
//删除元素 remove();
al.remove("java02");
//判断元素
sop("java01是否存在:"+al.contains("java01"));
sop("集合是否为空 : "+al.isEmpty());
sop(al);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
常见子接口
: List Set
Q:
为什么出现这么多容器
:
A:
每个容器对数据的存储方式都不同
,
这个存储方式可以称为
:
数据结构
.
迭代器
:Iterator.(
取出元素并操作元素
)
返回值类型是一个接口
.
next();
方法
hasNext();
remove();
Collection
1.List
元素是有序的
,
可以重复
,
该集合体系有索引
2.Set
元素是无序的
,
元素不可以重复
,
没有索引
.
List
集合特有方法
:
1.
指定位置插入元素