Java学习笔记-全栈-Java基础-08-容器中的重点
程序员文章站
2022-06-19 21:17:17
...
泛型
泛型使遍历时不需要强制转换,帮助建立类型安全的集合。
通过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时(实际上使用集合装对象的时候,约定需要重写这两个方法)
原因:
上述三个情况都隐式的涉及到了“对象比较”
-
a\b中:HashSet\HashMap的key都是惟一的(所以内部实现就应该存在比较),若放入自定义对象,可能会出现“应该相同的对象但不相同”的情况,比如自定义对象id=1的有两个(实际业务我们需要他们相同),但他们在HashSet和HashMap的key中并不相同,因此需要重写equals(id相等就判断相等)和HashCode(将hash的对象都设置为ID即可保证他们HashCode一致)。
-
c中:remove和contains都涉及到对象的识别(即比较),因此需要重写equals才能识别。
-
默认的equals比较的是对象内存地址,hashCode求的是对象内存地址转换成的数,实际也是内存地址。