Java集合框架-1.【集合类】【Collection接口】【List】【ArrayList】【Vector】【LinkedList】

时间:2021-08-04 19:22:13

一、集合类(集合框架)

1、集合类:是一种容器。用于封装存储对象,并提供一些功能方法来操作这些对象数据。

2、特点:

     ①、集合只用于存储对象。

     ②、集合的长度是可变的。

     ③、集合可以存储不同类型的对象。


3、数组和集合的区别:

相同点:数组和集合都是容器,都可以用于存储对象。

不同点:数组的长度是固定的,集合的长度是可变的。

               数组中可以存储基本数据类型,而集合中只能存储对象。


4、集合框架体系图:

Java集合框架-1.【集合类】【Collection接口】【List】【ArrayList】【Vector】【LinkedList】


5、集合框架中为什么会出现这么多的容器?

因为每一个容器对数据的存储方式都有所不同,这个存储方式称之为:数据结构。

 


二、Collection接口

1、是Java的Collection集合框架中的根接口。可以向其中加入多个单值数据。

2、Collection接口中常用的共性方法:

①、添加元素:boolean add(E e)

示例代码:

public static void addMethod()
{
//创建一个集合容器。使用Collection接口的子类。ArrayList
ArrayList al = new ArrayList();
//1、添加元素。
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
System.out.println("集合:"+al); //打印集合。
}


②、获取长度/获取交集:int size() / booleanretainAll(Collection<?> c)

示例代码:

public static void getSize()
{
//创建一个集合容器。使用Collection接口的子类ArrayList。
ArrayList al1 = new ArrayList();
al1.add("java01");
al1add("java02");

ArrayList al2 = new ArrayList();
al2.add("java01");
al2.add("java03");

System.out.println("集合长度="+al1.size()); //打印集合al1的长度。
System.out.println(“交集:”+al1.retainAll(al2)); //输出集合al1和集合al2的中相同的元素,即取交集。
}


③、删除元素:boolean remove(Object o)

                          booleanremoveAll(Collection<?> c)

                          void clear()

示例代码:

public static void delete()
{
//创建一个集合容器。使用Collection接口的子类ArrayList。
ArrayList al1 = new ArrayList();
al1.add("java01");
al1add("java02");
ArrayList al2 = new ArrayList();
al2.add("java01");
al2.add("java03");

al1.remove("java02"); //删除指定的元素。
al1.clear(); //清空集合。
al1.removeAll(al2); //删除集合al1和集合al2中相同的元素。
}

④、判断元素:boolean contains(Object o)

                         boolean isEmpty()

示例代码:

public static void isMethod()
{
ArrayList al = new ArrayList();
al.add(“java01”);
al.add(“java02”);
System.out.println(“java02在集合中是否存在?”+al.contains(“java02”));
System.out.println(“集合是否为空?”+al.isEmpty()); //false。
}


3、集合中对象的存储方式:

示例代码:

Person p = new Person();

ArrayList al = new ArrayList();

al.add(p);

Java集合框架-1.【集合类】【Collection接口】【List】【ArrayList】【Vector】【LinkedList】

总结/注意:

①、add方法的参数类型是Object,以便于接收任意类型对象。

②、集合中存储的都是对象的引用(地址)

 

4、迭代器(Iterator):

①、迭代器:其实就是取出集合中元素的一种方式。

②、迭代器适用范围:Collection接口以及其子类集合对象。

③、迭代器取出元素示例:

public static void method_get()
{
ArrayList al = new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");

Iterator it = al.iterator(); //获取迭代器用于取出集合中的元素。
while(it.hasNext()) //使用循环以及hasNext()方法判断集合中是否有元素。
{
System.out.println(it.next()); //使用next()方法取出集合中的元素。
}
}

/*
输出结果:java01
java02
java03
java04
*/

④、迭代器内部实现方式:

Java集合框架-1.【集合类】【Collection接口】【List】【ArrayList】【Vector】【LinkedList】

迭代器规则:把从容器中取出元素的方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素,而这种方式就被定义成了内部类。

        由于每一个容器的数据结构不同,所以取出的动作细节也不一样,但是它们都有共性的内容:判断和取出。那么就可以将共性内容进行抽取,则这些内部类符合的规则就是迭代器规则。


⑤、迭代器用法:

for(Iterator iter = iterator(); iter.hasNext();)
{
System.out.println(iter.next());
}

Iterator iter = l.iterator();
while(iter.hasNext())
{
System.out.println(iter.next());
}


 

三、List集合

1、List集合特点:元素是有序的,且可以重复。因为该集合体系有索引

2、List集合体系结构:

     Collection

          |--List

               |--ArrayList:底层的数据结构使用的是数组结构。

               |--LinkedList:底层使用的链表数据结构。

               |--Vector:底层是数组数据结构。


3、List集合的特有方法:凡是可以操作角标的方法都是List体系特有的方法。

4、List集合中的常用方法:

       void add(int index, E element)

       boolean addAll(int index, Collection<?extends E> c)


       E remove(int index)

 

       E set(int index, E element)

 

       E get(int index)

       List<E> subList(int fromIndex, inttoIndex)

       ListIterator<E> listIterator()

 

代码示例:

public static void method()
{
List al = new ArrayList();

//添加元素。
al.add("java01");
al.add("java02");
al.add("java03");

System.out.println("原集合是:"+al);
//在指定位置添加元素。
al.add(1,"java09");

//删除指定位置的元素。
al.remove(2);

//修改元素。
//al.set(2,"java007");

//通过角标获取元素。
System.out.println("get(1):"+al.get(1));

System.out.println(al);

//获取所有元素。
for(int x=0; x<al.size(); x++)
{
System.out.println("al("+x+")="+al.get(x));
}

Iterator it = al.iterator();
while(it.hasNext())
{
System.out.println("next:"+it.next());
}

//通过indexOf获取对象的位置。
System.out.println("index="+al.indexOf("java02"));

List sub = al.subList(1,3);
System.out.println("sub="+sub);
}

 

