Java容器(List、Map、Set、Iterator)

容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在容器都会自动帮您做好。

List特点:元素有放入顺序,元素可重复

Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)

Map特点:元素按键值对存储,无放入顺序 。

一、List接口

ArrayList:线程不安全,效率高。 底层实现是数组,查询块,修改删除慢。

LinkedList: 线程不安全,效率高。 底层实现是链表,查询慢,修改删除快。

Vector:线程安全,效率低。底层实现是数组。

package Collection;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

@SuppressWarnings("all")
public class Demo01 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("dds");
        list.add(new Date());
        list.add(new Dog());
        list.add(324);//包装类的自动装箱
        System.out.println(list.size());
        System.out.println(list.isEmpty());
        list.remove("dds");
        System.out.println(list.size());
        System.out.println("---------------");

        List list2 = new ArrayList();
        list2.add("dsaf");
        list2.add("fdsf");

        list.add(list2);
        System.out.println(list.size());
        System.out.println("---------------");

        String string;
        for(int i=0;i<list.size();i++)
        {
            string=(String) list.get(i).toString();
            System.out.println(string);
        }
    }
}

class Dog{
    Dog(){
    }
}

运行结果:

4
false
3
---------------
4
---------------
Tue May 12 16:22:29 CST 2015
[email protected]
324
[dsaf, fdsf]
package Collection;

/**
 * 自己实现ArrayList
 * @author liguodong
 *
 */
public class MyArrayList {
    private Object[] elementData;
    private int size;

    public int size(){
        return size;
    }

    public MyArrayList(){
        this(10);
    }

