集合

作者: 于无声处写写写 | 来源:发表于2018-07-18 10:33 被阅读9次

Java集合框架

将集合的接口与实现分离

队列通常有两种实现形式:循环数组和链表

迭代器

Iterator接口的remove方法将会删除上次调用next方法时返回的元素。

  • Set类型是无序的
  • list.set()方法用一个新元素取代调用next或previous方法返回的上一个元素 例如
ListIterator<String> iter=list.listIterator();
String oldValue=iter.next();// returns first element
iter.set(newValue);//set first element to newValue
  • 如果迭代器 发现他得集合被另一个迭代器修改了,或是被该集合自身的方法修改了,就会抛出一个ConcurrentModificationException异常。
List<String> list=...;
ListIterator<String> iter1=list.listIterator();
ListIterator<String> iter2=list.listIterator();
iter1.next();
iter1.remove();
iter2.next();//throws ConcurrentModificationExcepiton
  • 为了避免发生并发修改的异常,应该遵循下述原则:可以根据需要给容器附加许多的迭代器,但是这些迭代器智能读取列表。另外,再单独附加一个既能读又能写的迭代器。

  • LinkedList类还提供了一个用来访问某个特定元素的get方法

LinkedList<String> list=...;
String obj=list.get(n);

当然这个方法的效率并不太高,如果用这个方法说明可能用了错误的数据结构

  • 下面这段代码效率极低
for(int i=0;i<list.size();i++)
{
    do something with list.get(i);
}
//每次查找元素都要从列表的头部重新开始搜索,LinkedList对象根本不做任何缓存位置信息的操作
  • 由于java迭代器指向两个元素之间的位置,所以可以同时产生两个索引;

  • 代码测试上述方法
package listlearn;/*
 *@author havel 2018/7/16 15:11
 */

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

public class LinkedListTest {
    public static void main(String[] args){
        List<String> lista = new LinkedList<>();
        lista.add("A");
        lista.add("B");
        lista.add("C");
        List<String> listb = new LinkedList<>();
        listb.add("D");
        listb.add("E");
        listb.add("F");
        //把b合并到a
        ListIterator<String> aIter=lista.listIterator();
        Iterator<String> bIter=listb.iterator();
        while (bIter.hasNext()) {
            if (aIter.hasNext()) {
                aIter.next();
            }
            aIter.add(bIter.next());
        }
        System.out.println(lista);
        //remove every second word from b
        bIter=listb.iterator();
        while (bIter.hasNext()) {
            bIter.next();
            if (bIter.hasNext()) {
                bIter.next();
                bIter.remove();
            }

        }
        System.out.println(listb);
        lista.removeAll(listb);
        System.out.println(lista);

    }
}

树集

树集(TreeSet是一个有序集合),可以以任意顺序将元素插入到集合中,在对集合进行遍历时,每个值将自动按照排序后的顺序呈现。

Map接口

如果说现在要保存一堆关联数据
Map存放数据的最终目标是为了查找数据,Collection存放数据是为了输出。
HashMap中重要的方法是put(key,value)
object get(key)
HashTable里面对于key和value的数据都不允许设置为null
HashMap允许key或者value为空
遇见了Map接口基本上就是用HashMap类

关于Iteartor输出的问题(核心)

只要是集合的输出就要用到Iterator,但是在整个Map接口中没有返回Iterator接口对象的方法,所以如果想用Iterator输出Map集合,首先针对Map集合与Collection集合保存数据的特点进行分析后才能知道。
每当使用put()方法想Map集合里面保存一堆数据的时候,实际上所有的数据都会被保存为Map.Entry接口对象。
观察Map.Entry接口定义:
public static
在Map接口里定义有一个将Map集合转化为Set集合的方法:public Set<Entry<k,v>>
Map集合利用Iterator接口输出的步骤:

  • 利用Map接口的entrySet()方法将Map集合变为Set集合,里面的泛型是Entry<k,v>
  • 利用Set集合中的iterator()方法将Set集合进行Iterator输出
  • 每一次Iterator循环取出的都是Map.Entry接口对象,利用此对象进行key与value的输出

package listlearn;/*
 *@author havel 2018/7/18 09:32
 */

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

