Java面向对象 集合(下)
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()
- import java.util.*;
- class MapDemo
- {
- public static void main(String[] args)
- {
- Map<String,String> map = new HashMap<String,String>();
- //添加元素,添加元素,如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。
- //并put方法会返回被覆盖的值。
- System.out.println("put:"+map.put("01","zhangsan1"));
- System.out.println("put:"+map.put("01","wnagwu"));
- map.put("02","zhangsan2");
- map.put("03","zhangsan3");
- System.out.println("containsKey:"+map.containsKey("022"));
- //System.out.println("remove:"+map.remove("02"));
- System.out.println("get:"+map.get("023"));
- map.put("04",null);
- System.out.println("get:"+map.get("04"));
- //可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断。
- //获取map集合中所有的值。
- Collection<String> coll = map.values();
- System.out.println(coll);
- System.out.println(map);
- }
- }
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集合中的元素。
- import java.util.*;
- class MapDemo2
- {
- public static void main(String[] args)
- {
- Map<String,String> map = new HashMap<String,String>();
- map.put("02","zhangsan2");
- map.put("03","zhangsan3");
- map.put("01","zhangsan1");
- map.put("04","zhangsan4");
- //将Map集合中的映射关系取出。存入到Set集合中。
- Set<Map.Entry<String,String>> entrySet = map.entrySet()
- Iterator<Map.Entry<String,String>> it = entrySet.iterator();
- while(it.hasNext())
- {
- Map.Entry<String,String> me = it.next();
- String key = me.getKey();
- String value = me.getValue();
- System.out.println(key+":"+value);
- }
- /*
- //先获取map集合的所有键的Set集合,keySet();
- Set<String> keySet = map.keySet();
- //有了Set集合。就可以获取其迭代器。
- Iterator<String> it = keySet.iterator();
- while(it.hasNext())
- {
- String key = it.next();
- //有了键可以通过map集合的get方法获取其对应的值。
- String value = map.get(key);
- System.out.println("key:"+key+",value:"+value);
- }
- */
- }
- }
- <strong>/*
- 每一个学生都有对应的归属地。
- 学生Student,地址String。
- 学生属性:姓名,年龄。
- 注意:姓名和年龄相同的视为同一个学生。
- 保证学生的唯一性
- 1,描述学生。
- 2,定义map容器。将学生作为键,地址作为值。存入。
- 3,获取map集合中的元素。
- */
- import java.util.*;
- class Student implements Comparable<Student>
- {
- private String name;
- private int age;
- Student(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- public int compareTo(Student s)
- {
- int num = new Integer(this.age).compareTo(new Integer(s.age));
- if(num==0)
- return this.name.compareTo(s.name);
- return num;
- }
- public int hashCode()
- {
- return name.hashCode()+age*34;
- }
- public boolean equals(Object obj)
- {
- if(!(obj instanceof Student))
- throw new ClassCastException("类型不匹配");
- Student s = (Student)obj;
- return this.name.equals(s.name) && this.age==s.age;
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- public String toString()
- {
- return name+":"+age;
- }
- }
- class MapTest
- {
- public static void main(String[] args)
- {
- HashMap<Student,String> hm = new HashMap<Student,String>();
- hm.put(new Student("lisi1",21),"beijing");
- hm.put(new Student("lisi1",21),"tianjin");
- hm.put(new Student("lisi2",22),"shanghai");
- hm.put(new Student("lisi3",23),"nanjing");
- hm.put(new Student("lisi4",24),"wuhan");
- //第一种取出方式 keySet
- Set<Student> keySet = hm.keySet();
- Iterator<Student> it = keySet.iterator();
- while(it.hasNext())
- {
- Student stu = it.next();
- String addr = hm.get(stu);
- System.out.println(stu+".."+addr);
- }
- //第二种取出方式 entrySet
- Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
- Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();
- while(iter.hasNext())
- {
- Map.Entry<Student,String> me = iter.next();
- Student stu = me.getKey();
- String addr = me.getValue();
- System.out.println(stu+"........."+addr);
- }
- }
- }
- </strong>
集合工具类
Collections:集合框架的工具类。里面定义的都是静态方法。
Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。它有两个常用的子接口,
List:对元素都有定义索引。有序的。可以重复元素。
Set:不可以重复元素。无序。
提供的方法中有可以对list集合进行排序,二分查找等方法。
通常常用的集合都是线程不安全的。因为要提高效率。
如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。
Collections.shuffle(list); 将集合打乱顺序
Arrays:
用于操作数组的工具类。
里面都是静态方法。
asList:将数组变成list集合
把数组变成list集合有什么好处?
可以使用集合的思想和方法来操作数组中的元素。
注意:将数组变成集合,不可以使用集合的增删方法。
因为数组的长度是固定。
如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。
如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
集合变数组。
Collection接口中的toArray方法。
- <strong>/*
- 集合变数组。
- Collection接口中的toArray方法。
- */
- import java.util.*;
- class CollectionToArray
- {
- public static void main(String[] args)
- {
- ArrayList<String> al = new ArrayList<String>();
- al.add("abc1");
- al.add("abc2");
- al.add("abc3");
- /*
- 1,指定类型的数组到底要定义多长呢?
- 当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。
- 当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。剩余的数组位置为null
- 所以创建一个刚刚好的数组最优。
- 2,为什么要将集合变数组?
- 为了限定对元素的操作。不需要进行增删了。
- */
- String[] arr = al.toArray(new String[al.size()]);
- System.out.println(Arrays.toString(arr));
- }
- }
- </strong>
for(数据类型 变量名 : 被遍历的集合(Collection)或者数组)
{
}
只能获取集合元素。但是不能对集合进行操作。
如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。
- import java.util.*;
- class ForEachDemo
- {
- public static void main(String[] args)
- {
- ArrayList<String> al = new ArrayList<String>();
- al.add("abc1");
- al.add("abc2");
- al.add("abc3");
- for(String s : al)
- {
- //s = "kk";
- System.out.println(s);
- }
- System.out.println(al);
- /*
- Iterator<String> it = al.iterator();
- while(it.hasNext())
- {
- System.out.println(it.next());
- }
- */
- int[] arr = {3,5,1};
- for(int x=0; x<arr.length; x++)
- {
- System.out.println(arr[x]);
- }
- for(int i : arr)
- {
- System.out.println("i:"+i);
- }
- HashMap<Integer,String> hm = new HashMap<Integer,String>();
- hm.put(1,"a");
- hm.put(2,"b");
- hm.put(3,"c");
- Set<Integer> keySet = hm.keySet();
- for(Integer i : keySet)
- {
- System.out.println(i+"::"+hm.get(i));
- }
- // Set<Map.Entry<Integer,String>> entrySet = hm.entrySet();
- // for(Map.Entry<Integer,String> me : entrySet)
- for(Map.Entry<Integer,String> me : hm.entrySet())
- {
- System.out.println(me.getKey()+"------"+me.getValue());
- }
- }
- }
首先要明白一点:加入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面向对象 集合(下)的更多相关文章
- Java面向对象 集合(上)
Java面向对象 集合(上) 知识概要: (1)体系概述 (2)共性方法 (3)迭代器 (4)list集合 (5)Set 集合 体系概述: 集 ...
- Java面向对象 集合(中)
Java面向对象 集合(中) 知识概要: (1)泛型的体系概念 (2)泛型的特点 (3)自定义泛型类 泛型的体系概念 泛型:JDK1.5版 ...
- java面向对象程序设计(下)-枚举类
在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象,这些实例有限而且固定的类,在Java中被称为枚举类 JDK1.5新增了一个enum关键字,(它与 ...
- java面向对象程序设计(下)-接口的定义
抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更加彻底,则可以提炼出一种更加特殊的"抽象类"-接口(interface),Java9对接口进行了改进,允许在接口中定义默认方 ...
- Java面向对象(下)作业
首先我把题目先列到这里,可以仔细看一下题. (1)设计一个名为Geometric的几何图形的抽象类,该类包括: ①两个名为color.filled属性分别表示图形颜色和是否填充. ②一个无参的构造方法 ...
- 第三章 Java面向对象(下)
3.1.抽象类 概述:在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了 格式:public abstract class 类名 {} 语法特点: 抽象类和抽象方法必须使 ...
- Java面向对象 网络编程 下
Java面向对象 网络编程 下 知识概要: (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端: ...
- Java面向对象 继承(下)
Java面向对象 继承(下) 知识概要: (1)抽象类 1.1 抽象类概述 1.2 抽象类的特点 ...
- Java面向对象作业-用接口方式测试向下转型
Java面向对象作业-用接口方式测试向下转型 根据视频的里实例 我们直接修改Test2测试方法: package com.java1234.chap03.sec13; public class Tes ...
随机推荐
- 浅谈一下Java String
相信很多同学使用Java String, Java中的String方法,但是对其中的原理可能有些模糊,那么咱们就针对这块内容进行展开,让更多的同学理解和知道. public final class S ...
- 我的hibernate学习记录(一)
之前已经过滤一下hibernate的简单的用法,但是近期有点时间,所以重新看下视频,敲下代码,翻下笔记,写博客与大家分享一下. hibernate简介 Hibernate是一个开放源代码的对象关系映射 ...
- tkinter第四章 输入框,校对
#最简单的输入框 import tkinter as tk root = tk.Tk() e = tk.Entry(root)#输入框的类 e.pack() e.delete(0,tk.END)#把输 ...
- 201521123005《java程序设计》第五周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口 有点类似继承中父类与子类的关系 方法声明和常量值的集合 对行为的抽象 一种 ...
- 201521123010 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 作业参考文件下载 ① 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java ...
- 201521123019 《Java程序设计》第2周学习总结
一. 本章学习总结 1.掌握了string类型的用法 2.对java数组有了初步了解 3.arrays用法有所掌握 二.书面作业 1.使用Eclipse关联jdk源代码,并查看String对象的源代码 ...
- java 程序编写规则(自己总结)
1.命名规范 (1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z).数字(0-9)和下划线"_". (2)类名是一个名词,采用大小写混合的方式,每个单词的首字母大写.例如:Us ...
- eclipse中svn插件在线安装方式
SVN插件地址:http://subclipse.tigris.org/update_1.8.x 第一步:eclipse>Help菜单>Install New Software- 第二步: ...
- Linux帮助手册(man)
Linux的帮助文档 在我们使用Linux的过程中,都会遇到这样那样的问题,一般我们在计算机能连上网的情况下会进行百度或Google解决问题,但是并不是所有文题都能在网上很快得到答案.万一我们是在没有 ...
- python实例编写(1)--浏览器操作,元素操作
一.浏览器操作 1. back()与 forward() #coding=gbk //编码不一定是utf-8 from selenium import webdriver //导入包,也叫”模组“ ...