java----集合

《简介》

 

 《Collection》

 

 首先:Collection是个接口类,其身上有许多方法都是由其子类实现

注意:该 contains() 方法内部其实使用 equals() 方法来查找元素。如果指定的元素与数组中的元素有匹配到,则该方法返回 true。

 《ArrayList》

import java.util.ArrayList;

ArrayList类有点像封装过后的结构体,可以接受各种类型的数据

 《迭代器》

 

 在Iterable这个接口上有一个重要的方法:

 

 

import java.util.Iterator;

 


 

 

 《增强for循环》

底层增强for循环就是调用iterator来实现的

 《List接口》

注意:这并不是说可以像数组一样( ArrayList arr)arr[1],这样用下标直接访问,还是要用迭代器来访问

或者用方法arr.get(1),可以返回下标为1的元素

改变某一下标的元素用 arr.set(index,elememt);

 

 

 

 以下是List独有的重写了的方法:

 

 《ArrayList》

 

 《ArrayList的扩容机制》

 在 ArrayList arr = new ArrayList(N); 这里是可以写数的,即指定初始化数组大小

《Vector》

 

 《LinkedList》

链表(双向)

 操作API与上面相同

《Set》

 

 

 

 

 

 《HashSet》

import java.util.HashSet;

 

 

 

 《HashSet底层分析》

 

所以在添加时有如下:

 在String中,其hashCode方法得到了重写,是只将其value(字符串)来进行hash,如果字符串内容相同,那么hashCode的值也相同

 所以我们可以重写hashCode和equals方法来使得HashSet能否能放进去:

 1 package com.collection;
 2 
 3 import java.util.HashSet;
 4 import java.util.Objects;
 5 
 6 public class SetHomeWork {
 7     public static void main(String[] args) {
 8         HashSet hset = new HashSet();
 9         hset.add(new Dog("tom", 18));
10         hset.add(new Dog("tom", 18));
11     }
12 
13     static class Dog {
14         String name;
15         int age;
16 
17         public Dog(String name, int age) {
18             this.name = name;
19             this.age = age;
20         }
21 
22         @Override
23         public boolean equals(Object obj) {
24             if (this == obj) return true;
25             if (obj instanceof Dog) {
26                 Dog t = (Dog) obj;
27                 if (this.name.equals(t.name) && this.age == this.age)
28                     return true;
29                 else return false;
30             } else return false;
31         }
32 
33         @Override
34         public int hashCode() {
35             return Objects.hash(name, age);
36         }
37     }
38 }

《练习题》

 

 

 

 总结:没事不要乱改已经加入Set的值,会出BUG,

重写hashCode方法是为了计算出加入位置,然后加入用的

重写equals方法是为了如果hash冲突,看一下是否相同,决定是否加入

《LinkHashSet》

 《TreeSet》

TreeSet的底层是TreeMap

 底层比较:

 我们在new TreeSet时,可以在其中传入比较匿名内部类,通过这个的比较规则,如果相同就不加进去(TreeSet没有重复元素的原因)

 否则在tset.add();加入元素时就按照这个规则顺序加入

 《练习题》

没有指定匿名内部类,底层无法比较会抛出异常

《Map》

 《Map常用方法》

 

 

 《Map遍历方式(以HashMap为例)》

 

 

 

在Map类中一个包含 指向Key和对应Value的集合 为Entry,在MapSet中其运行类型是MapSet$Node,

而这些Entry的集合为EntrySet,在Entry这个类型中有获得Key和Value的方法,所以要转型

 

 《HashTable》

 

 

 《Properties》

 

 《Collections工具类》

 

 注意:首先不要将他与Collection这个接口弄混淆了,Collections是一个类

 使用方法:Collections.reverse(arr);等

《总结》

 注意:Collections工具类提供的sort, reverse等位置改变的方法是只能List类传进去的,而Set类不行

所以用HashSet注定是无序的,但是用TreeSet可以是有序的

《栈和队列》

根据网上的说法:Stack被弃用了,一般都是可以用队列Queue去模拟栈

那就来说说队列吧:

 

 

 

 但是单纯的队列一般更多人喜欢用LinkedList去模拟实现

 

 常用方法:

 

posted @ 2022-07-24 12:08  次林梦叶  阅读(38)  评论(0)    收藏  举报