Java面向对象 集合(下)



知识概要:

              (1)Map集合的体系结构

(2)Map集合的方法

(3)HashMap TreeMap

(4)集合框架中的常用工具类

(5)高级for循环

Map集合的体系结构

Map

              |--Hashtable:   底层是哈希表数据结构,不可以存入null键null值。   该集合是线程同步的。jdk1.0.效率低。

              |--HashMap: 底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代  

              |--TreeMap:  底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

Map集合的常用方法

1,添加。

put(K key, V value)

       putAll(Map<? extends K,? extends V> m)

2,删除。

clear()

       remove(Object key)

3,判断。

containsValue(Object value)

      containsKey(Object key)

      isEmpty()

4,获取。

get(Object key)

     size()

     values()

  1. import java.util.*;
  2. class MapDemo
  3. {
  4. public static void main(String[] args)
  5. {
  6. Map<String,String> map = new HashMap<String,String>();
  7.  
  8. //添加元素,添加元素,如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。
  9. //并put方法会返回被覆盖的值。
  10. System.out.println("put:"+map.put("01","zhangsan1"));
  11. System.out.println("put:"+map.put("01","wnagwu"));
  12. map.put("02","zhangsan2");
  13. map.put("03","zhangsan3");
  14.  
  15. System.out.println("containsKey:"+map.containsKey("022"));
  16. //System.out.println("remove:"+map.remove("02"));
  17.  
  18. System.out.println("get:"+map.get("023"));
  19.  
  20. map.put("04",null);
  21. System.out.println("get:"+map.get("04"));
  22. //可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断。
  23.  
  24. //获取map集合中所有的值。
  25. Collection<String> coll = map.values();
  26.  
  27. System.out.println(coll);
  28. System.out.println(map);
  29.  
  30. }
  31. }

map集合的两种取出方式:



 1,Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。

       所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。

       Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。

2,Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,

      而这个关系的数据类型就是:Map.Entry

