黑马程序员_集合之单列集合

来源:互联网 发布:好玩的app软件 编辑:程序博客网 时间:2024/06/06 07:30
------- android培训、java培训、期待与您交流!----------
为什么要有集合?
出现意义:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。


集合与数组辨析
一.容器长度
1)集合长度可变
2)数组长度固定
二.存储内容类型
1)集合存储引用数据类型
2)数组存储任意类型
三.是否可存储不同类型数据
1)集合可以存储不同类型数据
2)数组只能存储相同数据类型
集合的概述
Java中的集合: JDK为我们提供了一套完整的容器类库,这些容器可以用于存储各种类型的对象,并且长度都是可变的,我们把这些类统称为集合类,它们都位于java.util包中。
分类:
单列集合Collection
List:元素有序、包含重复元素


Set:元素无序、不包含重复元素


双列集合Map:键值映射关系


其他功能接口


迭代器Iterator


Comparable与Comparator用于比较元素


一.Collection
单列集合:
|--Collection
|--List
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
|--Set
|--HashSet
底层数据结构是哈希表。
如何保证唯一性?
依赖hashCode()和equals()
顺序:
先判断hashCode()值是否相同:
是:继续走equals(),看返回值
true:元素重复。不添加
false:元素不重复。添加
否:直接添加
|--LinkedHashSet
底层数据结构是链表和哈希表。
由链表保证有序(存储和取出一致)。
由哈希表保证元素唯一。
|--TreeSet
底层数据结构是二叉树。
如果保证唯一性?
根据返回值是否是0。
如何排序:
自然排序:Comparable
比较器排序:Comparator
主要方法:
boolean add(E e)  添加元素   返回值类型表示:添加是否成功




boolean remove(Object o)  删除指定元素






size() 获取长度




contains()判断集合是否包含此对象


单列集合迭代器方法:


Iterator iterator() 返回在此 collection 的元素上进行迭代的迭代器。迭代器:用来迭代的工具,用来遍历集合的工具。




迭代器的方法:
boolean hasNext()  如果仍有元素可以迭代,则返回 true。
集合中存储的数据类型  next()  返回迭代的下一个元素。 默认是Object。
增加元素:
[java] view plaincopy
package cn.itcast2;  
  
import java.util.ArrayList;  
import java.util.Collection;  
  
/* 
 * Collection类的方法:   此处以ArrayList作为子类对象 
 *      构造:使用子类对象 
 *      普通方法: 
 *          boolean add(E e)  添加元素   返回值类型表示:添加是否成功 
 */  
public class Demo2 {  
  
    public static void main(String[] args) {  
  
        //创建集合对象  
        Collection c = new ArrayList();  
          
        //准备元素  
        int luckyNumber = 13;  
        String myWords = "休息时候十个小时都用到!";  
        Student s = new Student("刘亦菲",27);  
          
        //将元素放到集合中  
        c.add(luckyNumber);  
        c.add(myWords);  
        c.add(s);  
          
        //遍历集合  
        System.out.println(c);  
          
    }  
      
使用迭代器遍历代码实现:
[java] view plaincopy
package cn.itcast2;  
  
import java.util.ArrayList;  
import java.util.Collection;  
import java.util.Iterator;  
  
/* 
 * 单列集合迭代器方法: 
 *  Iterator iterator() 返回在此 collection 的元素上进行迭代的迭代器。迭代器:用来迭代的工具,用来遍历集合的工具。 
 *  
 *  迭代器的方法: 
 *      boolean hasNext()  如果仍有元素可以迭代,则返回 true。 
 *      集合中存储的数据类型  next()  返回迭代的下一个元素。 默认是Object。 
 */  
public class Demo7 {  
          
    public static void main(String[] args) {  
  
        //创建集合对象  
        Collection c = new ArrayList();  
        //准备元素对象  
        String name = "卢俊义";  
        String name2 = "宋江";  
        String name3 = "扈三娘";  
        String name4 = "孙二娘";  
        String name5 = "顾大嫂";  
        //将元素放入到集合  
        c.add(name);  
        c.add(name2);  
        c.add(name3);  
        c.add(name4);  
        c.add(name5);  
        //迭代集合(遍历集合)  
        //a:产生该集合的迭代器  
        Iterator i = c.iterator();  
        //b:调用迭代器的方法,遍历集合  
        while(i.hasNext()) {  
            Object next = i.next();  
            String sNext = (String)next;  
            System.out.println(sNext);  
        }  
          
        System.out.println("获取完了!");  
          
    }  
  
}  


两大子接口: List接口  Set接口
【List接口】
List接口的特点是:有序(获取顺序与存储方法一致),有索引,可有重复对象元素
常用方法(特点: 可以操作索引):
添加方法
void add(index, element)


void add(index, collection)






删除
Object remove(index)






获取
Object get(index) 可以不用迭代器获取元素, List特有


int IndexOf(Object) 通过内容返回索引。


int lastIndexOf(Object) 通过内容查找最后一次出现的索引




ListIterator<E> listIterator()  返回功能更强大的迭代器(通过List的特有迭代器完成并发的修改)






List接口实现类有:ArrayList,  LinkedList, Vecter(被ArrayList替代)






增强for循环(foreach循环):


用于快速遍历集合或数组的方式




格式:
 for (容器内类型   临时变量 : 被遍历的容器) {


  使用临时的变量


}
  


增强for循环底层是迭代器的结构,所以在遍历过程当中不能添加元素。
即增强for循环就是用来遍历集合的,不能修改集合元素。




1.ArrayList实现类概述:


底层数据结构是数组,查询快,增删慢。


线程不安全,效率高。


代码请见(迭代器使用)


2.Vector:线程安全的,速度慢的(老的ArrayListt)实现类概述:
代码实现:
[java] view plaincopy
<strong>package cn.itcast;  
  
import java.util.Iterator;  
import java.util.List;  
import java.util.ListIterator;  
import java.util.Vector;  
  
/* 
 * Vector:线程安全的,速度慢的,老的ArrayList 
 * 使用List存储人名,当人名为唐嫣时,将唐嫣改名为刘亦菲,并加入一个新的人名叫做戚薇 
 */  
public class Demo {  
  
