Set-Map
HashSet类和LinkedList类以及TreeSet类都是属于Set集合里面的
Set集合都是无序的(存储数据和取出数据不同,相同只是偶然),元素是唯一的,不能重复
实现类
HashSet
HashSet和TreeSet差不多,而且list里面的方法在Set里面都可以使用,可以参考上一篇,这里就不重复了,例如这里都可add,也可使用lambda表达式
HashSet<String>names =new HashSet<>();
names.add("jack");
names.add("merry");
names.add("abc");
names.removeIf(ele->{
return ele.compareTo("c")>0;
});
TreeSet
它是可以排序的集合
例如我们要有一个人的集合,对年龄排序,就可以用到TreeSet,但是会用到comepareTo的方法,注意
使用的对象必须实现Comparable接口的compareTo方法
在compareTo里面实现具体如何比较
具体代码实现
class Person implements Comparable {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Object o) {
if (o instanceof Person) {
Person o1 = (Person) o;
//自己规定比较的策略
if (this.age != o1.age) {
return this.age - o1.age;
} else {
//年龄相同的情况下 再比姓名的字母
return this.name.compareTo(o1.name);
}
} else {
return -1;
}
}
}
下面的就是在main函数里面实现
TreeSet<Person>score =new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person person, Person t1) {
return person.compareTo(t1);
}
});
Person p1=new Person("jack",20);
Person p2=new Person("jack",30);
Person p3=new Person("rose",20);
score.add(p1);
score.add(p2);
score.add(p3);
System.out.println(score);
HashSet里面还有一个HashMap
HashMap里面就是一个集合,不过是通过键key-值value存储数据
下面的代码中我标注了如何使用
HashMap<String, Integer> score = new HashMap<>();
//添加对象
score.put("Chinese", 89);
score.put("Math", 94);
score.put("English", 92);
score.size();
//或取所有的key
System.out.println(score.keySet());
//获取所有的value
System.out.println(score.values());
//获取Entry:key-value
System.out.println(score.entrySet());
//获取一个键key对应的值
System.out.println(score.get("English"));
键值对的遍历
1.通过遍历key来得到每一个key对应的值
for (String key : score.keySet()) {
//通过key得到值
int s = score.get(key);
System.out.println("key" + key + "value:" + s);
}
- 通过EntrySet 得到Entry对象的集合 一个Entry管理一个键值对 getkey getvalue
Set<Map.Entry<String, Integer>> entrys = score.entrySet();
for (Map.Entry entry : entrys) {
//得到Entry对应的key
String key = (String) entry.getKey();
//获取Entry对应的值
Integer value = (Integer) entry.getValue();
System.out.println("key:" + key + " value:" + value);
}
异常处理
异常处理 处理运行过程中出现的不可控的错误 使程序更健壮
Exception
try{
执行的代码
可能出现异常
- 一旦出现异常 系统自动为我们创建一个异常对象 并抛出
}catch(NullPointerException e){
如果需要自己处理异常就catch
}catch(IOEException e){
如果有多个异常 可以使用多个catch来捕获
如果有多个异常 catch的顺序是从小到大
}finally{
不管有没有异常Finally都会被执行
处理资源回收 网络连接 数据库连接 I/O流
}
public class Exception1 {
public static void main(String[] args) {
FileReader fr = null;
int a = 0;
int b = 0;
try {
int c = b / a;
fr = new FileReader("");
} catch (ArithmeticException e) {
System.out.println(e.getMessage());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
fr.close();
} catch (IOException i) {
}
}
如果异常出现 后面的代码将不会执行
- try代码块 不要抓太多代码
- 使用throws抛出异常 经外部处理
- 当特殊情况出现了 自己可以选择抛出异常
- throw
- throw new IllegalAccessException()
*当然也可以自定义异常类
class TException{
public static void test() throws FileNotFoundException,NullPointerException{
FileReader fr=new FileReader("");
}
public static void test2() throws IllegalAccessException{
//......
if (2 > 1){
throw new IllegalAccessException();
}
}
public static void test3() throws hmlException{
throw new hmlException("无所作为");
}
}
class hmlException extends Exception{
//1.提供一个无参构造方法
public hmlException(){
}
//2.提供一个有参构造方法 参数是一个字符串
public hmlException(String desc){
}
}
代码还是要经常看看前面的,才能融会贯通。