JAVA集合

来源:互联网 发布:海南网络广播电视台 编辑:程序博客网 时间:2024/05/29 16:24
集合框架主要用来解决长度,类型可变问题,还可以根据key来获取内容。

主要分为两块: Collection,map

Collection 可以存放一组无序,可重复的数据,是一个接口

Collection 下面有2个子接口:List 和Set;

List存放一组有序,可重复的数据

Set 存放一组无序,唯一的数据

List集合有2个实现类 ArrayList和 LinkedList

ArrayList: 底层封装以数组实现,分配的是一块连续的内存空间,读取数据效率高,增删操作偏低

LinkedList: 底层以分装链表实现,分配的是不连续的内存空间,读取数据效率低,
                    增删操作效率高,相对于ArrayList ,多了首位元素的操作

Iterator 迭代器。在Collection接口下所有的对象,可以用Iterator 迭代器。

Iterator<String> ite= list.iterator();
while(ite.hasNext()){
   String str= ite.Next();
syso(str);

ArrayList 另外2种迭代:
 for(int i=0;i<list.size();i++){
syso(list.get(i));

for(String str:list){
syso(str);

list.contains(a); 判断集合中是否包含元素a;
list.indexOf(a);从前往后获取元素a下标


Set 
HashSet的原理: 
存放:1.调用hashCode()方法,获取哈希码值,判断是否存在这个之
           2.如果存在,调用equals()方法(其实在这之前会先用==判断,相等就返回false),
              判断两个对象是否相等,如果相等,添加失败,如果不等,把对象加入HashSet对象中。
            3.如果第一步的哈希码值不存在,直接把对象加入HashSet里面
获取:1,先调用hashCode()方法,获取哈希码值,根据哈希值调用hash()方法,获取存储索引,
            然后根据索引找到对应的数据;


HashSet可以存放多个对象,但是不能存放相同的对象。
这里我们也可以人为改变判定对象相同的条件,如果希望按照我们的方式来判定对象是否相同,
需要重写hashCode()方法和equals()方法。


Map                                
通过键值(key-value)对的形式来存储数据。
map.put(a,b);将a和b存入带map里面
map.get(a);得到key值a 对应的value
map.containsKey(a);集合中是否包含key
map.containsValue(a);集合中是否包含value
Set set=map.keySet();得到map集合中所有的key的集合
Iterator ite= set.iterator();
while(ite.hasNext()){
    Object obj=iter.next();//迭代集合set中的key,得到key
    Object ob=map.get(obj);//通过key得到value}

map里面的key可以是任意类型,建议使用String ,value 也可以是任意类型
map里面的key可以重复,当key重复是,后存入的数据会覆盖前面的数据,value可以重复
map里面key可以为null,但是只能有一个,多个时候,后面会覆盖前面的,value可以多个为null
map中的key在底层可以理解为一个set集合

HashMap的原理
存储:1,判断key是否为空,如果为空,把指定的value存到首位
            2.如果key不为空,先根据key的hashCode来计算得到hash值
            3.在根据hash值来获取数组的下标,如果该下标对应的位置已经有数据了,替换该数据

读取:1,根据key 的hashCode值,调用hash(),得到一个hash值
            2,再根据hash值获取数组下标(通过indexof()方法),再根据数组下标从数组中获取元素

map 3种迭代
1.取出所有的key,然后分别根据key来获取每一个value
Set<String> set = map.keySet();
Iterator<String> iter =set.iterator();
while(iter.hasNext()){
       String key=iter.next();
        String value=map.get(key);
syso(key+value);

2.第二种方式:通过values()方法,直接得到所有的value
Collection<String> list= map.values();
    Iterator<String> iter=list.iterator();
while(iter.hasNext()){
    String value=iter.next();
syso(value);

3.通过一个内部类Entry来获取所有的key和value

Set<Entry<String ,String>> set=map.entrySet();
Iterator<Entry<String,String> ite=set.iterator();
while(iter.hasNext()){
    Entry<String,String> entry=iter.next();
    String key=entry.getKey();
    String value= entry.getValue();
syso(key+value);

0 0