Java易错点4

简介: 异常处理和HashSet使用过程中,有哪些注意的问题呢?在异常处理中return先执行还是finally?

Java易错点3

如有理解错误的话,恳请大家指正!!!

异常处理

异常处理三大关键字try、catch、finally。try模块里的return是先于finally执行,还是finally执行完了再return呢?

示例代码

package com.wangscaler;

public class TestException {
    public static int a = 1;

    public static void main(String[] args) {
        int b = test();
        System.out.println(b);
        System.out.println(a);
    }

    public static int test() {
        try {
            return a;
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            ++a;
        }
        return 999999;
    }
}

执行结果

1
2

总结

return a;执行之前,会将a的值存放在局部变量里,然后执行finally,虽然finally执行完a的值已经是2,但是return是返回的却是在finally执行之前保存的变量的值,如果你在finally中使用return,就会覆盖之前的值,所以在finally中避免使用return。除了return,break、continue等也不应该被使用。

Hash

  • HashMap:

    • 实现了Map接口
    • 存储键值对
    • 根据键值对计算出hashCode值存储数据。
    • 访问速度快。
    • 允许一条记录的键为null,允许多条记录的值为null。
    • 非线程安全的,即任一时刻有多个线程同时写 HashMap ,可能会导致数据不一致。如果要满足线程安全,可以使用 Collections 的 SynchronizedMap 方法 或者使用 ConcurrentHashMap。
    • key相同的value会被替换。
    • 不能保留排列次序
  • HashSet

    • 实现了Set接口
    • 存储对象
    • 根据对象的成员计算hashCode值,两个对象的hashCode值可能相同。
    • 比HashMap访问效率慢
    • 不允许集合中有重复的值
  • HashTable

    • HashTable 是遗留类,与 HashMap 类似,不同的是它继承 Dictionary。
    • 线程安全的,任一时刻只能有一个线程写 HashTable。
    • 不可以接受null键和值。
  • LinkedHashMap

    • HashMap 的一个子类,保存了记录的插入顺序
  • TreeMap

    • 实现了 SortedMap 接口,根据键(key)排序,默认是按照键值的升序排序,也可以指定排序的比较器。

​ HashMap的Key调用hashCode()方法,使用hashCode作为哈希表的索引,如果当前内容不为空,则根据equals方法,找到key相同的Entry数组,将Value替换成新的;如果未找到Key相同的,则将当前位置的链表后移,将新的Entry数组放入链表头;如果当前内容为空,则将Key和Value封装成Entry数组,放入。

​ HashSet添加元素,先调用元素的hashCode方法得到元素的哈希值,通过该哈希值获取元素在哈希表的位置,如果该位置没有元素直接写入;如果已经有了,则通过equals方法比较元素值,如果相同,则不允许添加;如果不相同则允许添加。

推荐文章-->HashMap源码

示例代码

people对象

package com.wangscaler;

import java.util.Objects;

public class People {
    private int age;

    private String name;

    public People(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public People() {
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String word = "people";

    @Override
    public String toString() {
        return "People{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public static void eat() {
        System.out.println("吃饭");
    }


    public void sleep() {
        System.out.println("睡觉");
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof People) {
            People people = (People) obj;
            return Objects.equals(this.age, people.age) && Objects.equals(this.name, people.name);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }

}

main函数

package com.wangscaler;

import java.util.HashSet;

public class TestHash {
    public static void main(String[] args) {
        HashSet<People> peoples = new HashSet<>();
        People people = new People(18, "wang");
        peoples.add(people);
        System.out.println("当前的hashcode值为:" + people.hashCode());
        people.setName("wangscaler");
        System.out.println("修改之后的hashcode值为:" + people.hashCode());
        System.out.println(peoples.contains(people));
        peoples.remove(people);
        System.out.println(people.getName());
        System.out.println(people.getAge());
        for (People p : peoples
        ) {
            System.out.println(p.hashCode());
            System.out.println(p.getAge());
            System.out.println(p.getName());
        }

    }
}

执行结果

当前的hashcode值为:3643378
修改之后的hashcode值为:1901259290
false
wangscaler
18
1901259290
18
wangscaler

总结

当对象存入Hash之后,如果修改了hashcode会导致无法在集合中找到该对象,所以导致无法删除,最终会导致内存泄漏。

目录
相关文章
|
1月前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
23 5
|
1月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
50 4
|
存储 安全 Java
【Java考试】易错知识点,期末考试踩坑题
Java期末考试各种易错知识
199 0
|
算法 安全 NoSQL
Java新人易错:当修改遇到唯一(万字长文)
Java新人易错:当修改遇到唯一(万字长文)
|
存储 安全 Oracle
「终!」 ☕【Java原理探索】带你进入String类的易错点和底层本质分析!
「终!」 ☕【Java原理探索】带你进入String类的易错点和底层本质分析!
100 0
「终!」 ☕【Java原理探索】带你进入String类的易错点和底层本质分析!
|
Java 数据安全/隐私保护
Java易错点3
数据类型转换会产生精度损失,在程序中应避免隐式类型转换。类的重写隐藏遮掩遮蔽,你都了解吗?快来和我一起学习吧
127 2
Java易错点3
|
存储 Java 程序员
Java易错点1
java中那些让人理解错误的概念,本次多篇发布,欢迎大家指正。本篇介绍数组对象在栈内存和堆内存的存在方式。
110 1
Java易错点1
|
存储 Java
Java易错点
Integer对象在超出-127和128之后,堆内存地址不一样?什么时候覆盖?什么时候遮蔽?什么时候遮掩?
99 0
Java易错点
(JAVA):“值拷贝”和“引用赋值”易错易混的地方。
(JAVA):“值拷贝”和“引用赋值”易错易混的地方。
(JAVA):“值拷贝”和“引用赋值”易错易混的地方。
|
人工智能 算法 Java
【经验总结】Java在ACM算法竞赛编程中易错点
一、Java之ACM易错点   1. 类名称必须采用public class Main方式命名   2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错误,所以在我看来好多OJ系统做的是非常之垃圾   3.
1230 0