java list map set的区别_JAVA集中中 List Set Map 区别和关系

1List:List元素的特点!

List集合的遍历方式: while-迭代器遍历 for-迭代器遍历 foreach-迭代遍历 for-get遍历(只有List才可以,set,map都不可以)

有序可重复,因为底层的实现数组和链表,都是有下标来表示唯一性的,存进去什么顺序,取出来还是什么顺序。

ArrayList : 底层是一个索引数组,有顺序的,靠索引数组的下标

LinkedList: 底层是一个链表式的先后维持顺序。

深入List集合

ArrayList():底层是索引数组,索引下标        ArrayList集合底层默认初始化的容量是 10,扩大后容量是原始容量的1.5倍        Vector集合底层默认也是10,扩大后容量是原来的两倍        ArrayListshi Vector 的升级,不要再用Vector        针对数组的代码优化:尽量不要扩容操作,建立集合的时候,就初始化指定容量         List集合即可以有(迭代器-while循环,for-迭代器循环,for-get循环(只有list可以))

下面是个List例子供大家参考:

import java.util.*;

public class List01{

public static void main(String[] args){

List li = new ArrayList();

li.add(100);

li.add(10);

li.add(110);

li.add(100);

for (Iterator it = li.iterator(); it.hasNext(); ){

System.out.println( it.next() );

}

}

}

2 ,Set:无顺序不可重复:底层是一个索引数组。HashMap键的部分     HashSet:HashTable

SortedSet:红黑树 无序不可重复,但是存进去的元素可以按照元素大小自动排序

SortedSet集合存储元素为什么可以自动排序        因为被存储的元素实现了Comparable接口;

SUN编写的的TreeSet集合在添加元素的时候,会自动调用CompareTo方法完成比

Set集合:HashSet     1 HashSet 是HashMap的一个实现,本质就是一个HashMap,而HashMap的数据结构是一个Hash表

2 哈希表(Hash表):又叫散列表,其底层是用Hash函数组合起来的一个:数组和单向链表;每个单向链表表都有一个独一无二的hash值,这个值同时也是数组的下标,每个单项列表节点的hash值是相等的;     hash值本质是把key的值调用hashCode()方法        3 向hash表中添加元素的过程            1) 先调用被存储的key,调用hashCode方法,这个算出hash值,即数组的下标,然偶调用equals()方法,和数组的所有下标进行比对,如果没有,就在新的桶位(就是下标位)创建链表               (如果不存在,则作为一个新的下标,添加一个数组元素,这个元素作为这个新的链表的头元素存在)            如果有,则继续调用equals()方法,把键和值和链表中的值进行比较,如果返回为true那么,就代表该链表中已经有了这个key值,放弃添加,如果没有,则返回false,然后连值一起放到当前的hash值链表中

4 HashSet本质是hashMap的key部分,两者完全一样

5 HashSet和HashMap初始化容量都是16,默认加载因子是0.75

下面是例子:

import java.util.*;

public class Collection_08_Set_01{

public static void main(String[] args){

Set s = new HashSet();

s.add(1);//自动装箱:基本数据类型自动转型为相对应引用数据类型                 //自动拆箱:是指有对应的基本数据类型的对象,自动转型为其基本类型

s.add(1);

s.add(3);

s.add(4);

Iterator it = s.iterator();

while (it.hasNext()){//hasNext()的返回值是boolean (布尔值)

System.out.println( it.next() );

}

for (Iterator its = s.iterator(); its.hasNext(); ) {

System.out.println( its.next() );

}

}

}

3 Map:map无顺序可重复

hash(哈希):根据对象的特性为对象生成一个唯一标示符的方法

Oject中hashCode()是哈希的一个应用,拿对象的内存地址经过运算来作为对象的唯一标示符

HashMap:最底层还是个数组+单向链表:我们把下标是字符串的数组叫关联数组

数组的下标是一个字符串

Map集合和Collection不一样,但是操作是一样的,只是操作的方法有细微的差别  增       Object put(Object key, Object value);       向集合中添加键值对  删         void clear(); 清空map  改       数据类型转换  查       int size(); //获取Map中键值对的个数       boolean isEmpty();//判断是否为空       Object get(Object key);//通过key获取对应对象的值       Collection values();//获取map集合中所有value对象的集合       boolean:containsKey(Object key);//判断集合中是否有这样的key键       boolean containsValue(Object value)//判断集合中是否有这样的值       Set keySet();//获取集合中所有的key,以集合方式返回       Set entrySet;//返回此映射中包含的映射关系,Set集合方式返回

遍历       HashMap默认初始值16,默认加载因子是0.75

下面是例子:

import java.util.*;

public class Collection_06_Map_01{

public static void main(String[] args){

//1 创建一个HashMap的集合

Map ps = new HashMap();

//2 往里面添加元素

ps.put("1000","jack");

ps.put("1011","jobs");

ps.put("1002","cook");

ps.put(1003,"rose");//这里会调用Integer的hashCode()方法:1003.hashCode().hashCode(1003),return-->1003

ps.put("1000","sun");

//查询里面的元素

System.out.println( ps.size() );//这里的返回值4 是指的是谁,有4个一一映射关系,一个一一映射关系在内存中就是一个链表节点

System.out.println( ps.containsKey("1004") );//查就是数组的下标,containsKey先是去调用对象的hashCode()生成hash码,然后在调用对象自身的equals(),去数组下标中比较,然后在调用equals(),去链表中比对键的原值

System.out.println( ps.containsValue("sun") );//1 "1000""sun",一一映射,"sun"找到"1000"         //2 把"1000".hashCode().equals()去数组中比较下标(又叫桶位),找到这个桶位,然后         //3 "1000".equals()去链表中挨个比较         //4 "sun".equals()去比较他们的值//不需要比较         //有一句话:我们hash函数的目的,不是为了唯一性,不是为了产生唯一的hash码,不同对象可以产生相同的hash码,因为hash相同不相同对我们的这个一一映射关系没有影响,对关系关系中的两个值也没有有影响.当我们去查询值的时候,我们equals了三次,以是hash码,第二次是key的原生值,第三步比较的是value的原生值         //所以:一个隐身关系,键相等,值相等,那他们是不是就想等                 System.out.println( ps.get("1011") );

//改

//遍历:通过key遍历集合,同时获得元素的键和值

System.out.println( "---------" );

Collection values = ps.values();

Iterator it = values.iterator();

while (it.hasNext()){

System.out.println( it.next() );

}

System.out.println( "---------" );

//删

System.out.println( ps.remove("1002") );         //数据类型转换         //将Map转换成Set集合

Set es = ps.entrySet();

Iterator it3 = es.iterator();

while (it3.hasNext()){

System.out.println( it3.next() );

}

}

}

总结 :list 和set 有共同的父类 它们的用法也是一样的 唯一的不太就是set中不能有相同的元素 list中可以

list和set的用途非常广泛 list可以完全代替数组来使用

map 是独立的合集 它使用键值对的方式来储存数据 键不能有重复的 值可以用

map不像上边两种集合那个用的广泛 不过在servlet 和jsp中 map可是绝对的重中之重 页面之间传值全靠map

下面是接口对应的各种关系

5c15aa1cc7838097ac1b1cc3c0344847.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值