黑马程序员-java基础-集合List

-----Java培训、Android培训、iOS培训、.Net培训、期待与您交流!

Collection体系

    Collection

    ——| List 子接口,特点在于元素有序,可以重复

        ——| Vector:底层的数据结构是数组,线程安全,但速度慢,已被ArrayList替代。

        ——| ArrayList:底层的数据结构是数组。特点:查询速度很快。但是增删稍慢。线程不同步。

——| LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。

    ——| Set 子接口,特点在于元素无序,元素不可重复

        ——| HashSet:底层数据结构是哈希表,是线程不安全的,不同步。

——| TreeSet:可以对Set集合中的元素进行排序(红黑树)

Collection共性方法:

1.添加

boolean add(Object obj):添加单个元素

boolean addAll(Collection c):添加多个元素

2.删除

void clear():移除所有元素

boolean remove(Object o):移除单个元素,有一个删除,就返回true

boolean removeAll(Collection c):移除多个元素

3.判断

boolean contains(Object obj):判断元素是否存在

boolean containsAll(Collection c):判断一个集合的元素是否包含在当前集合中

boolean isEmpty():判断集合是否为空

4.获取

Iterator iterator():返回集合上的一个迭代器

int size():元素个数

5.获取交集

boolean retainAll(Collection c):交集

6.集合变数组

Object[] toArray()

特殊说明:

迭代器Iterator

迭代器的实现依赖于内部类,正如我们所知,人体包括心肝脾肾肺,这这些都是人体内部的独立单元,但是又无法脱离人体,所以在在描述人体时将心肝脾肾肺定义为人体的内部类。在操作集合框架元素时具体怎样去操作不同的数据结构有不同的实现,而这些不同的实现又依赖于集合框架,所以将迭代器定义为集合框架的内部类,从而可以通过集合对象直接访问集合中的元素。

迭代器的方法:

boolean hasNext()判断是否还有元素可以迭代

next()返回迭代的下一个元素,获取的元素默认为Object类

注意:

1.迭代器在Collcection接口中是通用的,它替代了Vector类中的Enumeration(枚举)

2.迭代器的next()方法是自动向下取元素,要避免出现NoSuchElementException

3.迭代器的next方法返回值类型是Object,所以要记得类型转换

List接口特有功能:

1.添加元素

void add(int index, Object element):在指定位置添加指定元素

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

2.删除元素

Object remove(int index):返回并删除指定位置的元素

3.修改元素

Object set(int index, Object element):修改指定位置的元素

4.查找元素

Object get(int index):根据指定索引获取元素

List<E> subList(int fromIndex, int toIndex)返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的部分视图。

int indexOf(Object o)返回此列表中第一次出现的指定元素的索引,如不包括,返回-1

ListIterator listIterator()List特有的迭代器

List特有迭代器

ListIterator<E> listIterator():返回按适当顺序在列表的元素上进行迭代的迭代器。

List迭代器特有方法:

void add(E e) 将指定的元素插入列表

boolean hasPrevious() 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true

int nextIndex() 返回对 next 的后续调用所返回元素的索引

E previous() 返回列表中的前一个元素

int previousIndex() 返回对 previous 的后续调用所返回元素的索引

void set(E e) 用指定元素替换 next 或 previous 返回的最后一个元素

void remove()从列表中移除由 next 或 previous 返回的最后一个元素

ListIterator说明:

在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用List特有迭代器:ListIterator。

如果使用公用迭代器,在修改迭代元素是会发生 ConcurrentModificationException 异常

Vector

说明:底层的数据结构是数组,线程同步,效率低已被ArrayList替代

特点:查询快,增删慢

Vector特有方法:

1.添加元素

void addElement(Object obj) JDK1.2 后改为了add(Object obj)

2.获取元素

Object elementAt(int index) JDK1.2后就改为了get(int index),通过角标拿元素

3.遍历元素

Enumeration elements()

boolean hasMoreElements()

Object nextElement()

Enumeration elements()

Enumeration就是枚举,枚举就是Vector特有的取出方式。

Arraylist

说明:底层的数据结构使用的是数组结构。

特点:查询速度很快。但是增删稍慢。线程不同步。

LinkList

说明:底层使用的链表数据结构。

特点:增删速度很快,查询稍慢,线程不同步。

LinkList特有方法:

1.添加元素:

void addFirst(E e) 将指定元素插入此列表的开头。

void addLast(E e) 将指定元素添加到此列表的结尾。

2.获取元素:

E getFirst()返回此列表的第一个元素。

E getLast()返回此列表的最后一个元素。

3.删除元素:

E removeFirst()移除并返回此列表的第一个元素。

E removeLast()移除并返回此列表的最后一个元素。

事例演示:

      1.向vector中方添加元素,并使用特有方法遍历Vector

import java.util.Enumeration;
import java.util.Vector;

class VectorDemo
{
    public static void main(String[] args)
    {
        Vector v = new Vector();
        v.add("java01");//使用Collection共有方法向Vector中添加元素
        v.add("java02");
        v.add("java03");
        v.addElement("java04");//使用Vector特有方法向Vector中添加元素
        Enumeration en = v.elements();//使用Vector特有方法迭代元素
        while(en.hasMoreElements())
        {
            System.out.println(en.nextElement());
        }
    }
}

     2. 向ArrayList中添加Person对象,去重,并用特有方法遍历ArrayList(特有方法可以在遍历的同时进行修改,本例子省略)

package List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*
将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。
思路:对人进行描述,将数据封装进对象
    定义容器,将数据存入,取出。
