黑马程序员——集合(一)

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

1、概述

       集合就是一个容器,是用来存储对象的,里面可以存储不同的对象,只要是对象,就可以存储,集合可以分为很多种,他们的底层的存储结构是不一样的(数据结构),所以不同的集合有不同的功能,根据情况选择不同集合。但是他们有共同的特点,就把特点抽取出来了,形成了接口Collection。

       集合的长度是变化的,数组的度长是固定的。

2、共性方法

(1)Add方法的参数类型是Object,以便于接收任意类型对象。

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

public static void base_method() {

ArrayList al = new ArrayList();

// 1、添加元素

al.add("java01");

al.add("java02");

al.add("java03");

al.add("java04");

// 打印原集合

sop("原集合:" + al);

// 2、删除元素

al.remove("java02");

// al.clear(); //清空集合中的元素

sop("后来的集合:" + al);

//3、 获取长度

sop("al的长度:"+al.size());

//4、判断

sop("al中是否含有java01"+al.contains("java01"));

sop("al是否为空:"+al.isEmpty());

}

3、迭代器

       迭代器是用来获取集合中元素,其实迭代器是集合的内部类,因为捏不累读取本类的数据最方便,但是不同的集合他们的存储的结构不同,并且每个集合都要读取数据,所以就把他们共同的方法抽取出来,然后利用本类来返回他们自己的迭代器,这样既方便又安全。

       hasNext(),判断元素是否可以迭代next()方法然后迭代的下一个元素remove()从集合中移除此元素

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

for(Iterator it=al.iterator();it.hasNext();)
{
 System.out,println(it.next());
}

第一种方式while循环完后,对象还在内存中,而第二种方式for循环完后,对象被回收了,因为实在for内部定义的,属于局部变量。

4、List集合共性方法

        List中的元素是有序的,元素可以重复,因为该集合体系有索引
Set元素是无序的,不可以重复。

List集合中特有方法:

增:
add(index,obj)在指定位置插入元素。
addAll(index,Collection)添加一个集合进去
删:
remove(index)移除指定位置的元素。
改:
set(index,obj)修改指定位置元素
查:
get(index)
for(int i=0;i<al.size();i++)
{
 al.get(i);
}
迭代器获取:
Iterator it=al.iterator();
while(it.hasNext())
{
 System.out,println(it.next());
}
//通过indexOf获取对象的位置
al.indexOf(obj);
//截取字串
al.subList(start,end);

5、ListIterator

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

在迭代时,不可以通过集合对象的方法操作集合中的元素(会发生ConcurrModificationException异常),而Iterator方法有限,如果想要添加、修改就要用ListIterator。

public class ListDemo {

  public static void main(String[] args) {

    List list = new ArrayList();

    list.add("java01");

    list.add("java02");

    list.add("java03");

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

    /* 在第二位置添加元素 */

    list.add(1, "java00");

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

    /* 利用自己的迭代器读取和插入数据,在java03后面添加元素 */

    ListIterator it = list.listIterator(0);

    while (it.hasNext()) {

      if (it.next().equals("java03")) {

         it.add("javaLast");

      }

    }

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

    /*List集合中1~3的元素,包含头不包含尾*/

    List list1=list.subList(1, 3);

    System.out.println("集合List1=" + list1);

  }

 

}

结果:

集合:[java01, java02, java03]

集合:[java01, java00, java02, java03]

集合:[java01, java00, java02, java03, javaLast]

集合List1=:[java00, java02]

6、List子集

List集合子对象:ArrayList,LinkedList,Vector。
ArrayList底层使用的是数组结构,特点在于查询速度很快,但是增删稍慢。线程不同步
LinkedList使用的是链表结构。特点就是增删速度很快,查询很慢。
Vector:底层是数组数据结构,出现较早。1.0版本就出现了。线程不同步。无论增删还是查询都慢。被ArrayList取代了。

7、Vector

枚举就是Vector特有的取出方式。(迭代器、遍历、for循环、按角标索引)

因为枚举的名称和方法的名称都长,所以被迭代器取代了,枚举郁郁而终了。

public static void main(String[] args){

Vector v=new Vector();

v.add("java01");

v.add("java02");

v.add("java03");

Enumeration eunm=v.elements();

while(eunm.hasMoreElements())

{

System.out.println(eunm.nextElement());

}

8、LinkedList

 addFirst();addLast();

 getFirst();getLast(); 获取元素但是不删除元素

 removeFirst();removeLast();获取元素但是删除元素,如果不存在此元素,那么据会抛出异常

1.6版本后的新方法

pollFirst();pollLast();获取并移除第一个元素或者最后一个元素,如果不存在,返回为null,不抛出异常。

offerFirst();offerlast();

peekFirst();peekLast();

例子: 

import java.util.LinkedList;

public class LinkedListDemo {

  public static void main(String[] args) {

    LinkedList list = new LinkedList();

    list.add("forward01");

    list.addFirst("forward00");

    list.addLast("forwardLast");

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

    // list.get(3);// 此会报异常,原因是集合中没有此元素

    System.out.println("集合中的第一个元素:" + list.remove(0));// 移除并且能获得,但是如果没有此元素的话,那么就会报异常

    System.out.println("移除第一个元素后的集合:" + list);

    System.out.println("获取第一个元素:" +list.peekFirst());// 获取第一个元素,但是不移除,如果不存在,则是null

    System.out.println("获取第一个元素:" +list.peekLast());// 获取最后一个元素,但是不移除,如果不存在,则是null

  }

}

集合:[forward00, forward01, forwardLast]

集合中的第一个元素:forward00

移除第一个元素后的集合:[forward01, forwardLast]

获取第一个元素:forward01

获取第一个元素:forwardLast

9、LinkedList练习

需求:
使用LinkedList模拟一个堆栈或队列数据结构。
堆栈:先进后出,如同一个杯子;
队列:先进先出,如同一个水管。

class Queue {

private LinkedList link;

Queue(){

link = new LinkedList();

}

public void myAdd(Object obj) {

link.addFirst(obj);

}

 

public Object myGet() {

//注:此处用removeLast()而不是getLast()

 return link.removeLast();

}

public boolean isNull(){

return link.isEmpty();

}

}

class Zhan {

private LinkedList link;

Zhan(){

link = new LinkedList();

}

public void myAdd(Object obj) {

link.addFirst(obj);

}

public Object myGet() {

//注:此处用removeLast()而不是getLast()

 return link.removeFirst();

}

public boolean isNull(){

return link.isEmpty();

}

}

public class LinkedListTest {

public static void main(String[] args) {

System.out.println("队列打印:");

Queue q=new Queue();

q.myAdd("java01");

q.myAdd("java02");

q.myAdd("java03");

while(!q.isNull()){

System.out.println(q.myGet());

}

System.out.println("堆栈打印:");

Zhan z=new Zhan();

z.myAdd("java01");

z.myAdd("java02");

z.myAdd("java03");

while(!z.isNull()){

System.out.println(z.myGet());

}

}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值