5、ListIterator迭代器

是List集合特有的迭代器,是Iterator的子接口。

 

        注意:在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。

        所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断、取出、删除的操作。

        如果想要操作其它的操作,如:添加、修改等,就需要使用其子接口ListIterator。该接口只能通过List集合的listIterator方法获取。

 

代码示例:

public static void method()
{
//演示列表迭代器。
List al = new ArrayList();

//添加元素。
al.add("java01");
al.add("java02");
al.add("java03");

System.out.println("原集合:"+al);

ListIterator li = al.listIterator();
System.out.println("hasPrevious():"+li.hasPrevious()); //true

while(li.hasNext())
{
Object obj = li.next();

if(obj.equals("java02"))
{
//li.add("java0009");
li.set("java006");
}
}

while(li.hasPrevious()) //通过hasPrevious方法逆向判断集合中的元素。
{
System.out.println("pre:"+li.previous()); //通过previous方法逆向取出元素。
}
//System.out.println("hasNext():"+li.hasNext()); //false
//System.out.println("hasPrevious():"+li.hasPrevious()); //true
System.out.println(al);

/*
//在迭代过程中,准备添加获取删除元素。
Iteratorit = al.iterator();
while(it.hasNext())
{
//System.out.println("next:"+it.next());

Objectobj = it.next();
if(obj.equals("java02"))
//al.add("java008");
it.remove();

System.out.println("obj="+obj);
}
System.out.println(al);
*/
}


6、ArrayList的特点:

  • 底层的数据结构使用的是数组结构。
  • 查询速度很快,但是增删速度稍慢。
  • JDK1.2版本出现,线程不同步,不安全,但效率高,可以手动加锁。
  • 默认初始长度为10,当超过10个元素的长度以后,它会new一个新的数组,做50%的延长变成长度为15,再将多出来的元素添加到新数组里去。

7、Vector的特点:

  • 底层是数组数据结构。
  • 查询速度慢,已经被ArrayList所取代。
  • JDK1.0版本出现,线程同步,安全,但效率很低。
  • 默认初始化长度为10,超过10个元素之后,新new的数组做100%延长变成20,比较浪费内存空间。

Vector的特有操作——枚举Enumeration

import java.util.*;
class VectorDemo
{
public static void main(String[] args)
{
Vector v = newVector();

v.add("java01"); //往Vector集合中添加元素。
v.add("java02");
v.add("java03");
v.add("java04");

Enumeration en = v.elements(); //使用枚举从集合中取出元素。
while(en.hasMoreElements()) //通过hasMoreElements方法判断集合中是否有元素。
{
System.out.println(en.nextElement()); //通过nextElement方法取出元素。
}
}
}

总结:枚举就是Vector特有的取出方式。和迭代器的功能是一样的。(由于枚举的名称和方法名称过长,所以被Iterator迭代器所取代了)

 

8、LinkedList的特点:

  • 底层使用的是链表数据结构。
  • 增删速度快,查询稍慢。
  • 线程不同步,不安全。

LinkedList特有方法:

①、添加元素

        addFirst();

        addLast();

②、获取元素

        getFirst();

        getLast();

注:获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException异常。


③、删除元素

        removeFirst();

        removeLast();

注:获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException异常。


代码示例:

import java.util.*;
class LinkedListDemo
{
public static void main(String[] args)
{
LinkedList link = new LinkedList();
link.addLast("java01");
link.addLast("java02");
link.addLast("java03");
link.addLast("java04");

sop(link);
sop(link.getFirst()); //java01
sop(link.getLast()); //java04
sop(link.removeFirst()); //java01
sop(link.removeLast()); //java04

sop("size="+link.size());
while(!link.isEmpty())
{
sop(link.removeFirst()); //循环取出,并删除集合中的元素。
//sop(link.removeLast()); //逆向循环取出并删除集合中的元素。
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}

 

在JDK1.6中出现了替代方法:

①、添加元素

        offerFirst();

        offerLast();

 

②、删除元素:

注:获取元素,但是不删除元素。如果集合中没有元素,会返回null

        peekFirst();

        peekLast();

 

注:获取元素,但是元素被删除。如果集合中没有元素,会返回null

        pollFirst();

        pollLast();

 


LinkedList集合的队列和堆栈数据结构:

队列:先进先出。Firstin First out--->FIFO。如同水管里的球,先进去的先出来。

堆栈:先进后出。如同水杯里的球,先进去的后出来。

FIFO代码示例:

import java.util.*;
class DuiLie
{
private LinkedList link;
DuiLie()
{
link = new LinkedList();
}
public void myAdd(Object obj)
{
link.addFirst(obj);
}
public Object myGet()
{
return link.removeLast(); //将先存进去的元素先取出来。
//return link.removeFirst(); //演示先进后出。先存进去的元素后取出来。
}
public boolean isNull() //判断集合是否为空。
{
return link.isEmpty();
}
}

class LinkedListTest
{
public static void main(String[] args)
{
DuiLie dl = new DuiLie();
dl.myAdd("java01");
dl.myAdd("java02");
dl.myAdd("java03");
dl.myAdd("java04");

while(!dl.isNull())
{
sop(dl.myGet());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}


输出结果:java01
java02
java03
java04
验证了先存进集合中的元素先取出来了。