Java集合类(一)

澳门新浦京娱乐游戏 6

最近被陆陆续续问了几遍HashMap的实现,回答的不好,打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们的程序;另一方面是学习借鉴JDK是如何实现了这么一套优雅高效的类库,提升编程能力。

借鉴原文出处
liujiacai(@jiacai2050)

集合框架

集合代表了一组对象(和数组一样,但数组长度不能变,而集合能)。Java中的集合框架定义了一套规范,用来表示、操作集合,使具体操作与实现细节解耦。

在介绍具体适合类之前,本篇文章对Java中的集合框架做一个大致描述,从一个高的角度俯视这个框架,了解了这个框架的一些理念与约定,会大大帮助后面分析某个具体类,让我们开始吧。


设计理念

主要理念用一句话概括就是:提供一套“小而美”的API。API需要对程序员友好,增加新功能时能让程序员们快速上手。
为了保证核心接口足够小,最顶层的接口(也就是Collection与Map接口)并不会区分该集合是否可变(mutability),是否可更改(modifiability),是否可改变大小(resizability)这些细微的差别。相反,一些操作是可选的,在实现时抛出UnsupportedOperationException即可表示集合不支持该操作。集合的实现者必须在文档中声明那些操作是不支持的。

集合框架(collections framework)

首先要明确,集合代表了一组对象(和数组一样,但数组长度不能变,而集合能)。Java中的集合框架定义了一套规范,用来表示、操作集合,使具体操作与实现细节解耦。

其实说白了,可以把一个集合看成一个微型数据库,操作不外乎“增删改查”四种操作,我们在学习使用一个具体的集合类时,需要把这四个操作的时空复杂度澳门新浦京娱乐游戏,弄清楚了,基本上就可以说掌握这个类了。

集合框架

两大基类Collection与Map

在集合框架的类继承体系中,最顶层有两个接口:
Collection表示一组纯数据
Map表示一组key-value对
一般继承自Collection或Map的集合类,会提供两个“标准”的构造函数:
没有参数的构造函数,创建一个空的集合类
有一个类型与基类(Collection或Map)相同的构造函数,创建一个与给定参数具有相同元素的新集合类
因为接口中不能包含构造函数,所以上面这两个构造函数的约定并不是强制性的,但是在目前的集合框架中,所有继承自Collection或Map的子类都遵循这一约定。

澳门新浦京娱乐游戏 1

Collection

如上图所示,Collection类主要有三个接口:
Set
表示不允许有重复元素的集合(A collection that contains no duplicate
elements)
List
表示允许有重复元素的集合(An ordered collection (also known as a
sequence))
Queue
JDK1.5新增,与上面两个集合类主要是的区分在于Queue主要用于存储数据,而不是处理数据。(A
collectiondesigned for holding elements prior to processing.)

澳门新浦京娱乐游戏 2

Map

Map并不是一个真正意义上的集合(are not true
collections),但是这个接口提供了三种“集合视角”(collection views
),使得可以像操作集合一样操作它们,具体如下:
把map的内容看作key的集合(map’s contents to be viewed as a set of
keys)
把map的内容看作value的集合(map’s contents to be viewed as a collection
of values)
把map的内容看作key-value映射的集合(map’s contents to be viewed as a set
ofkey-value mappings)

设计理念

主要理念用一句话概括就是:提供一套“小而美”的API。API需要对程序员友好,增加新功能时能让程序员们快速上手。
为了保证核心接口足够小,最顶层的接口(也就是Collection与Map接口)并不会区分该集合是否可变(mutability),是否可更改(modifiability),是否可改变大小(resizability)这些细微的差别。相反,一些操作是可选的,在实现时抛出UnsupportedOperationException即可表示集合不支持该操作。集合的实现者必须在文档中声明那些操作是不支持的。

为了保证最顶层的核心接口足够小,它们只能包含下面情况下的方法:

  1. 基本操作,像之前说的“增删改查”
  2. There is a compelling performance reason why an important
    implementation would want to override it.

此外,所有的集合类都必须能提供友好的交互操作,这包括没有继承Collection类的数组对象。因此,框架提供一套方法,让集合类与数组可以相互转化,并且可以把Map看作成集合。

(collections framework)

首先要明确,集合代表了一组对象(和数组一样,但数组长度不能变,而集合能)。Java中的集合框架定义了一套规范,用来表示、操作集合,使具体操作与实现细节解耦。

