Java中集合的讲解

问题:

1、什么是集合

2、集合重用的有哪几种

3、集合中HashSet的存储样例

4、集合的遍历方法

集合:存储对象数据的集合容器

单例集合

——–| Collection 单例集合的根接口

————-|List 如果是实现了List接口的集合类,具备的特点:有序,可重复

—————-|ArrayList ArrayList底层是使用了Object数组实现的,特点:查询速度快,增删慢

—————-|LinkedList LinkedList底层是使用了链表数据结构实现的,特点:查询速度慢,增删快

—————-| Vector 底层是使用了Object数组实现的,实现原理与ArrayList是一致的,但是是线程安全的,操作效率低

————-|Set 如果是实现了Set接口的集合类,具备的特点:无序,不可重复

—————-|HashSet 底层是使用了哈希表实现的, 特点:存取速度快

HashSet存储元素的原理

往HashSet添加元素的时候,首先会调用元素的HashCode方法得到元素的哈希码值,然后把哈希码值经过运算算出该元素存在哈希表中的位置

情况1:如果算出的位置目前还没有存在任何的元素,那么该元素可以直接添加到哈希表中

情况2:如果算出的位置目前已经存在其他的元素,那么还会调用元素的equals方法再与这个位置上的元素比较一次

如果equals方法返回的是true,那么该元素被视为重复元素,不允许添加,如果equals返回的是false,那么该元素也可以被添加

—————-|TreeSet 底层是使用了红黑树(二叉树)数据结构实现的,特点:对集合中的元素进行排序存储

TreeSet要注意的事项

1、往TreeSet添加元素的时候,如果元素具备自然顺序的特点,那么TreeSet会根据元素的自然顺序特性进行排序存储

2、往TreeSet添加元素的时候,如果元素不具备自然顺序的特点,那么元素所属的类必须要实现Comparable接口,把比较的规则定义在CompareTo方法上

3、往TreeSet添加元素的时候,如果元素不具备自然顺序的特点,那么元素所属的类也没有实现Comparable接口,那么在创建TreeSet对象的时候必须要传入比较器对象

比较器的定义格式:
    class 类名 implements Comparator{
    }

双列集合

———|Map 存储的数据都是以键值对的形式存在的,键可以不重复,值可以重复

————|HashMap 底层也是使用了哈希表实现的

————|TreeMap 底层也是使用了红黑树数据结构实现的,默认对元素进行自然排序(String),如果在比较的时候两个对象返回值为0,那么元素重复

————|HashTable 底层也是使用了哈希表维护的,存取的读取快,存储元素是无序的

HashSet样例的说明

class person{
    int id;
    String name;
    public person(int id,String name){
        super();
        this.id=id;
        this.name=name;

    }
    public String toString(){
        return "id是:"+this.id+" name是:"+this.name;
    }
}
public class CollectionDemo {

    public static void main(String[] args) {
        HashSet<person> hs=new HashSet<person>();
        hs.add(new person(123,"张三"));
        hs.add(new person(123,"张三"));
        System.out.println("集合的元素"+hs);

    }

}

运行的结果是

集合的元素[id是:123 name是:张三, id是:123 name是:张三]

如果在person类中增加了自己实现的hashCode方法以后

public int hashCode(){
        return this.id;
    }

运行的结果是

集合的元素[id是:123 name是:张三, id是:123 name是:张三]

如果在person类中增加了自己实现的hashCode方法和equals方法以后

public int hashCode(){
        return this.id;
    }
    public boolean equals(Object obj){
        person p=(person)obj;
        return this.id==p.id;
    }

运行的结果是

集合的元素[id是:123 name是:张三]

集合的遍历方法有常用的for循环 迭代器 entrySet等方法

package cn.xlucas.list;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

public class CollectionDemo1 {