Entry其实就是Map中的一个static内部接口。

      为什么要定义在内部呢?

      因为只有有了Map集合,有了键值对,才会有键值的映射关系。

      关系属于Map集合中的一个内部事物。

      而且该事物在直接访问Map集合中的元素。

  1. import java.util.*;
  2.  
  3. class MapDemo2
  4. {
  5. public static void main(String[] args)
  6. {
  7. Map<String,String> map = new HashMap<String,String>();
  8.  
  9. map.put("02","zhangsan2");
  10. map.put("03","zhangsan3");
  11. map.put("01","zhangsan1");
  12. map.put("04","zhangsan4");
  13.  
  14. //将Map集合中的映射关系取出。存入到Set集合中。
  15. Set<Map.Entry<String,String>> entrySet = map.entrySet()
  16.  
  17. Iterator<Map.Entry<String,String>> it = entrySet.iterator();
  18.  
  19. while(it.hasNext())
  20. {
  21. Map.Entry<String,String> me = it.next();
  22. String key = me.getKey();
  23. String value = me.getValue();
  24.  
  25. System.out.println(key+":"+value);
  26.  
  27. }
  28.  
  29. /*
  30. //先获取map集合的所有键的Set集合,keySet();
  31. Set<String> keySet = map.keySet();
  32.  
  33. //有了Set集合。就可以获取其迭代器。
  34. Iterator<String> it = keySet.iterator();
  35.  
  36. while(it.hasNext())
  37. {
  38. String key = it.next();
  39. //有了键可以通过map集合的get方法获取其对应的值。
  40. String value = map.get(key);
  41. System.out.println("key:"+key+",value:"+value);
  42. }
  43.  
  44. */
  45.  
  46. }
  47. }
  1. <strong>/*
  2. 每一个学生都有对应的归属地。
  3. 学生Student,地址String。
  4. 学生属性:姓名,年龄。
  5. 注意:姓名和年龄相同的视为同一个学生。
  6. 保证学生的唯一性
  7.  
  8. 1,描述学生。
  9.  
  10. 2,定义map容器。将学生作为键,地址作为值。存入。
  11.  
  12. 3,获取map集合中的元素。
  13.  
  14. */
  15.  
  16. import java.util.*;
  17. class Student implements Comparable<Student>
  18. {
  19. private String name;
  20. private int age;
  21. Student(String name,int age)
  22. {
  23. this.name = name;
  24. this.age = age;
  25. }
  26.  
  27. public int compareTo(Student s)
  28. {
  29. int num = new Integer(this.age).compareTo(new Integer(s.age));
  30.  
  31. if(num==0)
  32. return this.name.compareTo(s.name);
  33. return num;
  34. }
  35.  
  36. public int hashCode()
  37. {
  38. return name.hashCode()+age*34;
  39. }
  40. public boolean equals(Object obj)
  41. {
  42. if(!(obj instanceof Student))
  43. throw new ClassCastException("类型不匹配");
  44.  
  45. Student s = (Student)obj;
  46.  
  47. return this.name.equals(s.name) && this.age==s.age;
  48.  
  49. }
  50. public String getName()
  51. {
  52. return name;
  53. }
  54. public int getAge()
  55. {
  56. return age;
  57. }
  58. public String toString()
  59. {
  60. return name+":"+age;
  61. }
  62. }
  63.  
  64. class MapTest
  65. {
  66. public static void main(String[] args)
  67. {
  68. HashMap<Student,String> hm = new HashMap<Student,String>();
  69.  
  70. hm.put(new Student("lisi1",21),"beijing");
  71. hm.put(new Student("lisi1",21),"tianjin");
  72. hm.put(new Student("lisi2",22),"shanghai");
  73. hm.put(new Student("lisi3",23),"nanjing");
  74. hm.put(new Student("lisi4",24),"wuhan");
  75.  
  76. //第一种取出方式 keySet
  77.  
  78. Set<Student> keySet = hm.keySet();
  79.  
  80. Iterator<Student> it = keySet.iterator();
  81.  
  82. while(it.hasNext())
  83. {
  84. Student stu = it.next();
  85. String addr = hm.get(stu);
  86. System.out.println(stu+".."+addr);
  87. }
  88.  
  89. //第二种取出方式 entrySet
  90. Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
  91.  
  92. Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();
  93.  
  94. while(iter.hasNext())
  95. {
  96. Map.Entry<Student,String> me = iter.next();
  97. Student stu = me.getKey();
  98. String addr = me.getValue();
  99. System.out.println(stu+"........."+addr);
  100. }
  101. }
  102. }
  103. </strong>

 集合工具类

集合框架的工具类。

            Collections:集合框架的工具类。里面定义的都是静态方法。
Collections和Collection有什么区别?


Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。它有两个常用的子接口,

           List:对元素都有定义索引。有序的。可以重复元素。

           Set:不可以重复元素。无序。

Collections是集合框架中的一个工具类。该类中的方法都是静态的

         提供的方法中有可以对list集合进行排序,二分查找等方法。

         通常常用的集合都是线程不安全的。因为要提高效率。

         如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。

Collections.shuffle(list);                                                将集合打乱顺序

   Collections.reverseOrder(new StrLenComparator())  将集合的比较器反向比较
  Collections.replaceAll(list,"aaa","pp");                        将集合中“aaa”替换成“pp”
  Collections.reverse(list);                                                将集合反向
  Collections.fill(list,"pp");                                                将集合全部替换成pp
  Collections.sort(list,new StrLenComparator());           将集合按照指定比较器排序

Arrays:

用于操作数组的工具类。

    里面都是静态方法。           
asList:将数组变成list集合

把数组变成list集合有什么好处?

 

  可以使用集合的思想和方法来操作数组中的元素。

注意:将数组变成集合,不可以使用集合的增删方法。

  因为数组的长度是固定。

如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。

  如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

集合变数组。

