Java学习笔记-全栈-Java基础-08-容器中的重点

2021-08-18 15:21:13 浏览数 (1)

泛型
代码语言:javascript复制
泛型使遍历时不需要强制转换,帮助建立类型安全的集合。
通过remove理解“引用”

Collections类都有个remove方法:将对象从容器中移除。 但并非删除该对象,移除之后,该对象依旧还在。因为容器存放的时该对象的引用地址,移除的只是地址,实际上对象本身还在内存中。

“除了基本类型,都是引用数据类型,引用数据类型只是引用地址,而非该对象本身”

总结
1.Collection接口:
  • 1.List的元素有顺序,可重复,包括:
    • a)ArrayList:查询效率高,增删效率低,线程不安全
    • b)LinkedList:查询效率低,增删效率高,线程不安全
    • c)Vector:ArrayList的线程安全版,效率低
  • 2.Set的元素无顺序,不可重复,包括:
    • a)HashSet:查询、增删效率高
    • b)TreeSet:用TreeMap的Key实现的,内部需要对存储的元素进行排序,因此,对应的类需要实现Comparable接口(编写比较逻辑),这样才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。
2. Map
  • Map,key-value,key不可重复,value可以,包括
    • a)HashMap:最常用,效率最高
    • b)TreeMap:自动按照key升序排列
3. 操作
  • 使用Iterator遍历容器
  • 类 java.util.Collections 提供了对Set、List、Map操作的方法(排序,填充,查找,打乱等)
重写equals、hashCode方法(重点)
  • 如下情况,(可能)需要重写equals/hashCode
    • a)要将自定义的对象放入HashSet中处理
    • b)要将自定义的对象作为HashMap的key
    • c)将自定义对象放入容器中后,可能会调用remove、contains时(实际上使用集合装对象的时候,约定需要重写这两个方法)

原因:

上述三个情况都隐式的涉及到了“对象比较

  • ab中:HashSetHashMap的key都是惟一的(所以内部实现就应该存在比较),若放入自定义对象,可能会出现“应该相同的对象但不相同”的情况,比如自定义对象id=1的有两个(实际业务我们需要他们相同),但他们在HashSet和HashMap的key中并不相同,因此需要重写equals(id相等就判断相等)和HashCode(将hash的对象都设置为ID即可保证他们HashCode一致)。
  • c中:remove和contains都涉及到对象的识别(即比较),因此需要重写equals才能识别。
  • 默认的equals比较的是对象内存地址,hashCode求的是对象内存地址转换成的数,实际也是内存地址。

0 人点赞