    public static void main(String[] args) {  
          
        List list = new Vector();  
          
        //定义一个标志位  
        boolean b = false;  
          
        String name = "唐嫣";  
        String name2 = "刘菲";  
        String name3 = "胡斐";  
        String name4 = "苗人凤";  
          
        list.add(name);  
        list.add(name2);  
        list.add(name3);  
        list.add(name4);  
          
        ListIterator iterator = list.listIterator();  
          
        while (iterator.hasNext()) {  
            String sName = (String) iterator.next();  
              
            if("唐嫣".equals(sName)) {  
                iterator.set("刘亦菲");  
                b = true;  
            }  
        }  
  
        if(b) {  
            list.add("戚薇");  
        }  
          
        System.out.println(list);  
    }  
  
}</strong>  


3.LinkedList: List的链表实现,提供了许多头尾操作
 * public void addFirst(E e) 在集合头部添加元素
 * public void addLast(E e)  在集合尾部添加元素
 * public E getFirst() 获取头部元素
 * public E getLast()  获取尾部元素
代码实现:
[java] view plaincopy
<strong>package cn.itcast;  
  
import java.util.LinkedList;  
  
/* 
 * LinkedList: List的链表实现,提供了许多头尾操作 
 * public void addFirst(E e) 在集合头部添加元素 
 * public void addLast(E e)  在集合尾部添加元素 
 * public E getFirst() 获取头部元素 
 * public E getLast()  获取尾部元素 
 */  
public class Demo3 {  
  
    public static void main(String[] args) {  
  
        LinkedList ll = new LinkedList();  
          
        ll.add("石秀");  
        ll.add("时迁");  
        ll.add("石头");  
          
        System.out.println(ll);  
          
        ll.addFirst("石破天");  
        ll.addLast("史进");  
          
        for (Object s: ll) {  
            String s2 = (String)s;  
            System.out.println(s2);  
        }  
        System.out.println("==========================");  
        System.out.println(ll.getFirst());  
        System.out.println(ll.getLast());  
    }  
  
}</strong>  


【Set接口】
Set接口的特点是:无序(获取顺序与存储方法不一致),无索引,不可有重复对象元素


Set 接口中的方法与Collection中的方法一致。


实现类有:HashSet,  TreeSet. LinkedHashSet 是HashSet的子类


HashSet代码实现:
[java] view plaincopy
package cn.itcast2;  
  
import java.util.HashSet;  
import java.util.Set;  
  
/* 
 * Set集合:元素唯一,无序的集合 
 *      这里使用HashSet 
 */  
public class Demo {  
  
    public static void main(String[] args) {  
        //创建集合对象  
        Set set = new HashSet();  
          
        String name = "梅超风";  
        String name2 = "杨过";  
        String name3 = "小龙女";  
          
        //添加元素  
        set.add(name);  
        set.add(name2);  
        set.add(name3);  
  
        System.out.println(set);  
      
    }  
  
}  


LinkedHashSet代码实现
[java] view plaincopy
package cn.itcast2;  
  
import java.util.Iterator;  
import java.util.LinkedHashSet;  
  
/* 
 * LinkedHashSet:存入的顺序与取出的顺序是一致的,相当于有序了。 
 */  
  
public class Demo3 {  
  
    public static void main(String[] args) {  
  
        LinkedHashSet lhs = new LinkedHashSet();  
          
        lhs.add("b许攸");  
        lhs.add("a曹操");  
  
        Iterator iterator = lhs.iterator();  
          
        while(iterator.hasNext()) {  
            Object next = iterator.next();  
            String s = (String)next;  
            System.out.println(s);  
        }  
    }  
  
}  


TreeSet代码实现:(如果要对自定义类型排序,就需要自然排序:Comparable或者比较器排序:Comparator
)
[java] view plaincopy
<strong>package cn.itcast2;  
  
import java.util.TreeSet;  
  
/* 
 * TreeSet:可以对集合中的元素进行排序 
 *  
 * String与Integer这样的元素,均因为实现了Comparable,具备了指定的比较规则。 
 */  
public class Demo4 {  
  
    public static void main(String[] args) {  
  
        TreeSet ts = new TreeSet();  
          
        String name = "b黄月英";  
        String name2 = "a小乔";  
          
        ts.add(name);  
        ts.add(name2);  
        for(Object obj : ts) {  
            String s= (String)obj;  
            System.out.println(s);  
        }  
  
    }  
  

}</strong>  










版权声明:本文为博主原创文章,未经博主允许不得转载。


0 0
原创粉丝点击