其实说白了,可以把一个集合看成一个微型数据库,操作不外乎“增删改查”四种操作,我们在学习使用一个具体的集合类时,需要把这四个操作的时空复杂度弄清楚了,基本上就可以说掌握这个类了。


两大基类Collection与Map

在集合框架的类继承体系中,最顶层有两个接口:

  • Collection表示一组纯数据
  • Map表示一组key-value对

一般继承自CollectionMap的集合类,会提供两个“标准”的构造函数:

  • 没有参数的构造函数,创建一个空的集合类
  • 有一个类型与基类(CollectionMap)相同的构造函数,创建一个与给定参数具有相同元素的新集合类

因为接口中不能包含构造函数,所以上面这两个构造函数的约定并不是强制性的,但是在目前的集合框架中,所有继承自CollectionMap的子类都遵循这一约定。

设计理念

主要理念用一句话概括就是:提供一套“小而美”的API。API需要对程序员友好,增加新功能时能让程序员们快速上手。

为了保证核心接口足够小,最顶层的接口(也就是Collection与Map接口)并不会区分该集合是否可变(mutability),是否可更改(modifiability),是否可改变大小(resizability)这些细微的差别。
相反,一些操作是可选的,在实现时抛出UnsupportedOperationException即可表示集合不支持该操作。集合的实现者必须在文档中声明那些操作是不支持的。

为了保证最顶层的核心接口足够小,它们只能包含下面情况下的方法:

基本操作,像之前说的“增删改查”
There is a compelling performance reason why an important implementation
would want to override it.
此外,所有的集合类都必须能提供友好的交互操作,这包括没有继承Collection类的数组对象。因此,框架提供一套方法,让集合类与数组可以相互转化,并且可以把Map看作成集合。


Collection

澳门新浦京娱乐游戏 3java-collection-hierarchy

如上图所示,Collection类主要有三个接口:

  • Set表示不允许有重复元素的集合(A collection that contains no
    duplicate elements)
  • List表示允许有重复元素的集合(An ordered collection (also known as
    a sequence))
  • Queue JDK1.5新增,与上面两个集合类主要是的区分在于Queue主要用于存储数据,而不是处理数据。(A
    collection designed for holding elements prior to processing.)

两大基类Collection与Map

在集合框架的类继承体系中,最顶层有两个接口:

  Collection表示一组纯数据
  Map表示一组key-value对

一般继承自Collection或Map的集合类,会提供两个“标准”的构造函数:

  没有参数的构造函数,创建一个空的集合类
  有一个类型与基类(Collection或Map)相同的构造函数,创建一个与给定参数具有相同元素的新集合类

因为接口中不能包含构造函数,所以上面这两个构造函数的约定并不是强制性的,但是在目前的集合框架中,所有继承自Collection或Map的子类都遵循这一约定。


关系图

澳门新浦京娱乐游戏 4

Collection.jpg

如上图所示,Collection类主要有三个接口:

Map

澳门新浦京娱乐游戏 5

MapClassHierarchy

Map并不是一个真正意义上的集合(are
not true collections),但是这个接口提供了三种“集合视角”(collection
views ),使得可以像操作集合一样操作它们,具体如下:

  • 把map的内容看作key的集合(map’s contents to be viewed as a set of
    keys)
  • 把map的内容看作value的集合(map’s contents to be viewed as a
    collection of values)
  • 把map的内容看作key-value映射的集合(map’s contents to be viewed as a
    set of key-value mappings)

Set

表示不允许有重复元素的集合(A collection that contains no duplicate
elements)

总结

今天先开个头,后面会陆陆续续来一系列干货,Stay Tuned。

需要说明一点,今后所有源码分析都将基于Oracle JDK
1.7.0_71,请知悉。

$ java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)

List

表示允许有重复元素的集合(An ordered collection (also known as a
sequence))

Queue

JDK1.5新增,与上面两个集合类主要是的区分在于Queue
主要用于存储数据,而不是处理数据。(A collection designed for holding
elements prior to processing.)

澳门新浦京娱乐游戏 6

Map.jpg

Map并不是一个真正意义上的集合(are
not true collections),但是这个接口提供了三种“集合视角”(collection
views ),使得可以像操作集合一样操作它们,具体如下:
把map的内容看作key的集合(map’s contents to be viewed as a set of
keys)
把map的内容看作value的集合(map’s contents to be viewed as a collection
of values)
把map的内容看作key-value映射的集合(map’s contents to be viewed as a set
of key-value mappings)