Collection接口中的toArray方法。

  1. <strong>/*
  2. 集合变数组。
  3. Collection接口中的toArray方法。
  4.  
  5. */
  6. import java.util.*;
  7. class CollectionToArray
  8. {
  9. public static void main(String[] args)
  10. {
  11. ArrayList<String> al = new ArrayList<String>();
  12.  
  13. al.add("abc1");
  14. al.add("abc2");
  15. al.add("abc3");
  16.  
  17. /*
  18. 1,指定类型的数组到底要定义多长呢?
  19. 当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。
  20. 当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。剩余的数组位置为null
  21. 所以创建一个刚刚好的数组最优。
  22.  
  23. 2,为什么要将集合变数组?
  24. 为了限定对元素的操作。不需要进行增删了。
  25.  
  26. */
  27.  
  28. String[] arr = al.toArray(new String[al.size()]);
  29.  
  30. System.out.println(Arrays.toString(arr));
  31.  
  32. }
  33. }
  34. </strong>




高级for循环
    
   格式:

      for(数据类型 变量名 : 被遍历的集合(Collection)或者数组)

     {

    

     }


    对集合进行遍历。

   只能获取集合元素。但是不能对集合进行操作。
   迭代器除了遍历,还可以进行remove集合中元素的动作。

   如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。
   传统for和高级for有什么区别呢?
   高级for有一个局限性。必须有被遍历的目标。
   建议在遍历数组的时候,还是希望是用传统for。因为传统for可以定义脚标。
  1. import java.util.*;
  2.  
  3. class ForEachDemo
  4. {
  5. public static void main(String[] args)
  6. {
  7.  
  8. ArrayList<String> al = new ArrayList<String>();
  9.  
  10. al.add("abc1");
  11. al.add("abc2");
  12. al.add("abc3");
  13.  
  14. for(String s : al)
  15. {
  16. //s = "kk";
  17. System.out.println(s);
  18. }
  19.  
  20. System.out.println(al);
  21. /*
  22. Iterator<String> it = al.iterator();
  23.  
  24. while(it.hasNext())
  25. {
  26. System.out.println(it.next());
  27. }
  28. */
  29.  
  30. int[] arr = {3,5,1};
  31.  
  32. for(int x=0; x<arr.length; x++)
  33. {
  34. System.out.println(arr[x]);
  35. }
  36. for(int i : arr)
  37. {
  38. System.out.println("i:"+i);
  39. }
  40.  
  41. HashMap<Integer,String> hm = new HashMap<Integer,String>();
  42.  
  43. hm.put(1,"a");
  44. hm.put(2,"b");
  45. hm.put(3,"c");
  46.  
  47. Set<Integer> keySet = hm.keySet();
  48. for(Integer i : keySet)
  49. {
  50. System.out.println(i+"::"+hm.get(i));
  51. }
  52.  
  53. // Set<Map.Entry<Integer,String>> entrySet = hm.entrySet();
  54. // for(Map.Entry<Integer,String> me : entrySet)
  55.  
  56. for(Map.Entry<Integer,String> me : hm.entrySet())
  57. {
  58. System.out.println(me.getKey()+"------"+me.getValue());
  59. }
  60.  
  61. }
  62. }
0

首先要明白一点:加入Set里面的元素必须定义equals()方法以确保对象的唯一性。



第一个问题:TreeSet是怎么实现有序的,它是按什么规则排序的?

TreeSet的底层实现是采用红-黑树的数据结构,采用这种结构可以从Set中获取有序的序列,但是前提条件是:元素必须实现Comparable接口,该接口中只用一个方法,就是compareTo()方法。当往Set中插入一个新的元素的时候,首先会遍历Set中已经存在的元素(当然不是采用顺序遍历,具体采用什么方法,建议自己去看看源码),并调用compareTo()方法,根据返回的结果,决定插入位置。进而也就保证了元素的顺序。





第二个问题:它们怎么保证元素的不重复,是根据什么判断两个元素相同而不再添加的呢?

上面已经说过,加入Set里面的元素必须定义自己的equals()方法,但是对于良好的设计风格,最好在覆盖equals()方法的同时,也覆盖hashCode()方法,当然,对于TreeSet而言不用覆盖hashCode()方法也可。请记住:覆盖hashCode()方法的目的,只有一个原因就是提高效率。



在往Set中插入新的对象时,首先会用该对象的hashCode()与已经存在对象的hashCode()做比较,如果相等,那就不能插入,如果不等,才会调用equals()方法,如果equals结果为true,说明已经存在,就不能再插入,如果为false,可以插入。



