0.前言
上一篇文章,我们讲解了ArrayList的相关用法
看本文之前,推荐先去看一遍该文章今天我们主要讲解Set中的HashSet与HashMap
若想要了解“类”等其他主要知识,可以去看前面的文章
- 由于最终目的是要开发安卓app,
因此这里使用的IDE是AS(Android Studio)
(不会使用的可以参考下面这篇文章中的例子)
《[Java]开发安卓,你得掌握的Java知识2》
1.本文主要内容简介
HashSet与HashMap的用法与细节
关于Lambda表达式的一些用法
2.基础知识讲解
2.1Set与HashSet
Set就是数学里面的集合,它是无序的
Hash就是常说的哈希函数,与ArrayList中的按顺序的索引值不同,HashXXX是通过哈希算法来计算出一个索引值,然后把对象放到索引值
基本特征:
插入之后,对象在元素中的顺序与插入顺序并不相同,且会自动按照默认排序方法排序(如a,b,c或1,2,3)
Set是无序的,它无法像List一样,访问第n个元素,
只能通过遍历的方式去访问元素Set里对象不能重复
基本定义、使用方式如下:
Set<Integer> set = new HashSet
set.add(2);
set.add(1);
set.add(3);
System.out.println(set);
输出结果为:
[1, 2, 3]
遍历Set的方式:
方法1:用Iterator迭代器进行遍历
- 遍历Set才能访问到存入Set中的各个对象
Set<Integer> set = new HashSet
set.add(2);
set.add(1);
set.add(3);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
int temp = (int)iterator.next();
temp--;
System.out.print(temp+" ");
}
输出结果为:
[1, 2, 3]
0 1 2
- 方法2:用foreach循环进行遍历
Set<Integer> set = new HashSet
set.add(2);
set.add(1);
set.add(3);
for (Integer integerTemp : set5) {
integerTemp--;
System.out.print(integerTemp+" ");
}
输出结果为:
[1, 2, 3]
0 1 2
- 要注意的是,两种遍历方式,最后都没有改变Set中的值
2.2Map与HashMap
Map 是一种键-值对(key-value)集合
与List和Set不同,Map需要给出两个泛型,
分别对应key和value基本特征:
讲对象插入Map之后,对象在元素中的顺序与插入顺序并不相同,也没有一个指定的顺序
Map也无法像List一样,访问第n个元素,除了通过遍历的方式去访问元素,主要可以通过键值来找到对应的value
Set中是对象不能重复,而Map中是键值(key)不能重复,如果前后放入的对象的键值相同,则会将该键值对应的value进行替换
- 基本的定义、使用方法:
(1)HashMap较为常用,是Map(接口)的一个子类
(2)Map后面的<>需要填写两个泛型,
第一个为键值key,第二个为键值对应的value- 与List、Set使用add()函数将对象放入不同,
Map中使用的是put(key,value);方法
具体代码:
Map<String,Integer> map = new HashMap<>();
map.put("Chinese",90);
map.put("English",99);
map.put("France",80);
map.put("France",81);
System.out.println(map);
输出结果为:
[English=99, Chinese=90, France=81]
- 可见,最后put()方法中有两个France,但是最后只输出了一个,它的值是81,说明:
由于键值相同,其对应的值被替换,而不会产生新的对象
HashMap的重要方法 | 具体作用 |
---|---|
get(key) | 通过键值获得对应的value |
keySet() | 获得所有的key,返回值为Set |
values() | 获得所有value,返回值为Set |
entrySet() | 获得所有Entry,返回值为Set |
- Entry就是一个键值对
遍历Map的方式:
- 方法1:通过遍历key来得到每一个key对应的值
要用到keySet()方法获得所有key
Map<String,Integer> map = new HashMap<>();
map.put("Chinese",90);
map.put("English",99);
map.put("France",80);
map.put("France",81);
for(String key : map.keySet()){
Integer temp = map.get(key);
System.out.println(temp);
}
输出结果为:
[99, 90, 81]
- 方法2:通过EntrySet来遍历
Set<Map.Entry<String, Integer>> set = map.entrySet();
for (Map.Entry<String, Integer> entry : set) {
//获取Entry对应的key
String key = entry.getKey();
//获取Entry对应的值
Integer value = entry.getValue();
System.out.print(value+" ");
}
输出结果为:
99 90 81
其中要注意:
Entry<String,Integer>其实就是一个键值对
也可以当作一种类型看待String和Integer对应的就是HashMap中的两个泛型
因为是Map下面的静态变量,所以是Map.Entry<String,Integer>
2.3Exception异常处理
- 所谓异常处理,就是在遇到程序异常的时候,将其抛出(就是停止程序并告诉程序员)
- 在进行流的操作的时候,其实我们就已经遇到了Exception
- 异常的种类有很多种,我们不可能全部记住,但至少得记住:
Exception是最高的父类,所有异常都继承于这个类
IOException专门负责输入输出方面的异常
try/catch语句
- 它可以负责处理特定位置的异常
try{
Reader r = new FileReader("ddd")
}catch(IOException e){
e.printStackTrace();
}
-
注意:
(1)catch后面还可以跟多个catch,但是会和难看,不推荐
(2)catch最后可以加一个finally{},表示无论是否抛出异常,最后都会执行
(3)try的{ }中一旦遇到异常,后面的语句就不会执行
throws
- 它throws是加在函数头中的函数名后面的
它可以抛出函数体中的所有可能的异常- 使用这种方式可以避免使用try/catch导致代码冗杂
public static void test() throws IOException{
Reader r = new FileReader("ddd");
}
- 注意:
如果是在函数体中调用其他函数时,需要抛出异常的话,
最好使用try/catch
其他情况下建议使用throws
3.总结
(1)本文讲解了Collection中常用的三种集合中的后两种,Set和Map。其中,HashMap值得大家多多关注,因为在缺少指针的Java中,当需要返回多个值的时候,就可以考虑用HashMap
(2)Exception其实概念很简单,也不需要过分注意,不过在公司中,自定义异常似乎较为常见,理由是系统自带的异常的显示不够清晰
(3)无论是Set、Map还是Exception,都需要大家多多练习,通过实战来理解它们的用法。单纯的为用而用其实意义不大。