JAVA集合类型 (现代的变量集群)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

List (接口)

特点:

a. 先后顺序敏感。LIST结构中的元素必须分出谁先谁后。

b. 能够反复....

主要用来模拟队列(queue)等生活中对先后顺序敏感的应用场景。

<1> ArrayList (以数组为基础实现)

数组在使用上较为麻烦,ArrayList是一个类。其对数组进行了2次改造。或者说在数据的基础上进行了二次开发,从使用角度克服了数组的诸多缺点。但本质上还是依靠数组机制来完毕。

ArrayList内部依赖的是一个对象数组Object[], 其有众多方法。均环绕该对象数组展开。

size()             获得arraylist中内部的实际包括元素的数量。

add()             追加到最后一个

add(index,obj)    插入数据到index所指定的下标位置

remove(index)    删除指定index位置的元素

remove(obj)      删除与该对象匹配的元素 (依靠equals匹配)

contains(obj)     查看是否存在该元素

indexOf(obj)      查看元素出现的索引位 (从头開始查)

lastIndexOf(obj)  查看元素出现的索引位 (从末尾開始查)

isEmpty()         查看arraylist是否存在有效元素

subList()          创造子List

toArray()          把List转数组

trimToSize        缩小容量到实际存在元素的数量大小。

长处:

与数组类似,随机定位速度非常快.

但在编码便捷性上大大优于数组,少写不少控制代码。

缺点:

与数组类型,插入和删除easy造成大幅波动。在元素力量超出范围的时候。也有大量的数组元素拷贝的操作发生,对系统性能有较大影响。

适用场景:

数据录入后。较为稳定,删除和插入操作较少,大多为定位查询操作

数据添加的频率间隔较长,不会持续性连续添加

适合队列等对元素的先后顺序极为敏感的数据结构。

ArrayList的遍历

1. 常规遍历法

for(int i=0;i<al.size();i++)

System.out.println(al.get(i)):

1.  集合类型专用遍历法 (jdk1.5以上版本号支持)

for(Object obj:al)

System.out.println(obj);

2.  迭代体(iterator)遍历法

Iterator itr=al.iterator();

while(itr.hasNext())

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

ArrayList的泛型(generic type)控制

因为ArrayList非常灵活,内部能够放置各种数据类型,导致外部程序,从ArrayList中取出一个元素,还必须慎重对其推断, 有的时候外部须要大量的各种类型的代码来针对不同的对象进行相应操作,成本高昂。 有的程序猿忘记书写了一些代码。常常会导致ClassCastException, 所以后来,人们不得不限制了ArrayList中的元素的类型,要求其内部仅仅能有一种元素。

<2> LinkedList (以链表为基础实现)

长处:

与链表类型。插入和删除性能优越,不会造成内存波动。

缺点:

与链表类似。随机定位速度慢,须要从头開始依次检索.

链表的内存消耗大

适用场景:

数据录入后。较为不稳定,有着频繁删除和插入操作,随机定位查询相对较少。

适合队列等对元素的先后顺序极为敏感的数据结构。

2. Set(接口)

特点:

1. Set是Collection接口的子接口,其继承了Collection接口中的全部抽象方法。并做了针对Set应用的方法扩展。

2. Set接口强调不可反复,但无先后顺序。

a. HashSet

依据Hash (哈希) 算法进行内存分配,对数据进行保存的集合类型,对于装入当中的元素。保存在内存的位置。用户不用关心。保存的方式肯定是高效的,这是用哈希算法保证的,但有一点,不能反复! 对于插入当中的元素。HashSet不保障其先后顺序。

HashSet怎样对插入的元素进行雷同识别?

Ø 理解Object.hashCode()

Object对象有一个hashCode方法,该方法是本地方法,由C语言实现,返回的是这个对象在内存中的開始地址。返回值是一个整数。

不论什么对象假设其没有重写Object的hashcode方法。那么其hashcode的值均是不同的。

Ø HashSet依靠hashcode的返回值来推断对象是否相等

1. 当一个对象被尝试保存入hashset的时候,hashset会先调用这个对象的hashcode方法返回一个hashcode值, hashset把该值与其内部的hashcode列表(该表保存了全部保存在hashset中的对象的hashcode值)进行比对, 假设发现没有同样,则觉得该对象在hashset中没有反复,能够接纳。

2. 假设发现对象的hashcode与列表中的一个对象雷同。那么hashset将会调用该对象的equals方法进行是否同样的终于推断。Equals觉得不同,hashset还是会接纳该对象。

Object有equals和 hashcode两个方法进行对象内容是否相等的推断操作,在普通的应用中。一般我们用equals进行推断就可以,但hashset因为其特性上须要保持不同样,所以其常常进行对象是否同样的推断,因为集合类型对性能要求非常高。而equals推断涉及到较为复杂的逻辑。成本非常高。在某种程度上会减少性能,但equals推断也是精度最高的推断。

从性能角度出发,Object还提供了轻量级的推断方法, hashcode. 因为hashcode内部仅仅是整数运算,而底层还是C的,速度非常快。

Hashcode觉得不同样。则对象为不同的对象,equals就不介入的。

Hashcode觉得同样,则交由equals做最后推断,equals结果为终于结果,能够推翻hashcode的判定结果。

Hashcode是“地方法院”, equals是“终审法庭”。

