java的集合框架set 和map的深入理解
Java的集合框架之Map的用法详解
Map有两种比较常用的实现:HashMap 和 TreeMap。
- HashMap: HashMap 也是无序的,也是按照哈希编码来排序的,允许使用null 值和null 键
- TreeMap: TreeMap 是有顺序的,按照用户的输入顺序进行排序,TreeMap 按照顺序村塾“键/值”对。值得注意的是 在TreeMap 中是不允许“键”重复的,但是可以允许“值”重复。下面通过一个简单的例子进行说明。
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test2 {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<String,Integer>();
//Map<String,Integer> map = new TreeMap<String,Integer>();
//添加元素
map.put("tom",20);
map.put("rose", 18);
map.put("mike",18);
map.put("black", 21);
map.put("tom",19);//键 是不允许重复的,但是数值是可以重复的
System.out.println(map);
// 输出结果: {rose=18, tom=19, mike=18, black=21}
//取出map中的元素
int x = map.get("tom");
System.out.println(x);//19
//Map 集合的遍历方法
//"键的集合"用到keySet 方法
Set<String> set = map.keySet();//此时的set存放的都是字符串(键值)
for(String s:set)
{
System.out.println(s+"="+map.get(s)+" ");
}
System.out.println("-------------------------");
//用迭代器进行遍历
Iterator<String> iterator = set.iterator();
while(iterator.hasNext())
{
String s = iterator.next();
System.out.println(s+"="+map.get(s)+" ");
}
//"值的遍历",通过map.vaules()方法获取
Collection<Integer> value = map.values();//返回值类型为Collection
//"值的集合",通过map.vaules()方法获取
Collection<Integer> value = map.values();//因为是对值的遍历,所以泛型也就定义成Integer
System.out.println(value);
//值的遍历
Iterator<Integer> iterator = value.iterator();
while(iterator.hasNext())
{
int v = iterator.next();
System.out.println(v+" ");
}
//键值对 的集合,通过map.entrySet()方法获取
Set<Map.Entry<String, Integer>> set = map.entrySet();//注意此处的泛型要和上面map的类型保持一致
System.out.println(set);
for (Map.Entry<String, Integer> me:set)
{
String key = me.getKey();
Integer value = me.getValue();
System.out.println(key+"="+value+" ");
}
System.out.println("--------------------------");
Iterator<Map.Entry<String, Integer>> iterator = set.iterator();
while(iterator.hasNext())
{
Map.Entry<String, Integer> entry = iterator.next();
System.out.println(entry.getKey()+" "+entry.getValue()+" ");
}
}
}
set 和map 的几个小例子
创建一个TreeSet 对象,并在其中添加一些员工对象(Empoyee),其姓名和工资分别是:张三 8000,李四6000,王五 5600,马六 7500 。最后按照工资的大小,降序输出。(提示:让Employee 对象实现 Comparable接口)
public class Employee implements Comparable{
private String name;
private int salary;
public Employee(String name, int salary) {//对生成的属性进行初始化,生成带有参数的方法
super();
this.name = name;
this.salary = salary;
}
public Employee() {//生成不带参数的方法,其实这里的作用也是为了在测试类中更好的调用此方法
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public int compareTo(Object p) {
// TODO Auto-generated method stub
Employee p1 = (Employee)p;
if (this.salary>p1.salary)//用当前当前的salary 和p1的salary 进行比较
{
return -1; //返回的是后面一个数减去前面一个数的“位差”
}
else if (this.salary < p1.salary)
{
return 1;
}
else
return 0;
}
}
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
//TreeSet 是用户自定义的顺序(默认)
Set<Employee> set = new TreeSet<Employee>();//用set集合来完成“一个类”的操作(这个地方可以和)
Employee p1 = new Employee("张三",8000);
Employee p2 = new Employee("李四",6000);
Employee p3 = new Employee("王五",5600);
Employee p4 = new Employee("马六",8000);
set.add(p1);//add 方法自动调用compare 方法,因为重新写了此方法,所以此处可以进行比较
set.add(p2);
set.add(p3);
set.add(p4);
for (Employee e:set)
{
System.out.println(e.getName()+":"+e.getSalary());
}
System.out.println("--------------------------------");
Iterator<Employee> iterator = set.iterator();
while(iterator.hasNext())
{
Employee p = iterator.next();
System.out.println(p.getName()+":"+p.getSalary());
}
}
}
例子(12)
对于上例中的排序这里做简要说明:这里是重写了compareTo
方法,因为原来是方法是无法对salary
和name
进行排序的,这样重写了,就可以实现排序的效果。return
返回的是 位差 如果前面的数比后面的数大,且位差是正数则说明后面的比前面的还要大,并按此位差进行插入。依次类推。
@Override
public int compareTo(Object p) {
// TODO Auto-generated method stub
Employee p1 = (Employee)p;
if (this.salary>p1.salary)//用当前当前的salary 和p1的salary 进行比较
{
return -1; //返回的是后面一个数减去前面一个数的“位差”
}
else if (this.salary < p1.salary)
{
return 1;
}
else
return 0;
}
例子(13)
创建一个Customer类,类中的属性有姓名(name)、年龄(age)、性别(gender),每个属性分别有get/set 方法。然后创建两个Customer 对象:张立、18、女和王猛、22、男。把这两个对象存储在ArrayList 对象中,然后从ArrayList 对象读取出来。
package yjlblog.www.ch01;
public class Customer {
private String name;
private int age;
private String gender;
public Customer(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public Customer() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
package yjlblog.www.ch01;
import java.util.HashSet;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet();
set.add("first");
set.add("second");
set.add("third");
set.add("forth");
//set 中的顺序和插入顺序是不一致的
//HashSet 按照哈希码来排序
//TreeSet 按照字典序排序
//set 中不允许出现相同的元素
for(int i = 0;i <set.size();i++){
System.out.println();
}
}
}
//set 也是用循环来实现遍历的
package yjlblog.www.ch01;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
Customer c1 = new Customer("张立",18,"女");
Customer c2 = new Customer("王猛",18,"男");
ArrayList<Customer> list = new ArrayList<Customer>();//泛型引用的是Customer类
list.add(c1); //来向”“动态数组ArrayList”中存放自己定义的属性方法
list.add(c2);
for(Customer c:list){//注意此处的c 的类型是和list的类型一致的
System.out.println("姓名"+c.getName());
System.out.println("年龄"+c.getAge());//用get方法来说的得到数据
System.out.println("性别"+c.getGender());
}
}//遍历都是使用循环的,不管事动态数组还是链表。实质可以看成是数组
}
例子(11)
创建一个HashMap 对象,并在其中添加一些员工的姓名和工资:张三,8000,李四 6000.然后从HashMap对象中获取这两个人的薪水并打印出来,接着把张三的工资改为8500,再把他们的薪水显示出来。
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TEST1 {
public static void main(String[] args) {
Map<String,Integer> map=new TreeMap<String,Integer>();
map.put("张三",8000);
map.put("李四", 6000);
map.put("张三", 8500);
//从HashMap对象中获取两个人的薪水并打印
Set<String> set=map.keySet();//此时set中存放的是字符串(键值)
System.out.println(set);
for(String s:set){
System.out.print(s+"="+map.get(s)+" ");
}
}
}
java的集合框架set 和map的深入理解的更多相关文章
- java学习——集合框架(泛型,Map)
泛型: ... Map:一次添加一对元素.Collection 一次添加一个元素. Map也称为双列集合,Collection集合称为单列集合. 其实map集合中存储的就是键值对. map集合中必须保 ...
- 理解java集合——集合框架 Collection、Map
1.概述: @white Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)"丢进"该容器中. 2.Java集合大致可以分4类: @white Set ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- java.util 集合框架集合
java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...
- Java基础——集合框架
Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...
- 浅谈Java的集合框架
浅谈Java的集合框架 一. 初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...
- Java 高级-集合框架
参考资料 参考 HashMap 类似 C++ 中的 STL 标准模板库,Java 也在 java.util 包中封装了一套常用数据结构及其算法,称为集合框架.所有的集合框架都包含如下内容: 接口:代表 ...
- java的集合框架之一
java是一套很成熟的东西,很多商用的东西都喜欢用它,用的人多,稳定.不过一般也不怎么说起它,因为太常见了,私下里说,写java应用层得就像农民工,每一处都是搭积木,根据设计师的东西如何优雅地搭好积木 ...
随机推荐
- 定位页面元素之xpath详解以及定位不到测试元素的常见问题
一.定位元素的方法 id:首选的识别属性,W3C标准推荐为页面每一个元素设置一个独一无二的ID属性, 如果没有且很难找到唯一属性,解决方法:(1)找开发把id或者name加上.如果不行,解决思路可以是 ...
- .net异步性能测试(包括ASP.NET MVC WebAPI异步方法)
很久没有写博客了,今年做的产品公司这两天刚刚开了发布会,稍微清闲下来,想想我们做的产品还有没有性能优化空间,于是想到了.Net的异步可以优化性能,但到底能够提升多大的比例呢?恰好有一个朋友正在做各种语 ...
- Jquery Ajax type的4种类型
Ajax type这个里面填什么呢?通常大家都会说get和post.那么还有2个是什么呢 $.ajax({ url: 'http://www.cnblogs.com/youku/', type: '' ...
- myeclipse一些快捷键 错了或者没说到补充下
Ctrl + 1 快速修复Ctrl + D 删除当前行 Ctrl + Alt + ↓ 复制当前行到下一行(复制增加)Ctrl + Alt + ↑ 复制当前行到上一行(复制增加)Alt + ↓ 当前行 ...
- 100%解决ios上audio不能自动播放的问题
由于ios的安全机制问题,不允许audio和video自动播放,所以想要使audio标签自动播放那是实现不了的,即使给play()也是播放不了. 解决方法: 首先,创建audio标签:<audi ...
- 阿里云配置php环境 ubuntu12.04 32 nginx+php5+mysql
最近几个客户都订购了阿里云服务器,如何配置服务器就比较重要了 比较喜欢ubuntu的系统,这里以12.04 32位来说 服务器配置采用 nginx+php5+mysql 首先是apt-get的更新 a ...
- Linux 安装PHP探针
学习linux系统还是很有意思的事情,下面这个就是探针,想必有人已经看到过类似的界面主要用来查看自己服务器的运行状况,简单看看内存占用及运行时间就可以了 1 首先要安装Apahce 及 php,命令如 ...
- SpringMVC学习笔记(二)
一.导航 复杂类型的参数绑定 校验 异常处理 图片上传 json交互 拦截器 二.复杂类型参数绑定 ①.包装类型的pojo参数绑定 使用场景:实现商品查询条件传入. 实现方法:>通过添加Http ...
- GitHub Desktop客户端打开文件乱码问题解决方案
今天在使用GitHub Desktop客户端的时候,发添加本地仓库后文件内容显示为乱码. 1.现象 如下图所示: 2.原因分析 后来分析得知原来是由于编码不统一造成 的. 具体来说,我在window ...
- 机器学习实战K-近邻算法
今天开始学习机器学习,第一章是K-近邻算法,有不对的地方请指正 大概总结一下近邻算法写分类器步骤: 1. 计算测试数据与已知数据的特征值的距离,离得越近越相似 2. 取距离最近的K个已知数据的所属分类 ...