Java集合类--->入门下篇
HashSet集合
在上篇大概了解了什么是集合类,知道它可以存储任意类型的对象,并且比数组灵活,集合类的长度可以变化。这里将接着介绍一下,Set接口的实现类之一,HashSet集合,Set集合:元素不能重复,无序(双否定)与List集合恰好相反(双肯定),不过两者都是单列集合。
Set接口主要有两个实现类,一个是HashSet,一个是TreeSet,前者是根据对象的哈希值确定元素在集合中的存储位置,因此具有良好的存取和查找性能,后者是以二叉树的方式存储元素,它可以实现对集合中的元素进行排序。
对于应用系列,直接上例子:
- package testCollection;
- import java.util.*;
- public class testHash {
- public static void main(String[] args) {
- HashSet hashSet = new HashSet();
- hashSet.add("wangwu");
- hashSet.add("1234");
- hashSet.add(123);
- hashSet.add(123);//这里再次出现123这个对象,重复但编译器未报异常
- Iterator it = hashSet.iterator();
- while(it.hasNext())
- {
- System.out.print(it.next()+" \t");
- }
- }
- }
输出结果:
Integer类型的“123”只出现了一次,说明第二次的“123”根本没有添加进集合中。HashSet之所以能确保不出现重复的元素,是因为在向Set中添加对象时,会先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则将这个对象直接存贮在此位置,若此对象已经有对象存储,在通过equals()比较这两个对象是否相同,如果相同,则后一个对象就不能再添加进来。提醒:equals()比较的是对象的内容是否相等,“==”比较的是对象引用所指向的堆位置是否相同。这个过程发生在运行阶段,并非编译阶段,所以敲代码时不会报错。
如果数据量足够庞大,且需要进行排序,请考虑使用TreeSet。
HashMap双列集合
前面提到过,双列集合就是键值对,一个键对应一个值,就像我们的函数一样,自变量对应于一个因变量。主要了解一下常使用的双列集合HashMap与Properties,下面分别介绍介绍。
看看HashMap的官方帮助文档介绍:
HashMap集合是基于哈希表的Map接口实现的,用于存储键值的映射关系,但是不保证映射的顺序,先来演示一下:
- package testCollection;
- import java.util.*;
- public class testHashMap {
- public static void main(String[] args) {
- HashMap<Integer,String> hashMap = new HashMap<Integer,String>();
- //put方法:添加键值对
- hashMap.put(13, "ZSY");
- hashMap.put(25, "LZ");
- hashMap.put(30, "HY");
- hashMap.put(49, "ZYC");
- hashMap.put(52, "HHZ");
- //keySet方法:获取键的集合
- Set keyset=hashMap.keySet();
- Iterator it = keyset.iterator();
- while(it.hasNext())
- {
- System.out.print(it.next().toString()+" \t");
- }
- System.out.println("\n");
- //values方法:获取值得集合
- Collection coll = hashMap.values();
- it=coll.iterator();
- while(it.hasNext())
- {
- System.out.print(it.next().toString()+"\t");
- }
- //输出键值对
- System.out.println("\n");
- System.out.println(hashMap);
- }
- }
输出结果:
- 49 52 25 13 30
- ZYC HHZ LZ ZSY HY
- {49=ZYC, 52=HHZ, 25=LZ, 13=ZSY, 30=HY}
直接印证了HashMap不保证映射的顺序,不再做多余解释。
大神说,还有一个经常用的方法就是通过键获得值,get方法。举个例子:(基于上面的代码)
- Set keyset=hashMap.keySet();
- Iterator it = keyset.iterator();
- while(it.hasNext())
- {
- Object key = it.next();
- Object value = hashMap.get(key);
- System.out.println("键:"+key.toString()+" 值:"+value.toString());
- }
输出结果:
其实以上便是Map的一种遍历方式,但是还有另外一种常用遍历方式:先获取集合中的所有映射关系,然后从映射关系中取出键和值。在进行例子演示前,我得先学习一下Map.Entry。Map.Entry 是Map中的一个接口,表示一个映射项(就是键值对,里面有Key和Value),Map.Entry里有相应的getKey和getValue方法,让我们能够从一个项中取出Key和Value。
上面那段话,可能对于我这种初学者稍微有些抽象。于是我换种解释,看上个例子中代码第6行,这种遍历方式得思想就是:先得到key,然后通过key去得到value,然而使用Entry可以一次性得到这两种值。那么它究竟是怎么实现的,我给自己举一个例子:
- //entrySet()方法
- Set entSet = hashMap.entrySet();
- Iterator itor = entSet.iterator();
- while(itor.hasNext())
- {
- Map.Entry entry = (Entry) itor.next();
- System.out.println(entry.getValue());
- System.out.println(entry.getKey());
- }
说白了,entry表示的就是键值对,因此键与值都包含了。但是entrySet()方法返回的还是一个Set集合,只不过是下面这种形式的:
- 49=ZYC
- 52=HHZ
- 25=LZ
- 13=ZSY
- 30=HY
因此,提供了分别获取键与值的方法,getKey()、getValue()的方法。个人猜测,它实现的方式就是以“=”为分隔符号,分别取左边或者右边,由此得到键与值。总之,记住,它是一种较好的遍历方式就行了。
Properties双列集合
很容易知道properties的汉语意思:属性,我就习惯称它为属性集合,它是一个class,主要用于存储字符串类型的键和值,实现了Map接口,所以它也是一种简单的Map集合,大神说:在实际开发中,经常使用properties集合存取应用的配置项,假如说:设计一个绘图工具,要求字体为微软雅黑、字号为20px、字体颜色为绿色,那么:
- font=微软雅黑
- size= 20px
- color=green
这个类主要提供了针对于字符串的存取以及保存到文件的方法。
- package testCollection;
- import java.util.*;
- public class testProperties {
- public static void main(String[] args) {
- Properties p = new Properties();
- p.setProperty("123", "123123");
- p.setProperty("456", "456456");
- p.setProperty("789", "789789");
- Set<String> num=p.stringPropertyNames();
- Iterator it = num.iterator();
- while(it.hasNext())
- {
- String str = it.next().toString();
- System.out.println(p.getProperty( str));
- System.out.println(str);
- }
- }
- }
输出结果:
- 123123
- 123
- 456456
- 456
- 789789
- 789
集合类暂时讲这么多吧,注意it.next()在while中一般只能出现一次。
Java集合类--->入门下篇的更多相关文章
- Java集合类--->入门上篇
最近我又在研究Java语言,这是第五次还是第六次学习Java的集合类,你也许会惊讶为什么这么多次?哈哈,因为之前的我没有记录下来,忘记了,当然最主要还是觉得自己毅力不够,没有坚持.那么,这次我将换一种 ...
- 《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路
以前很多时候会开玩笑,说什么,三天学会PHP,七天精通Nodejs,xx天学会xx ... 一般来说,这样子说的多半都带有一点讽刺的意味,我也基本上从不相信什么快速入门.我以前在学校的时候自觉过很多门 ...
- 一张图让你看清Java集合类(Java集合类的总结)
如今关于Java集合类的文章非常多,可是我近期看到一个非常有意思图片,基本上把Java集合的整体框架都给展现出来了.非常直观. watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
- Java集合详解8:Java集合类细节精讲
今天我们来探索一下Java集合类中的一些技术细节.主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充.可能不全面,还请谅解. 本文参考:http://cmsblogs.com/?cat=5 具体 ...
- 《java从入门到精通》学习记录
目录 <Java从入门到精通>学习记录 3 基础的基础部分: 3 一. 常量与变量 3 1. 掌握: 3 (1) .常量与变量的声明方式: 3 (2) .变量的命名规则: 3 (3) .变 ...
- 好看的java集合类图
http://blog.csdn.net/iamzp2008/article/details/38151971?utm_source=tuicool&utm_medium=referral 现 ...
- java集合类学习心得
java集合类学习心得 看了java从入门到精通的第十章,做个总结,图片均取自网络. 常用集合的继承关系 Linked 改快读慢 Array 读快改慢 Hash 两都之间 Collection是集合接 ...
- 史上最强Java NIO入门:担心从入门到放弃的,请读这篇!
本文原题“<NIO 入门>,作者为“Gregory M. Travis”,他是<JDK 1.4 Tutorial>等书籍的作者. 1.引言 Java NIO是Java 1.4版 ...
- Java集合类--温习笔记
最近面试发现自己的知识框架有好多问题.明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题.不管了,再巩固下基础知识总是没错的,反正最近空闲时间 ...
随机推荐
- sublime无法使用package Control解决办法。
http://blog.csdn.net/freshlover/article/details/44261229
- js读取json包装的map集合
后台 Map<String,Integer> map = new HashMap<>(); map.put("你好1", 1); map.put(" ...
- iPhone缓存网络数据
本文转载至 http://blog.csdn.net/wwang196988/article/details/7542918 在iPhone应用程序中,我们经常要用去网络下载一些文件,比如xml, ...
- Windows7 配置两个版本的java环境,可自由切换
1. 准备工作 下载jdk: jdk1.7[http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads ...
- 爬虫入门【7】Python-文件的读写和JSON
文本文档的读写 最重要的open()方法将返回一个file对象,经常使用的两个参数为open(filename,mode) 其中,filename为file保存的地址,可以是本地地址,相对地址或者绝对 ...
- 【python】-- RabbitMQ RPC模型
RabbitMQ RPC模型 RPC(remote procedure call)模型说通俗一点就是客户端发一个请求给远程服务端,让它去执行,然后服务端端再把执行的结果再返回给客户端. 1.服务端 i ...
- 洛谷 P3216 [HNOI2011]数学作业
最近学了矩阵,kzj大佬推荐了我这一道题目. 乍一眼看上去,没看出是矩阵,就随便打了一个暴力,30分. 然后仔细分析了一波,发现蛮简单的. 结果全wa了,先看看下面的错误分析吧! 首先,设f[n]为最 ...
- python __name__及__main()__的妙处
#hello.py def sayHello(): str="hello" print(str); if __name__ == "__main__": pri ...
- 打开或者 关闭 php 的错误报告
一般线上的环境,我会 php的报错信息屏蔽掉,php.ini 设置的办法 如下: display_errors = Off error_reporting = E_ALL 在代码中,可以这样~~: e ...
- CentOS iSCSI服务器搭建------LUN篇
先上服务器信息(你懂得) [root@node ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@node ~]# uname ...