Ø hashcode 和equals 之间的契约

因为hashcode和equals方法之间有着主从关系,特别假设一个对象终于要与hashset打交道的时候, 就必须同一时候重写hashcode和equals方法,两个方法在重写的时候,必须保证一个约定,否则将重写失败。

契约:

1. Hashcode不同, equals一定要不同

2. Hashcode同样, equals能够不同

b. TreeSet (树结构集合)

TreeSet里头的元素是不能反复的。但会依据某种既定的规则(天然顺序)进行排序输出。

全部增加TreeSet中的对象必须实现Comparable接口。

该接口仅仅有一个方法int compartTo(obj);

返回值:

1 当前对象大于传入对象

0 当前对象等于传入对象

-1 当前对象小于传入对象

JAVA集合类型(二)的更多相关文章

  1. JAVA集合类型详解

    一.前言 作为java面试的常客[集合类型]是永恒的话题:在开发中,主要了解具体的使用,没有太多的去关注具体的理论说明,掌握那几种常用的集合类型貌似也就够使用了:导致这一些集合类型的理论有可能经常的忘 ...

  2. 【由浅入深理解java集合】(二)——集合 Set

    上一篇文章介绍了Set集合的通用知识.Set集合中包含了三个比较重要的实现类:HashSet.TreeSet和EnumSet.本篇文章将重点介绍这三个类. 一.HashSet类 HashSet简介 H ...

  3. java集合类型接口和实现类个人总结

    转载:http://blog.csdn.net/qingchunbusanchang/article/details/39576749 java的集合是一个比较综合的概念,相关的知识有很多的博客里面做 ...

  4. (Set, Map, Collections工具类)JAVA集合框架二

    Java集合框架部分细节总结二 Set 实现类:HashSet,TreeSet HashSet 基于HashCode计算元素存放位置,当计算得出哈希码相同时,会调用equals判断是否相同,相同则拒绝 ...

  5. java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...

  6. Java集合系列(二):ArrayList、LinkedList、Vector的使用方法及区别

    本篇博客主要讲解List接口的三个实现类ArrayList.LinkedList.Vector的使用方法以及三者之间的区别. 1. ArrayList使用 ArrayList是List接口最常用的实现 ...

  7. java集合类型源码解析之ArrayList

    前言 作为一个老码农,不仅要谈架构.谈并发,也不能忘记最基础的语言和数据结构,因此特开辟这个系列的文章,争取每个月写1~2篇关于java基础知识的文章,以温故而知新. 如无特别之处,这个系列文章所使用 ...

  8. Java集合框架(二)

    Set Set:无序,不可以重复元素. |--------HashSet:数据结构是哈希表. 线程是非同步的.保证元素唯一性的原理是:判断元素的hashCode值是否相同,如果相同,还会继续判断元素的 ...

  9. [知识整理]Java集合(二) - Set

    一.实现Set的几个类 HashSet.LinkedHashSet.TreeSet.ConcurrentSkipListSet.CopyOnWriterArraySet 二.对应底层的数据结构 Has ...

随机推荐

  1. BA-传感器

    01.室内温度传感器 壁装,西门子,QAA2061D 1.默认范围:温度0-50℃,湿度0-100% 2.供电方式:24vac 3.穿线方式:4芯屏蔽线 02.风管温度传感器 西门子,QAM2120. ...

  2. nodejs-mysql模块

    安装mysql模块 1 npm install -g mysql node中使用Mysql模块来执行mysql命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 var ht ...

  3. POJ 2184

    简单的01背包,把S看体积,把F看价值,把它们变正数处理就可以了.在处理负数时,因为减一个负数相当于加一个,所以要从前往后. #include <iostream> #include &l ...

  4. Flash的选择

    算起来自己接触Flash接近4年了. 最開始的2.0,做button,做动画,做导航. 后来用3.0做动画,做相冊.做毕业设计,做课件. 然后到公司做2.0的动画,模板开发,效果设计. 似乎又回到了原 ...

  5. mysql设置远程訪问数据库的多种方法

    问题:MySQL权限设置正确,但仍无法远程訪问.通过telnet发现3306port未打开. 分析:MySQL默认仅仅绑定127.0.0.1,即:仅仅有在本机才干訪问3306port. 解决:找到My ...

  6. cocos2D(六)----CCLayer

    一个游戏中能够有非常多个场景,每一个场景里面又可能包括有多个图层,这里的图层一般就是CCLayer对象.CCLayer本身差点儿没什么功能.对照CCNode,CCLayer可用于接收触摸和加速计输入. ...

  7. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第一步---開始界面&amp;关卡选择

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦.他说:随便写,第一别全然照搬代码:第二能够说 ...

  8. Codeforces Round #338 (Div. 2) B. Longtail Hedgehog 记忆化搜索/树DP

    B. Longtail Hedgehog   This Christmas Santa gave Masha a magic picture and a pencil. The picture con ...

  9. multiset多重集合容器

    跟set集合容器相比,multiset多重集合容器也使用红黑树组织元素,仅仅是multiset多重集合容器同意将反复的元素键值插入.元素的搜索依旧具有对数级的算法时间复杂度,find和equal_ra ...

  10. python 从bulkblacklist信誉查询网站提交查询

    import urllib import urllib2 #import webbrowser import re import socket def is_domain_in_black_list( ...