*/
class Person{
    public String name;
    public int age;
    Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String getName(){
        return name;
    }
    public int  getAge(){
        return age;
    }
    //重写equals方法,规定name,age相同则表示同一个对象
    public boolean equals(Object o)
    {
        if(!(o instanceof Person))
            return false;
        Person p=(Person) o;
        return this.name.equals(p.name)&&this.age==p.age;
    }
}
public class ArrayListDemo1 {
    public static void main(String[] args) {
        List l=new ArrayList();
        l.add(new Person("01",20));//使用公用方法向ArrayList中添加Person对象。
        l.add(new Person("02",30));
        l.add(new Person("02",30));
        l.add(new Person("04",50));
        l.add(new Person("04",50));
        print(l);//打印去重之前的ArrayList
        l=signleElement(l);//去重
        System.out.println(l.remove(new Person("01",20)));//只匹配第一个相同的对象,也就是只删除第一个匹配的元素
        print(l);//打印去重之后的ArrayList
    }

    //去重,并返回ArrayList
    public static ArrayList signleElement(List l){
        ArrayList newList=new ArrayList();
        Iterator it=l.iterator();
        while(it.hasNext())
        {
            Object o=it.next();
            if(!newList.contains(o))
                newList.add(o);
        }
        return newList;
    }
    //打印
    static void print(List list)
    {
        ListIterator it=list.listIterator();//特有方法遍历,可以修改元素值,本例子省略
        while(it.hasNext())
        {
            Person p=(Person) it.next();
            System.out.println(p.getName()+"...."+p.getAge());
        }
    }
}

      3.使用LinkedList模拟队列的FIFO规则

package List;
/*
使用LinkedList模拟一个堆栈或者队列数据结构。
堆栈:先进后出  如同一个杯子。
队列:先进先出 First in First out  FIFO 如同一个水管。
*/

import java.util.*;
class DuiLie
{
    private LinkedList link;
    DuiLie()
    {
        link = new LinkedList();
    }
    public void myAdd(Object obj)
    {
        link.addFirst(obj);//在第一个元素位置添加元素
    }
    public Object myGet()//获取第一个元素,从而模拟队列的FIFO
    {
        return link.removeFirst();
    }
    public boolean isNull()
    {
        return link.isEmpty();
    }
}
public class  LinkedListDeno
{
    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())
        {
            System.out.println(dl.myGet());
        }
    }
}

时间: 2024-10-20 15:06:39

黑马程序员-java基础-集合List的相关文章

黑马程序员——java基础——集合(Collection)

 黑马程序员--java基础--集合(Collection) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 集合框架的构成及分类,如下图: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的.数组中可以存储基本数据类型,集合只能存储对象. 3.

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员---java基础--集合、数组、字符串的综合面试题

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 这道题综合了集合,数组,字符串,字符串缓冲区,自动装箱等知识点,你把这道题做会了,java基础你也就学的差不多了. 问题: 自定义一个段由小写字母组成的字符串统计每个字母出现的次数. 例如:abc,输出结果为:a(1)b(1)c(1) 代

黑马程序员-Java基础-集合框架-TreeSet、二叉树、泛型

第一讲 TreeSet 1.  概述 TreeSet可以对Set集合中的元素进行排序,按照自然顺序排. 2.  演示代码 输出结果: 总结:TreeSet会对元素进行自然排序,大写排在小写前面. 第二讲  TreeSet存储自定义对象 1. 概述: 将自定义对象存储到TreeSet集合中. 2. 思路: 自定义学生类,并将学生对象存储到TreeSet中,在存储过程中按照年龄排序. 3. 练习:往TreeSet集合中存储自定义对象(学生),并按照学生年龄进行排序 小结: 自定义对象需要重写Comp

黑马程序员——java基础---集合框架

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.集合框架 概念:集合框架是Java中为了方便对集合进行存储.操作而形成的体系.集合是针对对象最常见的一种存储形式. 数组和集合类同是容器,区别在哪里?     相同点:               集合和数组都是容器,都可一存储对象(对象引用).     不同点:               数组长度固定,集合长度可变.               数组可以存储基本数据类型,集合却只能存储

黑马程序员——JAVA基础——集合

----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.关于java中的集合类 首先看一下,大致的框架流程图 通过这些我们可以看出来,通常我们经常采用的vector.arraylist.hashset,treeset,hashmap,hashtable,treemap.linkedlist类 关于vector和arraylist对比,vector是线程安全的,vector通过遍历,性能更高. ArrayList和Vector功能类

黑马程序员——Java基础---集合(一)---Collection、set、list

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------        集合框架 java中有许多的集合,也称为容器,下图便是集合框架的构成及分类. 一.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式.

黑马程序员------java基础----集合

  ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! -------  集合框架 为什么会出现这么多容器? 因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构. 一.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存

黑马程序员——Java基础---集合(二)------Map集合

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Map集合 一.概述 1.简述: Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key) 2.特点: 1)该集合存储键值对,一对一对往里存 2)要保证键的唯一性

黑马程序员-java基础-集合Set

-----Java培训.Android培训.iOS培训..Net培训.期待与您交流! Set      Set中存放的元素无序,不可重复.取出方式只能说迭代器. Set体系   ——| Set 子接口,特点在于元素无序,元素不可重复         ——| HashSet:底层数据结构是哈希表,是线程不安全的,不同步. ——| TreeSet:可以对Set集合中的元素进行排序(红黑树) HashSet保证元素唯一性原理 保证元素唯一性主要是通过元素hash值,当hash值不同时认为是不同元素,当