黑马程序员05 集合 和hashmap引发的内存泄露Annotation(注释)

本文深入探讨Java集合框架中的HashMap和HashSet,特别是它们可能导致的内存泄露问题,强调对象的hashCode()和equals()方法的重要性。同时,介绍了Java的注解(Annotation)功能,包括基本的Override、Deprecated和SuppressWarnings注解,并讲解了自定义注解及其元注解的使用。
摘要由CSDN通过智能技术生成

---------------------- android培训java培训、期待与您交流!----------------------


集合

    1.什么是集合

        集合是一种容器, 可以用来存储对象, 和数组类似, 但最大的区别在于长度可变.

    2.什么是List

        List是集合中的一种, 元素可重复, 有存储顺序.

        List接口下的所有子类都是可重复且有序的, 我们主要使用三种: ArrayList, LinkedList, Vector

    3.List常用方法

        添加对象到最后:

        添加对象到指定位置:

        通过索引删除:

        通过对象删除:

        设置指定位置上的元素:

        获取指定位置上的元素:

        将一个集合中的所有元素添加到另一个集合:

        获取集合的大小:

        清空集合:

    4.List的迭代

所有的list都可以用一下三种方式进行迭代

privatestatic void demo2() {

       List list = new ArrayList();

       list.add(new Person("张三",24));

       list.add(new Person("王五",25));

       list.add(new Person("李四",26));

       //for循环

       for(int i=0;i<list.size();i++){

              System.out.println(list.get(i));

       }

       //增强for循环

       for(Object obj  :list){

              System.out.println(obj);

       }

 

       //迭代器

       Iterator it = list.iterator();

       while(it.hasNext()){

              System.out.println(it.next());

       }

Set集合

     1.什么是Set集合

         Set集合和List集合类似, 都是可以用来存储对象,长度可变.

         Set集合和List不同的是: 没有重复元素, 没有存储顺序.

     2.Set集合的常用方法

         添加元素:boolean add(E e)

         删除元素:boolean remove(E e)

         获取长度:int size();

         获取迭代器:iterator

         判断是否包含:boolean contains

         将另一个集合中的全部添加:addAll

         转换成数组:toArray(T[] a)

     3.HashSet

         HashSet是Set的一个实现类, 它可以做到去重复,效率非常高.

         当我们需要把多个对象去重复的时候, 就可以使用HashSet.

         存储原理:

              使用HashSet存储对象的时候, 会先调用对象的hashCode()方法, 计算一个哈希值.

              查找集合中是否有哈希值相同的对象

                   如果没有就直接存入

                   如果有哈希值相同的对象, 和相同的对象逐个进行equals比较

                       如果比较结果全部为false就存入

                       如果比较结果包含true就不存

         用HashSet存储自定义对象:

              对象需要重写hashCode()和equals()方法

              hashCode方法要保证属性相同, 返回值相同, 属性不同尽量不同.

              equals方法要确保属性相同的返回true, 不同的返回false.

:HashSet采用哈希值算法存取对象的集合,内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域,Object类中定义一个hashCode()方法来返回每个java对象的哈希码,当从hashset集合查找某个对象时,java系统首先调用对象的hashcode方法获取该对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域的的每个元素对该对象进行equals方法比较,如此就不需要遍历集合中的所有元素,

还可以防止内存泄露,如果两个对象equals相等

如果一个对象被存入hashset集合中,就不要删除其参与运算的哈希值字段,因为修改后的哈希值跟最初的哈希值就不同了,要删除原来的对象在另外一个区了,就找不到,没法删掉,出现了内存泄露。

 

     4.LinkedHashSet

         是HashSet的子类, 实现原理相同, 但可以保留存储顺序.

     5.TreeSet

         TreeSet是Set的一个实现类, 可以去掉重复元素,可以指定顺序. 按照指定的比较方式比较出元素的大小, 以二叉树形式进行存储.

         自然顺序:

              TreeSet默认按照compareTo方法中的顺序来排序.

             compareTo是Comparable接口中的抽象方法, 如果想将自定义类的对象装入TreeSet排序, 那么就需要在类上实现Comparable, 重写compareTo方法

              compareTo方法返回一个int值, TreeSet在存储对象的时候就会调用compareTo方法, 根据int值构建二叉树.

              返回的int值如果是负数就代表小于, 正数代表大于, 0代表相等.

         比较器顺序:

              在创建TreeSet的时候, 可以在构造函数中传入一个Comparator接口的实现类.

              传入Comparator之后, 再向TreeSet中添加元素时, 就会调用Comparator中的compare方法来比较了.


 

Map集合

     1.什么是Map集合

         Map集合可以存储键值对, 在存储的时候存一个键对象和一个值对象.

         集合中的键是唯一的, 可以根据键获取值.

     2.Map集合常用方法

         添加记录:  V put(K key, V value)

         删除记录:  V remove(Object key)

         根据键获取值:  V get(Object key)

         获取长度:  int size()

         判断是否包含某个键: boolean containsKey(Object key)

         判断是否包含某个值: boolean containsValue(Object value)

         获取所有键组成的集合: Set<K> keySet()

         获取所有键值对组成的集合: Set<Map.Entry<K,V>> entrySet()

     3.迭代方式

         a.keySet:

代码演示:private static void iter1(Map<Person,Integer> map) {

     // 获取Map中的所有键对象组成的Set集合

         Set<Person>keySet = map.keySet();                              

         // 迭代Set集合获取每一个键对象

for(Person key : keySet)  

// 通过键对象获取值

System.out.println(key+ " = " + map.get(key));   

              }

 

         b.entrySet:

private static void iter2(Map<Person, Integer>map) {

         // 获取Map中所有Entry(键值对)对象组成的Set集合

         Set<Entry<Person,Integer>> entrySet =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值