----------- android培训、java培训、java学习型技术博客、期待与您交流!------------
黑马程序员——35,泛型应用和Map
一:泛型限定----》
? 是通配符
<? extends P> 表示接收的是P类或者P类的子类的对象(上限)
<? super S > 表示接收的是S类或者S类的父类的对象(下限)
举一个例子说明问题:
public static void socx( ArrayList<? extends Person> a )//打印方法
//可以接收Person类和其子类,这样Person类和其子类的对象都可以用该方打印方法打印元素
{
Iterator<? extends Person> it= a.iterator();//取出迭代器
while( it.hasNext() )
{
//打印元素名字的操作
}
}
泛型限定在Comparator和Comparable上的应用:
如果装有Person类实例的集合以及装有Person类的子类对象的集合都需要元素比较操作时候,定义两个比较器类然后分别建立各自的比较器是非常麻烦的,于是,泛型限定就有作用:
class Bijiao /*比较器类*/ implements Comparator<Person> //<? super E>
//在这里,Comparator既可以接收Person类又可以接收Person类的子类
//所以,这个比较器类产生的实例比较器既可以用来比较Person类实例,又可以比较Person的子类的实例
{
public int compare(Person a,Person b)
{
//内容…
}
}
泛型在Comparable上应用也是类似的:
class Student extends Person implements Comparable<Person>//<? super E>
//在这里Comparable既可以接收Person类又可以接收Person类的子类的对象做比较
{
public int compareTo( Person p)
{
//因为接收过来的有可能是Person类对象,又有可能是Student类对象,所以调用实例P的方法时要注意:只能调用Person类中存在的方法,才能够通过编译。
//内容…
}
//其他内容…
}
二:Map----》
Map是放在java.util包中的接口,可以理解成双列集合,存放的是键值对(也可以说Map存放的是映射关系)。一个键最多映射一个值,但是一个值可以被多个键映射到。
Map有几个常见的子类:
1, HashTable---- 底层数据结构是哈希表数据结构,不可以存放null键或者null值,线程同步。
2, HashMap----底层数据结构是哈希表数据结构,可以存放null键或者null值,线程不同步。
3, TreeMap----底层数据架构是二叉树结构,可以给键排序,线程不同步。
Map的一些常用共有方法(以下都是基于个人理解写的):
void clear() //清空集合中的元素
boolean containsKey(Object key) //检测是否含有指定键
boolean containsValue(Object value) //检测是否含有指定值
Set<Map.Entry<K,V>>> entrySet() //返回Map中的映射关系
boolean equals(Object o) //指定对象与该Map比较
V get(Object key) //返回指定键的值,如果没有键对应的值就返回null
int hashCode() //返回哈希值
boolean isEmpty() //判断是否为空
Set<K> keySet() //把所有的键存放到一个Set集合中
V put(K key, V value) //添加键值对,注意:如果Map中有两个相同键的值,新添加的键值对会覆盖原本的键值对,该方法返回的是被剔除的值;如果没有键对应的值就返回null
void putAll(Map<? Extends K,? extends V> m) //添加指定Map的键值对到该Map中
V remove(Object key) //移除指定键值对,如果没有键对应的值就返回null
int size() //返回键值对个数
Collection<V> values() //返回一个包含所有值的集合
那么如何获取Map中的键值对呢?
可以利用keySet和entrySet方法:
//对于一个Map
Map<String,String> m= new HashMap<String,String>();
m.put("006","aaa");
m.put("002","bbb");
m.put("004","ccc");
m.put("003","ddd");
m.put("005","eee");
m.put("001","fff");
//HashMap底层数据结构是哈希表,还是自动按照哈希表顺序排列
Set<String> s=m.keySet();
//把所有键放在Set集合的容器的里面
Iterator<String> it= s.iterator();
//有了Set之后就可以建立迭代器
while(it.hasNext())
{
//it.next()返回String类型的键,利用键获取对应的值
}
Map的键值对的第二种取出方式:
Set<Map.Entry<String,String>> s=m.entrySet();//取出的是键值对的映射关系
Iterator<Map.Entry<String,String>> it=s.iterator(); //获取迭代器
while(it.hasNext())
{
Map.Entry<String,String> me= It.next();
String sKey= me.getKey();// 获取键
String sValue= me.getValue(); // 获取值
}
Map.Entry<String,String>可以看做是一种类型(注意仅仅是看做),是Map集合中映射关系类型,这是一种关系类型. 实际上,Map.Entry是Map接口内部的一个public修饰的静态子接口。
什么时候用HashMap,什么时候用TreeMap要看具体情况
TreeMap的应用例子:
有一串字符串获取该字符串中每一个字母出现的次数,打印结果是这种形式的:a(6)b(8)...每一个字母都对应着一个数字,这样就形成映射关系了。
import java.util.*;
class Mapjs6
{
public static void main(String[] args)
{
String a="sss#$dfgggyi++vf--b";
TreeMap<Character,Integer> m=method(a);
method2(m);
}
public static TreeMap<Character,Integer> method(String str)
{
char[] ch=str.toCharArray();//把字符串拆成字符数组
TreeMap<Character,Integer> m=new TreeMap<Character,Integer>();
for(int x=0;x<ch.length;x++)
{
if(!(ch[x]>='a' &&ch[x]<='z'|| ch[x]>='A' && ch[x]<='Z'))
continue; //如果不是字母字符就结束本次循环,进入下一次循环
Integer i= m.get(ch[x]);
if(i==null)
{
m.put(ch[x],1);
}
else
{
i=i+1;
//如果没有下面m.put(ch[x],i);这句话那么改变的仅仅是i而ch[x]对应的值没有改变!
m.put(ch[x],i);
/*
注意:这句话很重要!不能省略!一定要重新放!
新的元素会把就的元素剔除。
*/
}
}
soc(m);
System.out.println();
return m;
}
public static void method2(TreeMap<Character,Integer> m )
{
Set<Map.Entry<Character,Integer>> s=m.entrySet();
Iterator<Map.Entry<Character,Integer>> it=s.iterator();
//把映射关系取出来进行操作
while ( it.hasNext())
{
Map.Entry<Character,Integer> a=it.next();
Character akey = a.getKey();
Integer avalue = a.getValue();
soc(akey+"("+avalue+")");
}
}
public static void soc(Object obj)
{
System.out.print(obj);
}
}
/*
以上编译运行结果:
{b=1,d=1, f=2, g=3, i=1, s=3, v=1, y=1}
b(1)d(1)f(2)g(3)i(1)s(3)v(1)y(1)
*/
还有一个就是Map的扩展运用:简单理解就是一个大容器中存放着小容器。(通常是一个Map容器中存放着一个Map容器以及对应的键)视频老师是先写大容器,在写小容器;而本人是先写小容器再写大容器,效果还是一样的。
import java.util.*;
class Mapjs7
{
public static void main(String[] args)
{
HashMap<String,String> jichu= new HashMap<String,String>();
//定义一个基础班容器
jichu.put("2","sdf");//前面是学生学号后面是姓名
jichu.put("21","ert");
jichu.put("13","io");
jichu.put("19","aheds");
HashMap<String,String> tigao=new HashMap<String,String>();
//定义一个提高班容器
tigao.put("76","edf");
tigao.put("43","ycs");
tigao.put("74","cbhg");
tigao.put("20","aggs");
HashMap<String,HashMap<String,String>> xuexiao=new HashMap<String,HashMap<String,String>>();
//定义一个学校容器,装的是基础班和提高班
xuexiao.put("基础班",jichu);
xuexiao.put("提高班",tigao);
//打印所有学生的学号和名字
Set<Map.Entry<String,HashMap<String,String>>> s= xuexiao.entrySet();
//把映射关系放在Set集合中
Iterator<Map.Entry<String,HashMap<String,String>>> it=s.iterator();
//建立迭代器对映射关系进行操作
while( it.hasNext() )
{
Map.Entry<String,HashMap<String,String>> m =it.next();
String bjkey =m.getKey();
HashMap<String,String> bjvalue =m.getValue();
soc("这是"+bjkey+"的学生");
method(bjvalue);
}
}
public static void method(HashMap<String,String> jiaoshi )
{
Set<Map.Entry<String,String>> s =jiaoshi.entrySet();
Iterator<Map.Entry<String,String>> it= s.iterator();
while(it.hasNext())
{
Map.Entry<String,String> m=it.next();
String s1 = m.getKey();
String s2 = m.getValue();
soc(s1+"---"+s2);
}
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
/*
以上代码运行结果是:
这是提高班的学生
74---cbhg
20---aggs
76---edf
43---ycs
这是基础班的学生
2---sdf
13---io
19---aheds
21---ert
*/
----------- android
培训
、
java培训
、java学习型技术博客、期待与您交流!------------
文章浏览阅读7.4k次,点赞2次,收藏19次。web项目是指服务端部署在服务器上,客户端使用浏览器通过网络传输进行访问获取数据的项目。通常我们看见的应用页面网站等等都可以称之为web项目。 在web项目的开发中可分为web前端开发和web后端开发 web前端:即是客户端能看得见碰得着得东西。包括Web页面结构、页面样式外观以及Web层面得交互展现。 前端特点:页面视觉效果良好(客户第一)、Web页面交互流畅(..._web项目
文章浏览阅读5.6k次,点赞8次,收藏67次。java操作关于导入导出Excel的多种方式_java导出excel的三种方法
文章浏览阅读1.1w次,点赞10次,收藏21次。Windows path系统变量编辑_windows path
文章浏览阅读512次。第13章 源码编译13.2 Hadoop2.7.3源码编译13.2.1下载Hadoop源码包(1)到官网http://hadoop.apache.org/releases.html下载2.7.3的source源码包(2)解压缩tar -zxvf hadoop-2.7.3-src.tar.gz -C /opt1(3)打开解压目录下的BUILDING.txt,编译过程和需要的软件其实就是根据这个文档里..._hadoop2.7.3-src源码下载
文章浏览阅读1k次。Latex 语法_\latex
文章浏览阅读9.6k次,点赞20次,收藏21次。单应矩阵的概念、计算原理和重投影误差评分
文章浏览阅读1k次。最近写项目碰到一个bug 大概就是一个表格组件两个页面都会使用 组件中表格的某些列就用v-if控制了 表格的首尾列都用了fixed 然后就发生了bug 如下图 具体原因不明看过很多网上的办法 有在fixed的列绑定key的 也有使用doLayout()的 测了都没用 最后在一个前端交流群里一位大佬给出的办法 实测有效.el-table__header, .el-table__body, .el-table__footer { width: 100%; tab_element table fixed 样式异常
文章浏览阅读1.8w次,点赞39次,收藏98次。最近在学习C语言基础的时候,我注意到了在写代码时经常使用的 #include <stdio.h>。众所周知,这是引用头文件的操作,但对于它的深层次含义,我并没有更多的了解。所以今天就来让我们深入研究一下它的更多信息。include的意思是包含,它前面的 # 是预处理指令。#通常有三种功能:1. 宏定义 2 .文件包含 3.条件编译。例如#define定义的标识符常量,这就属于一种宏定义的用法。其他的用法,随着深入学习相信也都会接触到。<stdio.h>就是我们引用的头文件,相_include 含义
文章浏览阅读722次。telnet命令通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的 能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台_telnet linux reboot
文章浏览阅读5k次。重建视觉外观是色调映射的终极目标。色调映射算法在降低高动态图像(HDR)范围的同时着力保护捕捉到的原始图像的外观。色调映射算子分两种策略,一种是全局的,另一种是局部的。1. 全局映射算子每一个像素点将会根据它的全图特征和亮度信息进行映射,不管其空间位置几何。全局算子一个比较典型的例子就是色调曲线。全局色调映射在处理12位(12-bit)深度的图像的时候是完全OK的,当图像的动态范围特别高的时候,那就不行了。这是因为所有的像素点都采取同一种方式进行处理,根本就没有管它是在较亮区域还是较暗区域。这样的话,._local tone mapping
文章浏览阅读86次。1.RadioButtonRadioButton被称作为单选框,通常都是以组的形式出现,可以在一组控件中选择一个。RadioButton的使用首先需要加入<RadioGroup/>,在这个组中,我们进行单选按钮的声明。 1 <RadioGroup 2 android:id="@+id/radioGroup" 3 an..._radiobutton和toggombutton
文章浏览阅读2.5k次,点赞3次,收藏12次。作为智能硬件开发,你一定要知道开发板是个什么东西?如果您有和智能硬件开发人员打交道,或者贵公司正好有智能硬件的开发需求,又或者你正在学习关于智能硬件方面的知识,那么你一定听过『开发板』这个词语。///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程和毕业设计指导,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像白色字体加我也能领取哦,记得口令陈老师///开发板(demoboard)是用来进行嵌入式系统开发的电路板,包括中央处理器、存储器、输入设备、输出设备、数据通路/总线和外部资源接口等_硬件工程师的芯片demo板 开发板