文档章节

Java 集合(四)

测试-雨
 测试-雨
发布于 2015/02/02 18:02
字数 2527
阅读 20
收藏 0

概述:

  • 面向对象语言对事物的体现都是以对象的形式,为了方便多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而Java集合就像一种容器,可以动态地多个对象的引用放入容器中。

  • Java集合类可以用于存储数量不等的对个对象,还可用于保存具有映射关系的关联数组。

使用:

  • 存储对象可以考虑:①数组    ②集合

  • 数组存储对象的特点:Student[]    stu=new    Student[20];    stu[0]=new Student(); ...

    • 使用数组的弊端:一旦创建,其长度不可变。

    • 真实的数组存放的对象的个数是不可知的。

集合:    

  • Collection接口:

    • List:元素有序、可以重复的集合    - - - - "  动态“ 数组

      • ArrayList(主要的实现类)(底层是用数组实现的)   

      • LinkedList(对于频繁的插入、删除操作建议使用这个)(底层用链表实现的)   

      • Vector(古老的实现类、线程安全的)

    • Set:元素无序、不可重复的集合 (Set中常用的方法都是 Collection 下定义的    - - - - 类似高中的 " 集合 "
          • Set:存储的元素是无序的,不可重复的!

            • 无序性无序性!=随机性。真正的无序性,指的是元素在底层存储的位置是无序的。

            • 不可重复性当向Set中添加进相同的元素的时候,后面的这个不能添加进去。

            • 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。进而保证Set中元素的不可重复性!

            • Set中的元素是如何存储的呢?使用了哈希算法。

              • 当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置已有对象存储,再通过equals()方法比较这两个对象是否相同,如果相同,后一个对象就不能再添加进来。

              • 万一返回false呢?都存储(不建议如此)

              • >要求hashCode()方法要与equals()方法一致。


      • HashSet(主要实现类)

      • LinkedHashSet   

        • 使用链表维护了一个添加集合中的顺序。导致当我们遍历LinkedHashSet集合元素时,是按照添加进去的顺序遍历的。

          • LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。

        • LinkedHashSet 不允许集合元素重复。

      • TreeSet

        • 向TreeSet中添加的元素,必须是同一个类的

        • TreeSet 不允许集合元素重复。

        • 可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历。

        • 当Person类没有实现Comparable接口时,当向TreeSet中添加Person对象时,报ClassCaseException。

        • 当向TrreSet中添加自定义类的对象时,有两种排序方法

          • ①自然排序:要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法,在此方法中,指明安装自定义类的哪个属性进行排序。

          • ②定制排序:    comparetTo()与hashCode()以及equal s()三者保持一致! 排序方式 见以下步骤

            • ①创建一个实现了Comparator接口的类对象   

              • >①向TrreSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer的那个属性排序。

              • >②将此对象作为形参传递给TreeSet的构造器中。

              • >③向TrreSet中添加Comparator接口中的compare方法中涉及的类的对象。

        • 向TreeSet中添加元素时,首先要按照compareTo()方法进行比较,一旦返回0,虽然仅是2个对象的此属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来

          • >comparetTo()与hashCode()以及equal s()三者保持一致!

  • Map接口:具有映射关系 " key-value对 " 的集合  - - - - 类似于高中的“ 函数 ”y=f(x)        (x1,y1)(x2,y2);

      • HashMap    ②LinkedHashMap    ③TreeMap    ④Hashtable(子类:Properties)

  • Collection:

    • size():返回集合中的元素(对象)的个数;

    • add(Object  obj):向集合中添加一个元素(对象),任何类型都可以。

    • addAll(Collection  coll):将形参coll中包含的所有元素添加到当前集合中。

    • isEmpty():判断一下这个集合是否为空

    • clear():清空集合元素

    • contains(Objetc obj):判断集合是否包含指定的obj元素。如果包含,返回true.反之返回false; 

      • 判断的根据:根据元素所在的类的equals() 方法进行判断

      • 明确:如果存入集合中的元素是自定义类的对象。要求:自定义类要重写 equals() 方法。

    • System.out.println(对象)可以查看集合的元素

    • containsAll(Collection coll):判断当前集合中是否包含coll中所有的元素。

    • retainAll(Collction coll):求当前集合与coll的共有的元素,返回给当前集合

    • remove(Object obj):删除集合中的obj元素。若删除成功,返回true.反之返回false.

    • removeAll(Collection coll):从当前集合中删除包含在coll中的元素。

    • equals(Object obj):判断两个集合中的所有元素是否完全相同

    • hashCode():hash值(暂不明白);

    • roArray():将集合转化成数组。(用Object来进行接收)。

    • Collection coll=Arrays . asList(1,2,3):数组转化成集合。

    • iterator():返回一个Iterator接口实现类的对象,进而实现集合的遍历。

      • //方式一:不用
        Iterator iterator=new Iterator();
        System.out.println(iterator.next());//输出一个,有几个打印几次。。
        //方式二:不用
        for(int i=0;i<coll.size();i++){
            System.out.println(iterator.next());
        }
        //方式三:使用Iterator实现集合的遍历。
        Iterator iterator=new Iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
      • //使用增强for循环实现集合的遍历
         Collection coll=new ArrayList();
         coll.add(123);
         coll.add("ASDF123");
         coll.add("BB");
         coll.add("AA");
         coll.add(456);
         for(Object i:coll){//将coll赋值给i,然后打印i.
             System.out.println(i);
         }

ArrayList:List的主要实现类

    • List中相对于Collection,新增加的方法

      • >     void add (int index, Object ele):在指定的索引位置添加元素
                boolean addAll (int index, Collection eles)在指定索引位置添加一个元素集合
                Object get (int index)获取指定索引位置的元素
                Object remove (int index)删除指定索引位置的元素
                Object set (int index, Object ele)设置指定索引位置的元素值

      • >     int indexOf (Object obj) 返回obj在集合中首次出现的位置。没有的话。返回 -1
                int lastIndexOf (Object obj)返回obj在集合中最后一次出现的位置。没有的话。返回 -1
                List subList (int fromIndex, int toIndex)返回从fromeIndex到toIndex结束的左闭右开的一个子list

      • List常用方法:①增(add(Object ele))    ③改(set(int index, Object ele))      ⑤长度(sizi())

                              ②删(remove)                   ④查(get(int index))                        ⑥插(addAll(int index, Collection eles))

Conllection接口

Map接口

  • HashMap:Map的主要实现类,key是用Set来存放的,不可重复。

    • value是用Collection来存放的,可重复一个Key - value对。是一个Entry。所有的Entry是用Set来存放的,也是不可重复的。

    • 向HashMap中添加元素时,会调用key所在类的equals()方法,判断两个key是否相同。若相同则只能添加进后添加的那个元素。

  • LinkedHashMap:使用链表维护添加进Map中的顺序,故遍历Map时,是按添加的顺序遍历的。

  • TreeMap:按照添加进Map中元素的Key的指定属性进行排序。要求:key必须是同一个类的对象!

    • 针对key自然排序 vs 定制排序

  • Hashtable:古老的实现类,线程安全,不建议使用

    • properties:常用来处理属性文件。键和值都为String类型的


  • Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value

  • Map 中的 key 和  value 都可以是任何引用类型的数据

  • Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法。

  • 常用String类作为Map的“键”。

  • key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value。


  • 添加、删除
            Object put(Object key,Object value):向Map中添加一个元素
            Object remove(Object key):按照指定的Key删除此key - value
            void putAll(Map t):将一个新的对象中的所有元素添加进来
            void clear():清空

  • 元素查询
            Object get(Object key):获取指定key的value值。若无此Key,则返回null.
            boolean containsKey(Object key):判断这个map当中是否包含指定的key的对。
            boolean containsValue(Object value): 判断是否包含value的那个对。
            int size():返回集合的长度
            boolean isEmpty(): 判断元素是否为空
            boolean equals(Object obj):是否equals另一个

  • 元视图操作:遍历Map
            Set keySet()
            Collection values()
            Set entrySet()

①遍历key集

Set set=new map.keySet();
for(Object obj:set){
   System.out.println(obj);
}

②遍历value集

        Collection values=map.value();
        Iterator i=values.iterator();
        while(i.hasNext()){
            System.out.println(i.next());
        }

③遍历 key - value 对。

Set set=new map.keySet();
for(Object obj:set){
   System.out.println(obj+"- - ->"+map.get(obj));
}

或者    :

Set set=map.entruySet();
for(Object obj:set){
Map.Entry entry =(Map.Entry)obj;
    System.out.println(entry.getKey()+"- - ->"+entry.getValue());
}

Collections:

       操作Collection以及Map的工具类:Collections

面试题:区分Collection和Collections


排序操作:

    ①reverse(List):反转 List 中元素的顺序
    ②shuffle(List):对 List 集合元素进行随机排序
    ③sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
    ④sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
    ⑤swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换

查找、替换:

    ①Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
    ②Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
    ③Object min(Collection)
    ④Object min(Collection,Comparator)
    ⑤int frequency(Collection,Object):返回指定集合中指定元素的出现次数
    ⑥void copy(List dest,List src):将src中的内容复制到dest中
    ⑦boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值

© 著作权归作者所有

测试-雨
粉丝 10
博文 81
码字总数 19747
作品 0
杨浦
QA/测试工程师
私信 提问
泥沙砖瓦浆木匠/java-core-learning-example

感谢赞助的ta们 Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。 包括基础语法,OOP,字符串,集合,IO,反射,线程,网络等。 未完成模块:阿里J...

泥沙砖瓦浆木匠
04/02
0
0
Java8 Lambda【简】

Java8 Lambda Lambda是一个表达式,也可以说它是一个匿名函数。然而在使用它或是阅读Lambda代码的时候,却显得并不那么容易。因为它匿名,因为它删减了一些必要的说明信息(比如方法名)。 ...

anlve
2018/03/08
61
0
JDBC PreparedStatement 批量查询 in 的实现 方案

我们经常会有这种业务需求,根据一个条件集合去查询一张表的数据,比如: select * from tablename t where t.name in (List ); 在java语言中,我们需要用到JDBC来和数据库打交道,那么在JDB...

HHT15927087748
2018/06/07
0
0
JSON-lib框架,转换JSON、XML

Json-lib可以将Java对象转成json格式的字符串,也可以将Java对象转换成xml格式的文档,同样可以将json字符串转换成Java对象或是将xml字符串转换成Java对象。 一、 准备工作 1、 首先要去官方...

五大三粗
2015/11/03
155
0
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java快递电子面单打印接口对接demo

之前的后天管理系统的电子面单打印使用的是灵通打单。 使用相对比较麻烦,需要到处Excel之后再导入,麻烦。 快递鸟有电子面单api,后台系统直接对接很是方便,不过也遇到了好些问题。 不难是...

程序的小猿
21分钟前
3
0
fasjtjson文档

https://github.com/alibaba/fastjson/wiki/JSONField

jirak
21分钟前
3
0
Mybatis中插入多条记录

Oracle数据库 实现方法 <insert id="saveWithdrawLog"> INSERT ALL INTO OSM_TRADE_DETAIL(SID,MBR_ID,USR_ID,TRADE_MONEY,TRADE_TYPE,TRADE_TIME,TRADE_WAY,PAY_ID) VALUES(#{si......

豫华商
22分钟前
3
0
Flink on YARN(下):常见问题与排查思路

作者:杨弢(搏远) Flink 支持 Standalone 独立部署和 YARN、Kubernetes、Mesos 等集群部署模式,其中 YARN 集群部署模式在国内的应用越来越广泛。Flink 社区将推出 Flink on YARN 应用解读...

开源中国小二
24分钟前
3
0
技术沙龙|京东云端到端多媒体关键技术揭秘

编者按:从带来更高编码效率、更好的用户体验的京享高清,到直播架构与网络演进优化,从而为用户带来更流畅的观看体验,以及运维系统的异常自动修复和高弹性的多媒体存储架构,一层一层展示出...

京东云技术新知
24分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部