集合类型主要有3种:Set(集)、List(列表)和Map(映射)。

1.Collection接口:

package com.zang.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Collection_{
    public static void main(String[] args) {

        Collection<String> list=new ArrayList<>();

        list.add("Tsthzang");
        list.add("Android");
        list.add("Iterator");

        Iterator<String> it=list.iterator();
        while(it.hasNext()) {
            String str=it.next();
            System.out.println(str);
        }

    }
}

运行结果:

  Tsthzang
  Android
  Iterator

2.List 集合:

package com.zang.list;

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

public class List_ {

public static void main(String[] args) {

    List<String> list=new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    int i=(int)(Math.random()*(list.size()-1));
    System.out.println("随机数:"+list.get(i));

    list.remove(0);
    list.set(3, "change");

    System.out.println("遍历list集合1:");
    for(int c=0;c<list.size();c++) {
        System.out.println(list.get(c));
    }

    System.out.println("遍历list集合2:");
    Iterator<String> it=list.iterator();
    while(it.hasNext()) {
        String str=it.next();
        System.out.println(str);
    }
    System.out.println("是否为空:"+list.isEmpty());
  }

}

运行结果:

随机数:c
遍历list集合1:
b
c
d
change
遍历list集合2:
b
c
d
change
是否为空:false

3.Map 集合:

(一)

package com.zang.map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Map_ {

public static void main(String[] args) {

    Map<Object,String> map=new HashMap<>();
    map.put(1,"小米");
    map.put(2,"苹果");
    map.put(3,"谷歌");

    System.out.println(map.get(1));

    //返回map中   所有key对象   形成的Set集合
    Set<Object> set=map.keySet();
    Iterator<Object> it=set.iterator();
    while(it.hasNext()) {
        System.out.println(it.next());
    }
    //返回map中   所有 值 对象   形成的Collection集合
    Collection<String> collection=map.values();
    Iterator<String> it2=collection.iterator();
    while(it2.hasNext()) {
        System.out.println(it2.next());
    }
}

}

运行结果:

小米
1
2
3
小米
苹果
谷歌

(二)

新建Type类

package com.zang.map;

public class Type {

private int id;
private String name;
public Type(int id,String name) {
    this.id=id;
    this.name=name;
}
public int getId() {
    return id;
}
public String getName() {
    return name;
  }
}

Map_Main类:

package com.zang.map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class Map_Main {

public static void main(String[] args) {

    Map<Object,String> hashMap=new HashMap<>();

    Type type1=new Type(1, "Java");
    Type type2=new Type(2, "Kotlin");
    Type type3=new Type(0, "Android");
    Type type4=new Type(3, "iOS");//需要移除的元素

    hashMap.put(type1.getId(),type1.getName());
    hashMap.put(type2.getId(),type2.getName());
    hashMap.put(type3.getId(),type3.getName());
    hashMap.put(type4.getId(),type4.getName());//需要移除的元素

    hashMap.remove(3);

    Set<Object> set=hashMap.keySet();
    Iterator<Object> iterator=set.iterator();

    while(iterator.hasNext()) {
        int id=(int)iterator.next();
        String name=hashMap.get(id);    
        System.out.println(id+" "+name);
    }

    //TreeMap接口
    Map<Object,String> treeMap=new TreeMap<>();
    treeMap.putAll(hashMap);

    //一步到位
    Iterator<Object> iterator2=treeMap.keySet().iterator();

    while(iterator2.hasNext()) {
        int id=(int)iterator2.next();
        String name=treeMap.get(id);    
        System.out.println(id+" "+name);
    }
}

}

运行结果:

0 Android
1 Java
2 Kotlin
0 Android
1 Java
2 Kotlin

常用方法:
List

add();//添加
remove();//删除
isEmpty();//返回boolean,判断集合为空否
iterator();//遍历集合
size();
get(index);//获取value
set(index,new value);//更改数据

Map

put(Key,Value);//
get(Object key);//如果存在该key,返回对应value,否则返回null
keySet();//返回所有key形成的Set集合
values();//返回所有value形成的Collection集合
containKey();//如果该集合包含括号里的key,返回ture;
containValue();//如果该集合包含括号里的value,返回ture;
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图