Java学习笔记(尚硅谷,集合)

集合框架

|-- Collection 接口
	|-- List 接口
		|-- ArrayList
		|-- LinkedList
		|-- Vector
	|-- Set 接口
		|-- HashSet
			|-- LinkedHashSet
		|-- TreeSet
|-- Map 接口
	|-- HashMap
		|-- LinkedHashMap
	|-- SortedMap 接口
		|-- TreeMap
	|-- Hashtable
		|-- Properties

Collection 接口的常用方法

add(Object obj)// 将 obj 对象添加进当前集合
addAll(Collection coll)// 将 coll 中的所有元素添加进当前集合
size()// 返回集合中元素个数
clear()// 清空集合中所有元素
isEmpty()// 判断当前集合是否为空(是否有元素)
contains(Object obj)// 调用 equals() 判断当前集合中是否存在 obj 对象
containsAll(Collection coll)// 判断形参 coll 中的所有元素是否都在当前集合中
remove(Object obj)// 删除集合中 obj 对象,返回类型 Boolean,true 代表删除成功,反之代表删除失败
// ^如果有多个相同的 obj 对象,则只会删除集合中第一个 obj 对象。
// ^实际上是通过 equals() 方法比较 2 元素是否相等的。
removeAll(Collection coll)// 删除形参 coll 与当前集合所有相同的元素
retainAll(Collection coll)// 将当前集合所有不存在于 coll 中的元素删除
equals(Object obj)// 当 obj 是一个集合,并且所有元素都与 obj 的元素相同时返回 true
// ^注意 List 接口下的集合还需要保证顺序相同
hashCode()// 返回当前集合的哈希值
toArray()// 将当前集合转换成数组
iterator()// 返回 Iterator 接口的实例,用于遍历集合元素

注意当一个集合存在相同元素时某些方法的调用
注意点:Arrays.asList()

// 实际 list 只有一个元素,在这直接将数组看成一个对象
List list = Arrays.asList(new int[] {123, 456});
// 而此时 list2 有两个 Integer 对象
List list2 = Arrays.asList(new Integer[] {123, 456});

forEach 方法

arrayList.forEach(System.out::println);

迭代器

遍历

Iterator iterator = coll.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

删除集合元素

iterator.remove();

注意:当创建一个迭代器时,迭代器指向的是集合的 “前一个元素”

foreach 遍历

for (Object obj : coll) {}

List 接口

ArrayList

List 接口的主要实现类,线程不安全,故效率高,底层使用 Object[] elementData 存储

LinkedList

底层使用双向链表,故插入删除效率高

Vector

线程安全,故效率低,底层使用 Object[] elementData 存储

List 接口中的常用方法

void add(int index, Object obj)// 在 index 位置插入元素 obj
boolean addAll(int index, Collections eles)// 从 index 位置开始将 eles 中的所有元素添加进来
Object get(int index)// 获取指定 index 位置的对象
int indexOf(Object obj)// 返回 obj 在集合中首次出现的位置,没有返回 -1
int lastIndexOf(Object obj)// 返回 obj 在集合中最后一次出现的位置,没有返回 -1
Object remove(int index)// 移除指定 index 位置的元素,并返回此元素
Object set(int index, Object ele)// 设置指定 index 位置的元素 ele
List subList(int fromIndex, int toIndex)// 返回从 fromIndex 到 toIndex 位置的左闭右开区间

Set 接口

HashSet

Set 接口的主要实现类,线程不安全,可以存储 null 值(一般会重写 hashcode 方法和 equals 方法)

LinkedHashSet

HashSet 的子类:遍历其内部数据时,可以按照添加的顺序遍历

TreeSet

放入的数据必须同一类的对象,可以按照添加对象的指定属性进行排序,底层用红黑树实现
自然排序:对象需要实现 Comparable 接口并实现 compareTo 方法
定制排序

Comparator cmp = new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
        return 0;
    }
};
Set set = new TreeSet(cmp);

添加元素的过程:以HashSet为例:

我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值, 此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:

  • 如果此位置上没有其他元素,则元素a添加成功。 —>情况1

  • 如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值:
    ----如果hash值不相同,则元素a添加成功。—>情况2
    ----如果hash值相同,进而需要调用元素a所在类的equals()方法:
    -------- equals()返回true,元素a添加失败
    --------equals()返回false,则元素a添加成功。—>情况3

  • 对于添加成功的情况2和情况3而言:元素a 与已经存在指定索引位置上数据以链表的方式存储。
    jdk 7 :元素a放到数组中,指向原来的元素。
    jdk 8 :原来的元素在数组中,指向元素a
    总结:七上八下
    HashSet底层:数组+链表的结构。

Map 接口

Map 接口的常用方法

// 添加、删除、修改操作:
Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
void putAll(Map m):将m中的所有key-value对存放到当前map中
Object remove(Object key):移除指定key的key-value对,并返回value
void clear():清空当前map中的所有数据
// 元素查询的操作:
Object get(Object key):获取指定key对应的value
boolean containsKey(Object key):是否包含指定的key
boolean containsValue(Object value):是否包含指定的value
int size():返回map中key-value对的个数
boolean isEmpty():判断当前map是否为空
boolean equals(Object obj):判断当前map和参数对象obj是否相等
// 元视图操作的方法:
Set keySet():返回所有key构成的Set集合
Collection values():返回所有value构成的Collection集合
Set entrySet():返回所有key-value对构成的Set集合

HashMap

作为 Map 接口的主要实现类。线程不安全,效率高。key 和 value 可以为 null。

LinkedHashMap

HashMap 的子类:遍历其内部数据时,可以按照添加的顺序遍历

TreeMap

放入的数据必须同一类的对象,可以按照添加对象的指定属性进行排序,底层用红黑树实现
自然排序:对象需要实现 Comparable 接口并实现 compareTo 方法
定制排序

Comparator cmp = new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
        return 0;
    }
};
Map map = new TreeMap(cmp);

Hashtable

作为古老的实现类。线程安全,效率低。key 和 value 不可以为 null。

Properties

Hashtable 的子类。常用来处理配置文件。key 和 value 都是 String 类型。

Map 的遍历

Set set = map.entrySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
    Map.Entry entry = (Map.Entry) iterator.next();
    System.out.println(entry.getKey() + "----" + entry.getValue());
}

set = map.keySet();
for (Object obj : set) {
    System.out.println(obj + " " + map.get(obj));
}

Conllections 工具类

在这里插入图片描述
在这里插入图片描述
注意,copy 方法要求 dest.size() 大于等于 src.size()

int srcSize = src.size();
if (srcSize > dest.size())
	throw new IndexOutOfBoundsException("Source does not fit in dest");

因此可以使用这种方式创建 dest

List list1 = Arrays.asList(new Object[list.size()]);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值