    public static void main(String[] args) {
        System.out.println("======get方式遍历=========");
        ArrayList<String> ls=new ArrayList<String>();
        ls.add("张三");
        ls.add("李四");
        ls.add("王五");
        for(int i=0;i<ls.size();i++){
            System.out.println(ls.get(i));
        }
        //使用迭代器  注意: 迭代器在迭代的 过程中不能使用集合对象修改集合中的元素个数。如果需要修改要使用迭代器的方法进行修改,
        System.out.println("======迭代器方式遍历=========");
        HashSet<String> hs=new HashSet<String>();
        hs.add("张三");
        hs.add("李四");
        hs.add("王五");
        Iterator<String> it=hs.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    System.out.println("======迭代器方式for增强版遍历=========");
    for(String item:hs){
        System.out.println(item);
    }

    System.out.println("======entrySet方式遍历=========");
    HashMap<String,String> mp=new HashMap<String,String>();
    mp.put("1", "张三");
    mp.put("2", "李四");
    mp.put("3", "王五");

    Set<Entry<String, String>> entrys=mp.entrySet();
    for(Entry<String,String> entry:entrys){
        System.out.println("键位:"+entry.getKey()+" 值为: "+entry.getValue());
    }

    }

}

结果为

======get方式遍历=========

张三

李四

王五

======迭代器方式遍历=========

张三

李四

王五

======迭代器方式for增强版遍历=========

张三

李四

王五

======entrySet方式遍历=========

键位:3 值为: 王五

键位:2 值为: 李四

键位:1 值为: 张三

时间: 2024-09-29 20:46:54

Java中集合的讲解的相关文章

关于Java中集合的讲解~

http://blog.csdn.net/zccst/article/details/5092816 comparable& Comparator 都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo().Comparable是一个对象本身就已经支持自比较所需要实现的接口(

Java中集合的概述

一.集合和数组的区别 1.数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 2.集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. 二.Java中集合框架图解与说明 1.Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类.但是却让其被继承产生了两个接口,就是Set和List.Set中不能包含重复的元素.List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式.常用方法如下

Java中集合与数组的切换

在Java开发中常常遇见集合与数组的互相切换,如何实现呢,呵呵呵,很简单: import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class Test { /** * 将Set集合转换为数组 * * @author GaoHuanjie */ private static void setT

JAVA中集合转数组遍历

JAVA中集合的遍历的一种方法时集合转数组遍历,也是就调用Collection中的toArray(). 代码: public static void main(String[] args) {        // TODO Auto-generated method stub        Collection c=new ArrayList();        c.add(new Student("kj",12));        c.add(new Student("uj

Java中集合List,Map和Set的区别

Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Key不能重复 4.Set中的元素是无序的,不可重复的

Java中集合关键字的区别

1. ArrayList.Vector和Stack有什么区别? 1.ArrayList的方法和实现基本上和Vector一样,底层都是数组的实现(简:API基本一样) ?   2.Stack继承了Vector,两者的方法都是线程安全,ArrayList没有考虑线程的问题 3.vector速度慢,ArrayList做了优化,效率更高 2. ArrayList 和 LinkedList 的区别? 1. ArrayList底层是数组的实现,linkedList地层是连接的实现(简:数据结构不同) 1.1

JAVA中集合输出的四种方式

在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public static void main(String[] args) throws Exception { Set<Person> javaProgramers = new HashSet<Person>(); javaProgramers.add(new Person("aaron&qu

java中集合的扩容

对于Java中的各种集合类,根据底层的具体实现,小结了一下大致有3种扩容的方式: 1.对于以散列表为底层数据结构实现的,(譬如hashset,hashmap,hashtable等),扩容方式为当链表数组的非空元素除以数组大小超过加载因子时, 链表数组长度变大(乘以2+1),然后进行重新散列. 2.对于以数组为底层数据结构实现的,譬如ArrayList,当数组满了之后,数组长度变大(乘以3/2+1),然后将原数组中的数据复制到新数组中. 3.对于以链表结构实现的,譬如TreeSet,TreeMap

Java中集合Set的用法

转载 http://blog.163.com/asd_wll/blog/static/210310402010112833332260/ 1.HashSet类 Java.util.HashSet类实现了Java.util.Set接口. l  它不允许出现重复元素: l  不保证和政集合中元素的顺序 l  允许包含值为null的元素,但最多只能有一个null元素. 范例: import java.util.Date; import java.util.HashSet; import java.ut