    public MyArrayList(int initialCapacity) {
        if(initialCapacity<0)
        {
            try {
                throw new Exception();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
        elementData = new Object[initialCapacity];
    }
    //实现数组扩容和数据的拷贝
    public boolean add(Object obj)  {
        if(size>=elementData.length)//如果size大于初始的大小,进行扩容
        {
            Object[] newArray = new Object[size*2+1];
            System.arraycopy(elementData, 0, newArray, 0, elementData.length);
            elementData = newArray;
        }
        elementData[size] = obj;
        size++;
        return true;
    }

    public boolean isEmpty()    {
        return size==0;
    }

    public Object get(int index)    {
        rangeCheck(index);
        return elementData[index];
    }   

    //移除指定位置的对象
    public Object remove(int index) {
        rangeCheck(index); 

        Object oldValue = elementData[index];

        int numMoved = size - index - 1;

        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // Let gc do its work

        return oldValue;
    }

    private void rangeCheck(int index)
    {
        if(index>=size){
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

    private void fastRemove(int index) {

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // Let gc do its work
    }

    public static void main(String[] args) {
        MyArrayList list = new MyArrayList(3);
        list.add("324");
        list.add("343");
        list.add("3dsaf4");
        list.add("3432");
        list.add("3432");
        System.out.println(list.size());
        System.out.println(list.get(3));//第四个数据
        list.remove(2);//第三个数据
        System.out.println(list.size());
        System.out.println("----------");
        list.remove(new String("3432"));
        String string;
        for(int i=0;i<list.size();i++)
        {
            string=(String) list.get(i).toString();
            System.out.println(string);
        }
    }
}

运行结果:

5
3432
4
----------
324
343
3432
package Collection;

/**
 * 自己写一个双向链表
 * @author liguodong
 *
 */
public class MyLinkedList
{
    /**
     * 用来表示一个节点
     */
    private static class Node {
        Node previous;//上一个节点
        Object obj;
        Node next;//下一个节点
        public Node getPrevious() {
            return previous;
        }
        public void setPrevious(Node previous) {
            this.previous = previous;
        }
        public Object getObj() {
            return obj;
        }
        public void setObj(Object obj) {
            this.obj = obj;
        }
        public Node getNext() {
            return next;
        }
        public void setNext(Node next) {
            this.next = next;
        }
        public Node() {
            super();
        }
    }

    private Node first;
    private Node last;
    private int size;

    //新增一个元素
    public void add(Object obj)
    {
        Node node = new Node();
        if(first == null)
        {
            node.setPrevious(null);
            node.setObj(obj);
            node.setNext(null);

            first = node;
            last = node;
        }
        else {
            //直接往last后新增新的节点
            node.setPrevious(last);
            node.setObj(obj);
            node.setNext(null);

            last.setNext(node);
            last = node;
        }
        size++;
    }

    public int size()
    {
        return size;
    }

    //判断是否合法
    private void rangeCheck(int index)
    {
        if(index>=size)
        {
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }   

    public Object get(int index)
    {
        rangeCheck(index);//判断是否合法
        Node temp=iteratorNode(index);//遍历到指定节点
        if(temp != null){
            return temp.getObj();
        }
        return null;

    }

    //遍历到指定节点
    public Node iteratorNode(int index)
    {
        Node tempNode = null;
        if(first != null){
            tempNode = first; //先指到链表头,很重要。
            for(int i=0;i<index;i++)
            {
                tempNode  = tempNode.getNext();
            }
        }
        return tempNode;
    }

    //移除索引位置的对象
    public Object remove(int index)
    {
        Node tempNode =iteratorNode(index);
        if(tempNode != null)
        {
            Node up = tempNode.getPrevious();//tempNode.previous
            Node down = tempNode.getNext();//tempNode.next
            up.setNext(down);//up.next = down
            down.setPrevious(up);//down.previous = up;
        }
        size--;
        return true;
    }

    public void add(int index,Object obj)
    {
        Node tempNode = iteratorNode(index);//指定位置节点

        Node newNode = new Node();//新节点
        newNode.setObj(obj);//newNode.obj = obj;
        if(tempNode != null)
        {
            //上一个节点
            Node upNode = tempNode.getPrevious();//tempNode.previous;

            upNode.setNext(newNode);//upNode.next = newNode;
            newNode.setPrevious(upNode);//newNode.previous = upNode;

            newNode.setNext(tempNode);//newNode.next = tempNode;
            tempNode.setPrevious(newNode);//tempNode.previous = newNode;
            size++;
        }
    }

    public void set(int index,Object obj)
    {
        Node tempNode = iteratorNode(index);
        tempNode.setObj(obj);//tempNode.obj = obj;
    }

    public static void main(String[] args) {
        MyLinkedList list = new MyLinkedList();
        list.add("探险家");
        list.add("齐天大圣");
        list.add("风暴之怒");
        list.add(1,"德玛西亚皇子");
        list.set(3, "盲僧");
        System.out.println(list.get(1));
        System.out.println(list.size());
        //System.out.println(list.remove(1));
        for(int i=0;i<list.size();i++)
            System.out.println(list.get(i));
    }
}

运行结果:

德玛西亚皇子
4
探险家
德玛西亚皇子
齐天大圣
盲僧

二、Map接口

实现Map接口的类用来存储键值对(key-value)。

Map接口的实现类有HashMap和TreeMap等。

Map类中存储的键值对通过键来标识,所以键不能重复。

HashMap 效率高 线程不安全

Hashtable 效率低 线程安全

两则的用法都是一样的

package Collection;

import java.util.HashMap;
import java.util.Map;

@SuppressWarnings("all")
public class Demo02 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("习大大", new Wife("彭麻麻"));
        map.put("灰太狼", new Wife("红太狼"));
        map.put("猪八戒", "嫦娥");

        Wife wife = (Wife) map.get("灰太狼");
        map.remove("灰太狼");//从容器中移除
        System.out.println(wife.name);

        System.out.println(map.containsKey("习大大"));
        System.out.println(map.containsValue("彭麻麻"));
        System.out.println(map.containsValue("嫦娥"));
    }
}

class Wife{
    String name;
    public Wife(String name){
        this.name = name;
    }
}

运行结果:

红太狼
true
false
true
package Collection;

public class MyMap{
    //Map  HashMap Hashtable
    MyEntry[] arr = new MyEntry[990];
    int size;   

    public void put(Object key,Object value){
        MyEntry entry = new MyEntry(key,value);

        for(int i=0; i<size; i++){
            //解决键值重复的处理
            if(arr[i].key.equals(key)){
                arr[i].value = value;
                return;
            }
        }
        arr[size++] = entry;
    }

    public Object get(Object key){
        for(int i=0; i<size; i++){
            if(arr[i].key.equals(key))
            {
                return arr[i].value;
            }
        }
        return null;
    }

    public MyEntry remove(Object key){
        for(int i=0; i<size; i++){
            if(arr[i].key.equals(key))
            {
                MyEntry oldValue = arr[i];
                int numMoved = size - i - 1;

                if (numMoved > 0)
                    System.arraycopy(arr, i+1, arr, i,numMoved);
                arr[--size] = null; // Let gc do its work
                return oldValue;
            }
        }
        return null;
    }

    public boolean containsKey(Object key)  {
        for(int i=0;i<size;i++)
        {
            if(arr[i].key.equals(key))
                return true;
        }
        return false;
    }

    public boolean containsValue(Object value)
    {
        for(int i=0;i<size;i++)
        {
            if(arr[i].value.equals(value))
                return true;
        }
            return false;
    }
    public int Size(){
        return size;
    }
    public static void main(String[] args) {
        MyMap map = new MyMap();
        map.put("习大大", new Wife("彭麻麻"));
        map.put("灰太狼", new Wife("红太狼"));
        map.put("猪八戒", "嫦娥");
        MyEntry entry = map.remove("猪八戒");
        System.out.println(map.Size());
        System.out.println(entry.key+" "+entry.value);
    }
}

//键值对
class MyEntry{
    Object key;
    Object value;
    public MyEntry(Object key, Object value) {
        super();
        this.key = key;
        this.value = value;
    }
}

存在问题:效率较低

Map的底层实现是数组+链表

package Collection;

import java.util.LinkedList;

/**
 *  升级版
 *  提高查询效率
 */
@SuppressWarnings("all")
public class MyMapNext{
    LinkedList[] arr = new LinkedList[999];//Map的底层实现是数组+链表
    int size;

    public void put(Object key,Object value)
    {
        MyEntry e = new MyEntry(key, value);//键值对
        int a = key.hashCode()%arr.length;

        if(arr[a] == null){
            LinkedList list = new LinkedList();
            //将链表放进数组里面
            arr[a] = list;
            list.add(e);
            size++;
        }
        else{
            LinkedList list = arr[a];

            for(int i=0;i<list.size();i++)
            {
                MyEntry entry = (MyEntry) list.get(i);
                if(entry.key.equals(key))
                {
                    entry.value = value;//键值重复直接覆盖
                }
            }
            arr[a].add(e);
        }   

    }
    public Object get(Object key)
    {
        int a = key.hashCode()%arr.length;

        if(arr[a] != null)
        {
            LinkedList list = arr[a];
            for(int i=0;i<list.size();i++)
            {
                MyEntry entry = (MyEntry) list.get(i);
                if(entry.key.equals(key))
                {
                    return entry.value;
                }
            }
        }
        else{
            size--;
        }

        return null;
    }
    public int Size(){
        return size;
    }
    public static void main(String[] args) {
        MyMapNext map = new MyMapNext();
        map.put("习大大", new Wife("彭麻麻"));
        map.put("灰太狼", new Wife("红太狼"));
        map.put("猪八戒", "嫦娥");
        System.out.println(map.Size());
        Wife wife = (Wife)map.get("灰太狼");
        System.out.println(wife.name);
    }
}

运行结果:

3

红太狼

Collection类对象在调用remove、contains等方法时,需要比较对象是否祖等。这会涉及到对象类型的equals方法和hashCode方法;对于自定义类型,需要重写equals方法和hashCode方法以实现自定义的对象相等规则。

Java中规定,两个内容相同的对象应该具有相等的hashcode。即equals相等,则hashcode相等;hashcode相等,则equals不一定相等。

Object里面hashCode和equals的native与操作系统有关的解决方法。

String类有对它们重写。

hashCode和equals 可以通过eclipse自动生成。

重写equals方法和hashCode方法

package Collection;

public class Student {
    //Object String Integer Date
    private int id;

    @Override
    public int hashCode() {
        final int prime = 31;//一般是质数
        int result = 1;
        result = prime * result + id;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (id != other.id)
            return false;
        return true;
    }
}
package Collection;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SuppressWarnings("all")
public class EqualsTest {
    public static void main(String[] args) {
        List list = new ArrayList();
        String s1 = new String("lgd");
        String s2 = new String("lgd");
        list.add(s1);
        list.add(s2);
        System.out.println(list.size());

        Map map = new HashMap();
        //key不能重复,通过equals判断,如果重复,对其value进行覆盖。
        map.put(s1, "NB");
        map.put(s1,"SB");
        System.out.println(map.get("lgd"));//判断是否相等,同样依赖于equals。
    }
}

运行结果:

2

SB

查询优化:遍历的时候可以先看要遍历的数的大小与size/2做比较 如果大于size/2遍历后面。否则,遍历前面。JDK源码如下:

/**
     * Returns the (non-null) Node at the specified element index.
     */
    Node<E> node(int index) {
        // assert isElementIndex(index);

        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

hashCode()算完之后有可能是负数,所以一般做完了应该

int a = key.hashCode()%arr.length;

hash = hash<0?-hash:hash;

三、Set接口

Set接口是Collection接口的子接口,Set接口没有提供额外的方法,Set接口的特性是容器类中的元素是没有顺序的,而且不可以重复

Set容器可以与数学中”集合”的概念相对应。

J2SDK API中所提供的Set容器类有HashSet,TreeSet等。

HashSet的底层是HashMap实现的。

package Collection;

import java.util.HashSet;
import java.util.Set;

@SuppressWarnings("all")
public class Demo03 {
    public static void main(String[] args) {
        Set set = new HashSet();
        set.add("aaa");
        set.add("bbb");
        set.add(new String("aaa"));
        System.out.println(set.size());
        for (Object object : set) {
            System.out.println(object);
        }
        System.out.println(set.contains("bbb"));
    }
}

运行结果:

2

aaa

bbb

true

package Collection;

import java.util.HashMap;
import java.util.Map;

@SuppressWarnings("all")
public class MyHashSet {
    HashMap hashMap;
    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    public MyHashSet() {
        hashMap = new HashMap();
    }

    public Boolean add(Object o){
        return hashMap.put(o, PRESENT)==null;//set的不可重复就是利用了map里面键对象的不可重复!
    }

    public boolean remove(Object o) {
        return hashMap.remove(o)==PRESENT;
    }

    public void clear() {
        hashMap.clear();
    }
    public int size() {
        return hashMap.size();
    }
    public static void main(String[] args) {
        MyHashSet myHashSet = new MyHashSet();
        myHashSet.add("大宝");
        myHashSet.add("吃饭");
        myHashSet.add("傻瓜");
        System.out.println(myHashSet.size());
        myHashSet.clear();
        System.out.println(myHashSet.size());
    }
}

运行结果:

3

0

四、容器存储数据综合实例

一个列对应一个属性,一个对象对应一行记录,一个类对应一个表结构。

1、List实现表结构

package Collection;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

//JavaBean实体类
public class Hero {
    private int id;
    private String name;
    private int price;
    private String tag;
    private Date ontime;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getSalary() {
        return price;
    }
    public void setSalary(int price) {
        this.price = price;
    }
    public String getDepartment() {
        return tag;
    }
    public void setDepartment(String tag) {
        this.tag = tag;
    }
    public Date getHiretime() {
        return ontime;
    }
    public void setHiretime(Date ontime) {
        this.ontime = ontime;
    }
    public Hero(int id, String name, int price, String tag,
            String ontime) {
        super();
        this.id = id;
        this.name = name;
        this.price = price;
        this.tag = tag;

        DateFormat format = new SimpleDateFormat("yyyy-MM");
        try {
            this.ontime=format.parse(ontime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    public Hero() {
        super();
    }
}
package Collection;

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

@SuppressWarnings("all")
public class Demo04 {
    public static void main(String[] args) {
        Hero hero1 = new Hero(1001,"九尾狐",3150,"请宠爱我吧","2012-10");
        Hero hero2 = new Hero(1002,"探险家",4800,"是时候表演真正的技术了","2013-5");
        Hero hero3 = new Hero(1003,"蛮王",1350,"我的大刀早已饥渴难耐","2014-8");
        List list = new ArrayList();
        list.add(hero1);
        list.add(hero2);
        list.add(hero3);
        printHeroName(list);
    }
    public static void printHeroName(List<Hero> list){
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getName());
        }
    }
}

运行结果:

九尾狐

探险家

蛮王

2、Map-List实现表结构

package Collection;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SuppressWarnings("all")
public class MapList {
    public static void main(String[] args) {
        Map map1 = new HashMap();
        map1.put("id", 1001);
        map1.put("name", "刀妹");
        map1.put("salary", 3050);
        map1.put("department", "项目部");
        map1.put("hireDate", "2007-10");

        Map map2= new HashMap();
        map2.put("id", 1002);
        map2.put("name", "战争女神");
        map2.put("salary", 3050);
        map2.put("department", "教学部");
        map2.put("hireDate", "2006-10");

        Map map3 = new HashMap();
        map3.put("id", 1003);
        map3.put("name", "苍井空");
        map3.put("salary", 3050);
        map3.put("department", "外交部");
        map3.put("hireDate", "2009-10");

        List<Map> list = new ArrayList<Map>();
        list.add(map1);
        list.add(map2);
        list.add(map3);
        printName(list);
    }

    public static void printName(List<Map> list){
        for(int i=0; i<list.size(); i++)
        {
            System.out.println(list.get(i).get("name") + "--" + list.get(i).get("salary"));
        }
    }
}

运行结果:

刀妹–3050

战争女神–3050

苍井空–3050

五、Iterator接口

所有实现了Collection接口的容器类都有一个iterator方法用以返回一

个实现了Iterator接口的对象。

Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。

Iterator接口定义了如下方法:

Boolean hasNext() //判断是否有元素没有被遍历

Object next() //返回游标当前位置的元素并将游标移动到下一个位置

void remove() //删除游标左边的元素。在执行完next之后,该操作只能执行一次

List/Set遍历

package Collection;

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

@SuppressWarnings("all")
public class Demo05 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("spack");
        list.add("storm");
        list.add("mahout");
        //通过索引遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
        System.out.println();

        //通过迭代器遍历
        Iterator iterator01 = list.iterator();
        while(iterator01.hasNext()){
            String string = (String) iterator01.next();
            System.out.print(string+" ");
        }
        System.out.println();

        Set set = new HashSet();
        set.add("嫦娥1号");
        set.add("嫦娥2号");
        set.add("嫦娥3号");
        for (Object object : set) {
            System.out.print(object + " ");
        }

        System.out.println();
        Iterator iterator02 = set.iterator();
        while(iterator02.hasNext()) {
            String string = (String) iterator02.next();
            System.out.print(string+" ");
        }
        System.out.println();

        for (Iterator iterator03 = set.iterator(); iterator03.hasNext();) {
            Object object = (Object) iterator03.next();
            System.out.print(object+" ");
        }
        System.out.println();
    }

}

运行结果:

spack storm mahout

spack storm mahout

嫦娥2号 嫦娥1号 嫦娥3号

嫦娥2号 嫦娥1号 嫦娥3号

嫦娥2号 嫦娥1号 嫦娥3号

Map遍历两种方式

package Collection;

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

@SuppressWarnings("all")
public class Demo06 {
    public static void main(String[] args) {
        Map map =  new HashMap();
        map.put("赵信", "枪出如龙");
        map.put("蛮王", "我的大刀早已饥渴难耐");
        //方式一
        Set keys = map.keySet();
        for (Object key : keys) {
            System.out.println(key+"-->"+map.get(key));
        }

        for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
            String keyString = (String) iterator.next();
            System.out.println(keyString+"-->"+map.get(keyString));
        }

        //方式二
        //注意这个Entry是java.util.Map.Entry,导包不要出现错误。
        Set entrySet = map.entrySet();
        for (Iterator iterator = entrySet.iterator(); iterator.hasNext();) {
            Entry entry = (Entry) iterator.next();
            String key = (String)entry.getKey();
            String value = (String)entry.getValue();
            System.out.println(key + "----->" + value);
        }

        Iterator entryIte = entrySet.iterator();
        while (entryIte.hasNext()) {
            // 通过迭代返回的是一个entry
            Entry entry = (Entry) entryIte.next();
            String key = (String) entry.getKey();
            String value = (String) entry.getValue();
            System.out.println(key + "----->" + value);
        }

    }
}

运行结果:

蛮王-->我的大刀早已饥渴难耐
赵信-->枪出如龙
蛮王-->我的大刀早已饥渴难耐
赵信-->枪出如龙
蛮王----->我的大刀早已饥渴难耐
赵信----->枪出如龙
蛮王----->我的大刀早已饥渴难耐
赵信----->枪出如龙
时间: 2024-10-10 20:44:35

Java容器(List、Map、Set、Iterator)的相关文章

【Java心得总结七】Java容器下——Map

我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角度对Java中强大的容器类库做了一个简单总结而第二篇专门针对容器类库中的Collection部分进行了总结.这篇博文将对容器类库中的Map部分进行一个整理总结. 一.初识Map Map:一组成对的“键值对”对象,允许你使用键来查找值.(注:Map其实是将键与值形成的二元组按照一维线性的方式组织起来,

java容器中遍历循环Iterator 和 Foreach 循环

最近遇到这样一个问题,要删除一个集合中的某个元素,该怎么解决? 我自己写了两段代码来删除,都报了一个错java.util.ConcurrentModificationException:为了让更多可能没注意到这个点的程序猿注意一下,我在这里分享下~ 先看代码 1 package com.zwt1234; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 import java.util.Set; 6 7 public cla

Java——容器(Map)

[Map接口] 注:<1>HashMap底层实现是哈希表,TreeMap底层实现是二叉树. <2>键是索引,不能重复--表示不能equals,直接比较hashCode即可. (hashCode是int类型,比较起来效率高,直接equals效率慢) [常见方法] 注:在put方法中,新增加的value替换原来的数值,原来的数值作为对象返回,如果需要就用不需要就不用. [程序分析]

【Java心得总结五】Java容器上——容器初探

在数学中我们有集合的概念,所谓的一个集合,就是将数个对象归类而分成为一个或数个形态各异的大小整体. 一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集.构成集合的事物或对象称作元素或是成员.集合具有:无序性.互异性.确定性. 而在我们计算机科学种集合的定义是:集合是一组可变数量的数据项(也可能是0个)的组合,这些数据项可能共享某些特征,需要以某种操作方式一起进行操作.一般来讲,这些数据项的类型是相同的,或基类相同(若使用的语言支持继承).列表(或数组)通常不被认为是集合,因为其大小

【Java心得总结五】Java容器中——Collection

在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器做一个着重的探索与总结. Collection:一个独立元素的序列,这些元素都服从一条或多条规则.(注:Collection其实就是将一组数据对象按照一维线性的方式组织起来)List必须按照插入的顺序保存元素,而set不能有重复元素.Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序

java 容器Collection List Set Map概述

对JAVA的集合的理解是想对于数组 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法. Set 和

Java容器学习:List、Set、Queue、Map

一.容器 很多时候,程序总是根据运行时才知道的某些条件去创建新对象,在此之前不知道所需对象的数量,甚至对象的类型,这时就需要容器来保存对象.Java容器类可以自动地调整自己的尺寸.容器类类库可以划分为两个不同的概念: Collection.一个独立元素的序列,如List(按照插入顺序保存元素),Set(不能有重复元素),Queue(按排队规则确定对象产生的顺序): Map.一组成对的"键值对"对象,允许用键来查找值.Map维护了一张映射表,也叫"关联数组"或&quo

JAVA的容器---List,Map,Set的区别

Set 数据是不区分顺序的List 是分先后顺序的ArrayList 是 List的一个实现. arrayList 读快改慢,linkedList 是读慢改快 . 这跟它们的存储有关. ArrayList 顺序开辟空间一个挨着一个.LinkedList是存储人以位置,然后用指针关联 JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├Hash

JAVA的容器---List,Map,Set (转)

JAVA的容器---List,Map,Set Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap Collection是最基本的集合接口,一个Collection代表一组Object,Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List Set,区别在于List是有序的Collecti

java容器的两大类Collection和Map

java容器包括Collection和Map两种,Collection储存着对象的集合,而Map储存着键值对(两个对象)的映射表. Collection: 1)Set ·TreeSet ·HashSet ·LinkedHashSet 2)List ·ArrayList(基于动态数组实现,线程不安全) ·Vector (线程安全的,同步的,开销必ArrayList大,访问速度更忙.Vector 每次扩容请求其大小的 2 倍空间,而 ArrayList 是 1.5 倍) ·LinkedList(基于