注:如果没有覆盖hashCode()方法,那就是只比较equals().对两个对象equals运算,是判断两个对象是否相等的关键







Java面向对象 集合(下)的更多相关文章

  1. Java面向对象 集合(上)

     Java面向对象  集合(上) 知识概要:             (1)体系概述 (2)共性方法 (3)迭代器 (4)list集合 (5)Set 集合 体系概述:              集 ...

  2. Java面向对象 集合(中)

     Java面向对象 集合(中) 知识概要:                   (1)泛型的体系概念 (2)泛型的特点 (3)自定义泛型类 泛型的体系概念           泛型:JDK1.5版 ...

  3. java面向对象程序设计(下)-枚举类

    在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象,这些实例有限而且固定的类,在Java中被称为枚举类 JDK1.5新增了一个enum关键字,(它与 ...

  4. java面向对象程序设计(下)-接口的定义

    抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更加彻底,则可以提炼出一种更加特殊的"抽象类"-接口(interface),Java9对接口进行了改进,允许在接口中定义默认方 ...

  5. Java面向对象(下)作业

    首先我把题目先列到这里,可以仔细看一下题. (1)设计一个名为Geometric的几何图形的抽象类,该类包括: ①两个名为color.filled属性分别表示图形颜色和是否填充. ②一个无参的构造方法 ...

  6. 第三章 Java面向对象(下)

    3.1.抽象类 概述:在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了 格式:public abstract class 类名 {} 语法特点: 抽象类和抽象方法必须使 ...

  7. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  8. Java面向对象 继承(下)

     Java面向对象   继承(下) 知识概要:               (1)抽象类 1.1 抽象类概述                            1.2 抽象类的特点       ...

  9. Java面向对象作业-用接口方式测试向下转型

    Java面向对象作业-用接口方式测试向下转型 根据视频的里实例 我们直接修改Test2测试方法: package com.java1234.chap03.sec13; public class Tes ...

随机推荐

  1. 浅谈一下Java String

    相信很多同学使用Java String, Java中的String方法,但是对其中的原理可能有些模糊,那么咱们就针对这块内容进行展开,让更多的同学理解和知道. public final class S ...

  2. 我的hibernate学习记录(一)

    之前已经过滤一下hibernate的简单的用法,但是近期有点时间,所以重新看下视频,敲下代码,翻下笔记,写博客与大家分享一下. hibernate简介 Hibernate是一个开放源代码的对象关系映射 ...

  3. tkinter第四章 输入框,校对

    #最简单的输入框 import tkinter as tk root = tk.Tk() e = tk.Entry(root)#输入框的类 e.pack() e.delete(0,tk.END)#把输 ...

  4. 201521123005《java程序设计》第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口 有点类似继承中父类与子类的关系 方法声明和常量值的集合 对行为的抽象 一种 ...

  5. 201521123010 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 作业参考文件下载 ① 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java ...

  6. 201521123019 《Java程序设计》第2周学习总结

    一. 本章学习总结 1.掌握了string类型的用法 2.对java数组有了初步了解 3.arrays用法有所掌握 二.书面作业 1.使用Eclipse关联jdk源代码,并查看String对象的源代码 ...

  7. java 程序编写规则(自己总结)

    1.命名规范 (1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z).数字(0-9)和下划线"_". (2)类名是一个名词,采用大小写混合的方式,每个单词的首字母大写.例如:Us ...

  8. eclipse中svn插件在线安装方式

    SVN插件地址:http://subclipse.tigris.org/update_1.8.x 第一步:eclipse>Help菜单>Install New Software- 第二步: ...

  9. Linux帮助手册(man)

    Linux的帮助文档 在我们使用Linux的过程中,都会遇到这样那样的问题,一般我们在计算机能连上网的情况下会进行百度或Google解决问题,但是并不是所有文题都能在网上很快得到答案.万一我们是在没有 ...

  10. python实例编写(1)--浏览器操作,元素操作

    一.浏览器操作 1.  back()与 forward() #coding=gbk //编码不一定是utf-8 from selenium import webdriver //导入包,也叫”模组“ ...