public class MapToCollection {
    public static void main(String[] args){
        Map<String, Integer> map = new HashMap<>();
        map.put("一", 1);
        map.put("二", 2);
        map.put("三", 3);
        Set<Map.Entry<String,Integer>> set=map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = set.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String,Integer> entry=iterator.next();
            System.out.println(entry.getKey()+" "+entry.getValue());

        }
    }
}

关于Map集合中key的说明
在使用Map接口的时候可以发现,几乎可以使用任意的类型作为key或value,那么也就表示可以使用自定义的类作为key,那么作为这个key的类必须要覆写Object类的hashcode()和equals()方法。

  • 在以后使用Map集合的时候,首选的key的类型是String,尽量不要使用自定义的类作为key。

Map总结

  • Map保存数据的目的是为了查询使用,Collection保存数据的目的是为了输出使用
  • 要知道Map使用Iterator接口输出的步骤以及具体实现代码
  • HashMap可以保存null key重复会实现覆盖
  • HashTable不可以保存null

Stack子类

表示的是栈操作,栈是一种先进后出的数据结构。而Stack是Vector的子类。
需要注意的是,虽然Stack是Vector的子类,可是他不会使用Vector类的方法,

  • 方法
    public E push(E item) 入栈
    public E pop() 出栈

总结

栈的操作现在唯一还有应用的就是在Android的页面回退上。

Properties子类

国际化程序特点,同一个特点,根据不同的语言环境选择资源文件,所有的资源文件后缀必须是“*.properties”
properties类是HashTable的子类,主要是进行属性的操作(属性的最大特点是利用字符串设置key和value),首先看Properties类的定义结构
public class Properties extends Hashtable<Object,Object>
在使用Properties类的时候不需要设置泛型类型,因为从他已开始出现就只能保存String,主要使用该类的如下方法
public Object setProperty(String key,String value) //设置属性
public String getProperty(String key),如果key不存在,返回空
public String getProperty(String key,String defaultValue) 如果key不存在,返回默认值
对于属性文件而言,除了可以使用Properties类读取之外,也可以使用ResourceBoundle读取。

总结

资源文件特点
key=value
key=value
资源文件中的数据都是String。

Collections工具类

在Java提供类库的时候考虑到用户的使用方便性,所以专门提供了一个集合的工具,可以实现List、Set、和Map集合的操作。

  • 为集合追加数据
package listlearn;

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

/*
 *@author havel 2018/7/18 10:25
 */public class CollectionsDemo {
     public static void main(String[] args){
         List<String> list = new ArrayList<>();
         Collections.addAll(list, "a", "B");
         System.out.println(list);
     }
}
  • 面试题:请解释Collection与Collections的区别
  • Collection是集合操作的接口
  • Collections是集合操作的工具类,可以进行List、Set、Map集合的操作

总结

这个类一般不会使用到,但是作为知识点清楚有这么一个类就足够了。

相关文章

  • 我的Swift的学习总结 -->第二周

    集合 集合:Set,定义一个集合可以写成:var 集合名 : Set<集合类型> = [集合元素],具体的集合应用...

  • markdown 测试

    集合 集合 集合 引用

  • kotlin学习第五天:集合,高阶函数,Lambda表达式

    集合 list集合 list集合分为可变集合与不可变集合。由list of创建的集合为不可变集合,不能扩容,不能修...

  • kotlin练习 ---- 集合练习

    kotlin练习 - 集合练习 Set集合 Set集合创建 Set集合的使用 List集合 List集合创建 Li...

  • 集合总结

    集合 集合分为单列集合和双列集合两种: 一.单列集合: Collection是单列集合的顶级接口: 其中有三类集合...

  • 映射、元组、集合

    映射 元组 集合 集合之seq 集合之set 集合之map

  • 16.Collection集合

    主要内容: Collection 集合 迭代器 增强for List 集合 Set 集合 1,集合 集合是java...

  • 集合与有序集合

    集合分为有序集合 (zset) 和无序集合 (set), 一般无序集合也直接说成集合 无序集合 (set) 无序集...

  • python入坑第八天|集合

    好的,各位蛇友,我们今天来学习集合。 内容: 集合的创建 集合操作符号 集合的内置函数 集合的创建 集合用set(...

  • 集合框架

    集合框架的概念 集合:存放数据的容器 集合框架:java中,用于表示集合,以及操作集合的类和接口的统称 数组与集合...

网友评论

    本文标题:集合

    本文链接:https://www.haomeiwen.com/subject/jatmpftx.html