主要用来存储一个元素集合,Colletion接口有三个子类型,分别是List,Set和Queue.
下面是一些抽象类,类如AbsetractList。实现这些抽象类的具体类,常见的有ArrayList,
linkedList,HashSet,TableSet,以及linkedHashSet.
主要存储Key-Value pair.同Collection,但其下面的抽象类和具体类不同, 主要有HashMap,TreeMap,
HashTable.
Set——AbstractSet——HashSet
Set——SortedSet——TreeSet
List接口是一个有序的Collection,可以控制元素插入的位置,方便索引,有序的插入。检索效率高,但插入和删除会引起其他元素位置改变,效率低
Set接口是一个无序的Collection,同时不保存重复元素,检索效率低,但删除和插入效率高,不会引起其他元素位置的改变。
SortedSet继承于Set,保证有序
Map提供Key到Value的映射
SortedMap继承于Map,保持Key升序排列
Iterator<>ite = list.iterator(); while(iterator.hasNext()) System.out.println(iterator.next());遍历Map的情况有所不同
1.通过Key可以对Map进行遍历:
for (String key : map.keySet()) { System.out.println("key= "+ key + " and value= " + map.get(key)); }
2 通过对Value进行遍历,但无法访问Key值
for (String v : map.values()) { System.out.println("value= " + v); }ArrayList实现类的具体方法./
1.add(), addAll(int index, Collection c), remove(), clear(), set( , ), isEmpty. 最常用的方法, toString(),toArray(),
2.不太常用的方法
replaceAll(e->e*2) || replaceAll(e->e.toUppserCase())
Contains();
1 可以分为双向链表和单项链表
包含两个或三个部分,主要是自己节点的信息以及下一节点的地址(如果是双向链表会有上一个节点的地址)
2 实现了Deque和Queue的接口,可当作队列来使用。
常用的方法:
removeLast(); remove (int index); getFirst(); getLast();
indexOf(Object o); lastindexOf(Object o);
peek(); peekLast();
HashSet基于HashMap来实现的,不可以有重复的值,可以有Null值。HashSet中元素是无序的,同时不是线程安全的。
常用的API
contains(Obejct o); add(); remove(Object o);
HashMap是一个散列表,存储着Key和Value的映射。存储元素是无序的,不支持线程的同步。
常用的方法:
put(); get(); remove(key); clear(); isEmpty(); containsKey(or Value)();
replace(key, oldValue, Value) 可以选择带旧值或者不带。
getOrDefault(key, default);
compute(key, BiFunction)
map.compute(key, (key, value) -> value - value*10%);Java Iterator
Iterator 是一种访问集合的方法,可用于迭代ArrayList和Map等集合
1.Iterator的声明:
Iterator <> it = map.iterator();
常用的方法:
iterator.hasNext();
iterator.next();
iterator.remove();
Object 是所有类的父类。所有的子类都可以使用Object类的方法,下面详细介绍Object类的各种方法:
clone()
是一种浅拷贝,只会拷贝引用对象的地址,而不会重新分配引用对象的内存;而对应的深拷贝就会将引用对象的内存重新分配。
(类型可强制转换)obj2 = () obj1.clone();
equals()
判断两个对象的引用是否指向同一个对象,即比较2个对象的内存地址是否相等。
如果重写了equals方法,就一定要重写HashCode方法;
在Java中,对对象的存储采用了存在哈希表的处理方法,根据对象的地址转换返回的一个哈希值。
哈希表的结构:一个长度为N的数组加N个链表{
当计算出一个对象的哈希值之后,对哈希表的长度进行取余,此时不同的哈希值得到的插入数组的index可能是相同的,此时我们就应该用equals()方法进行判断,不同的话就在链表中进行插入}
两个对象的HashCode不同,则equals()方法一定返回false;
两个对象的HashCode相同,根据equals方法返回值来确定是否为true或者flase;
当我们判断两个对象的引用是否相同时,我们需要先用HashCode方法进行判断,然后再用equals方法进行判断。如果我们只重写了equals方法的话,可能会导致HashCode不同的两个对象的引用,判断得到的结果是相同的。
我们使用HashMap的目的是获取唯一映射。
如果我们将HashMap中的key值为自己写的对象,此时我们必须重写HashCode和Equals方法。如果不这样做,我们就无法实现唯一映射。
分为两个方面:
1.只重写了的HashCode而没有重写Equals
此时就要应用链表的知识,我们得到HashCode确实是相同的,但是我们还要经过equals方法进行比较,我们知道,如果不定义equals方法,默认为Object的equals方法,此时比较的是两个对象的引用,即地址。所以我们无法实现想要的功能。必须要将equals方法写为只要比较两个对象的值相同就可以。
2.只重写了的equals方法没重写hashcode
值相同的两个对象的hashCode不相同,无法实现唯一映射。
对于HashMap的查找来说,效率很高。
getClass()
object.getClass();可以返回一个对象运行时对象的类
notify()
用来唤醒一个再次对象监视器上的线程,只能被作为对象监视器的所有者来调用;
一个线程想要成为对象监视器的所有者,有三种方法:
执行对象的同步实例方法
使用 synchronized 内置锁
对于 Class 类型的对象,执行同步静态方法
wait
toString
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)