A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵茹艳 中级黑马   /  2012-5-12 23:59  /  2464 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵茹艳 于 2012-5-15 15:49 编辑

求教List和Map都有哪些区别啊?详细点,包括他们的子类,读写!

6 个回复

倒序浏览
多谢,小激动!
回复 使用道具 举报
接口List 有序(存放顺序输出) 可重复 排序通过Collections.sort()和元素实现Comparator类来实


常用实现类 ArrayList Vector LinkedList
ArrayList Vector区别
相同点  都是用数组实现的所以可以根据角标操作元素 可以用ListIterator遍历元素时操作元素
当集合过大时容易引起堆内存溢出错误 查询修改块  添加删除慢集合越大越明显
不同点: Vector是线程安全的属于重量级 ArrayList线程不安全属于轻量级 但这会牺牲性能 如果
需要同步的快可以用集合工具帮集合真加同步功能
SequenceInputStream 中会用到Vector集合  但是也不是非用不可 其他情况直接ArrayList

LinkedList的低层实现是双向循环链表,所以增删操作速度很快,适合用来实现堆栈和队列数据结构

接口Map 特点 键值对. KEY唯一 无序 不重复 可以1对1 1对多  多对1
常用实现类:HashMap TreeMap   查找慢
HashMap取代了Hashtable  Hashtable是线程安全的HashMap线程不安全的 底层哈希表数据结构它们实

现不重复是靠元素覆盖hashCode()和equals()方法 只有加进来的hashCode相同时才会调用equals比较

相同的元素是否相同  无法排序只能直接实现排序功能
TreeMap 底层二叉树数据结构 元素要实现Comparable接口覆盖compareTo方法 不然只添加的进一个元

素 添加时会排序根据元素覆盖的comparable 也可以构造时指定如排序器Comparator 取出时从小到大

它们没有迭代器可以用keySet entrySet得到Set集合在通过高级FOR循环或迭代取出元素 如果是

keySet  遍历得到key通过 map.get(key) 得到value  如果是entrySet   遍历得到Map.Entry 通过

Map.Entry的getKey()和getValue获取key和value
回复 使用道具 举报
List:元素是有序的,元素可重复,
Map集合存储键值对,一对一对存储,保证键的唯一性
ArrayList:
需求。将自定义对象作为元素存入ArrayList集合中,并除去重复元素

存人对象,同姓名同年龄,视为重复元素

思路
1对人描述
2定义容器,,将人存入
3取出

class Person
{
        private String name;
        private int age;
        person(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public String getName()
        {
                return this.name=name;
        }
        public int age()
        {
                return this.age= age;
        }
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Person))
                        return false;
                Person p=(Person)obj;
                return this.name.equals(p.name)&&this.age=p.age;
        }
}

class ArrayListTest2
{
        public static void main (String []args)
        {
                ArrayList al=new ArrayList();
                al.add(new person("lisi,30"));
                al.add(new person("lisi1,30"));
                al.add(new person("lisi1,32"));
                al.add(new person("lisi2,33"));
                al.add(new person("lisi2,32"));
       
                al=singleElement(al);//通过调用去除重复元素的方法,编译运行发现重复元素并未消失
                //原因,ArrayList并不知道自定义判断的条件,只判断对象是否相同
                //equals(),他使用对象的equals方法和另外的对象进行比较
                //因此该容器比较使用的是Person类中的equals方法,但person类中的equals是继承object类中的equals
                //方法,其比较的是地址值,因为都是new的对象,所以地址值不同,因此要在person类中对equals进行覆                //写

                Iterator it=new Iterator();
                while(it.hasNext())
                {
                        //Object obj=it.next();由于add方法添加的是Object,但是Object中没有get方法,所以转型
                        //Person p =(Person)obj;
                        Person p= (Person)it.next();
                        sop(p.getName()+"...."+p.getAge);                }
                       
        }
        public static ArrayList singelElement(ArrayList al)
        {
                //定义一个零时容器
                //遍历老容器
                //判断容器中是否有该元素
                ArrayList newAl=new ArratList();
                Iterator it=new Iterator();
                while(it.hasNext())
                {
                        Object obj=it.next();
                        if(!newAl.contains(obj))
                        {
                                newAl.add(obj);
                        }
                }
                return newAL;
        }
}

Map集合

基本特点
该集合存储键值对,一对一对存储,保证键的唯一性

1添加
        put(K key, V value)
2删除
        clear();\
        remove(Object key)
3判断
        contanisValue(Object value)
        contanisKey(Object key)
4获取
        get (Object key)
        size()
        values()
        entryset()
        keySet()

Map
-----Hashtable:底层是哈希表数据结构,不可以存入null为键值的情况,线程同步
-----HashMap:底层是哈希表数据结构,允许空键空值,线程不同步
-----TreeMap:底层是二叉树结构,线程不同步,可以给Map集合中的键排序

import java.util.*;
class MapDemo
{
        public static void main(String []aggs)
        {
                Map <String,String> map=new HashMap<String,String>();
                map.put("01","java1");
                import java.util.*;
class MapDemo
{
        public static void main(String []aggs)
        {
                Map <String><String> map=new HashMap<String><String>();
                map.put("01","java1");//添加元素时,相同的键后添加值会覆盖原值
                map.put("04","java2");
                map.put("02","java3");
                map.put("03","java4");
                System.out.println("包含02吗"+map.containsKey("02"));
                System.out.println("获取03"+map.get("03"));
                System.out.println("删除02"+map.remove("02"));
                System.out.println("Map"+map);
                Collection <String> coll =map.values();
                System.out.println("获取map集合中的值"+coll);
        }
}

map集合中的两种取出方式
1KeySet:将map中所有的键存入set集合中,使用其迭代方式,在通过get方法获取每一个键对应的值

2entrySet:Set<Map.Entey<k,v>> enteySet:将集合中的映射关系存入Set,

import java.util.*;
class MapDemo1
{
        public static void main(String [] args)
        {
                Map<String,String> map=new HashMap()<String,String>;
                map.put("01","java1");
                map.put("02","java5");
                map.put("03","java2");
                map.put("04","java3");

                Set <String> keySet= map.keySet();//获取map集合中所有键的set集合keySet();
                Iterator<String> it=keySet.iterator();//使用set集合中的迭代器
                while(it.hasNext())
                {
                        String key=it.next();
                        String value=map.get(key);//通过get方法获取值
                        System.out.println(key+value);
                }
                //将集合中的映射关系取出
                Set <Map.Entry<String,String>> enteySet=map.entrySet();
                Iterator<Map.Entry<String,String>> it=entrySet.iterator();
                while(it.hasNext)
                {
                        Map.Entry<String,String> me=it.next();
                        String key=me.get(key);
                        String value=me.get(value);
                }
               
        }       

}
回复 使用道具 举报
多谢各位了!
回复 使用道具 举报
简单说:
          List动态集合的接口,好处是可以动态添加元素。很方便的通过Itractor迭代器来遍历集合元素。
          Map是键值对形式的集合,好处是可以通过相应键找到相应的值,就好比一把钥匙开一把相应的锁。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马