JAVA语言基础知识学习之集合List、Map和Set
小标 2019-01-09 来源 : 阅读 998 评论 0

摘要:本文主要向大家介绍了JAVA语言基础知识学习之集合List、Map和Set,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言基础知识学习之集合List、Map和Set,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


集合介绍


我们在进行Java程序开发的时候,除了最常用的基础数据类型和String对象外,也经常会用到集合相关类。


集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用。


集合类型主要有3种:List、Set、和Map。


它们之间的关系可用下图来表示:


注:Map不是collections的子类,但是它们完全整合在集合中了!


List 接口是继承于 Collection接口并定义 一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。


一般来说,我们在单线程中主要使用的List是ArrayList和LinkedList来实现,多线程则是使用Vector或者使用Collections.sychronizedList来装饰一个集合。


这三个的解释如下:


ArrayList:内部是通过数组实现的,它允许对元素进行快随机访问。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。 LinkedList: 则是链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。 Vector: 通过数组实现的,不同的是它支持线程的同步。访问速度ArrayList慢。


它们的用法如下:


List list1 = new ArrayList();

List list2 = new LinkedList();

List list3 = new Vector();

List list4=Collections.synchronizedList(new ArrayList())

   

在了解了它们的用法之后,我们来看看为什么说使用ArrayList比LinkedList查询快,使用LinkedList比ArrayList新增和删除快!


这里也用以下代码来进行说明,顺便也将Vector进行比较。


代码示例:


    private final static int count=50000;

 

    private static ArrayList arrayList = new ArrayList<>();  

    private static LinkedList linkedList = new LinkedList<>();  

    private static Vector vector = new Vector<>();  

 

    public static void main(String[] args) {

        insertList(arrayList);

        insertList(linkedList);

        insertList(vector);

 

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

 

        readList(arrayList);

        readList(linkedList);

        readList(vector);

 

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

 

        delList(arrayList);

        delList(linkedList);

        delList(vector);

    }

 

    private  static void insertList(List list){   

         long start=System.currentTimeMillis();   

         Object o = new Object();   

         for(int i=0;i<count;i++){ count="" else="" i="0" instanceof="" int="" list="" long="" name="" o="new" object="" pre="" private="" return="" start="System.currentTimeMillis();" static="" string="" void=""><p>输出结果:</p><pre class="brush:java;">    ArrayList插入50000条数据,耗时:281ms

    LinkedList插入50000条数据,耗时:2ms

    Vector插入50000条数据,耗时:274ms

    --------------------

    ArrayList查询50000条数据,耗时:1ms

    LinkedList查询50000条数据,耗时:1060ms

    Vector查询50000条数据,耗时:2ms

    --------------------

    ArrayList删除50000条数据,耗时:143ms

    LinkedList删除50000条数据,耗时:1ms

    Vector删除50000条数据,耗时:137ms</pre>

<p>从上述结果中,可以明显看出ArrayList和LinkedList在新增、删除和查询性能上的区别。</p>

<p>在集合中,我们一般用于存储数据。不过有时在有多个集合的时候,我们想将这几个集合做合集、交集、差集和并集的操作。在List中,这些方法已经封装好了,我们无需在进行编写相应的代码,直接拿来使用就行。</p>

<p>代码示例如下:</p>

<pre class="brush:java;">/**

     * 合集

     * @param ls1

     * @param ls2

     * @return

     */

    private static List<string> addAll(List<string> ls1,List<string>ls2){

        ls1.addAll(ls2);

        return ls1;

    }

 

    /**

     * 交集 (retainAll 会删除 ls1在ls2中没有的元素)

     * @param ls1

     * @param ls2

     * @return

     */

    private static List<string> retainAll(List<string> ls1,List<string>ls2){

        ls1.retainAll(ls2);

        return ls1;

    }

 

    /**

     * 差集 (删除ls2中没有ls1中的元素)

     * @param ls1

     * @param ls2

     * @return

     */

    private static List<string> removeAll(List<string> ls1,List<string>ls2){

        ls1.removeAll(ls2);

        return ls1;

    }

 

    /**

     * 无重复的并集 (ls1和ls2中并集,并无重复)

     * @param ls1

     * @param ls2

     * @return

     */

    private static List<string> andAll(List<string> ls1,List<string>ls2){

        //删除在ls1中出现的元素

        ls2.removeAll(ls1);

        //将剩余的ls2中的元素添加到ls1中

        ls1.addAll(ls2);

        return ls1;

    }</string></string></string></string></string></string></string></string></string></string></string></string></pre>

<p>当然,经常用到的还有对List进行遍历。</p>

<p>List数组遍历主要有这三种方法,普通的for循环,增强for循环(jdk1.5之后出现),和Iterator(迭代器)。</p>

<p>代码示例:</p>

<pre class="brush:java;">     List<string>     

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程