四.源码解读
一.Arrays类
1.sort()
Arrays.sort(arr)
Arrays有多个重载的sort()方法,既可以按照自然顺序排序,也可以传入比较器参数定制顺序排序
2.index binarySearch(arr,key)
3.copyOf:拷贝数组
Arrays.copyOf(srcArray,newLength)
System.arrayCopy(srcArray,0,destArray,0,length)
(1)int[] copyOf(int[] original, int newLength) //original:原数组,newLength:新数组的长度
(2)底层采用 System.arraycopy() 实现,这是一个native方法。
void arraycopy(Object src, int srcPos,Object dest, int destPos,int length); //length:拷贝的长度
4.fill(arr,val)
将数组中的元素全部替换成同一个元素
5.List asList(arr)
可以将一个数组快速的转换成List
1 String[] str = {"a","b","c"};
2 List<String> listStr = Arrays.asList(str);
注意:
(1)返回的数组的视图,所以只能查看,修改,不能增删,对list的修改,会反映到数组
(2)只能传入引用类型数组,不能传入基本类型数组
(4)已知数组数据,如何快速获取一个可进行增删改查的列表List
List<String> listStr = new ArrayList<>(Arrays.asList(str));
1 String[] str = {"a","b","c"};
2 List<String> listStr = new ArrayList<>(Arrays.asList(str));
3 listStr.add("d");
4 System.out.println(listStr.size());//4
6.Arrays.toString(arr)
返回数组内容的字符串形式,打印的时候比较有用,就不用遍历了
二.Objece类
Object类的方法有:(12种)
(1)类加载相关:getClass() 返回一个对象的运行时类
(2)需要重写:toString(),equals(o),hashCode()
(3)浅克隆:clone()
(4)垃圾回收:finalize() jvm自动调用,一般不需要程序员手动去调用
(5)多线程通信方法:wait() *3,notify() / notifyAll()
(6)registerNatives方法:在类加载的时候是会执行该方法的,通过该方法来注册本地方法。
1.equals()方法
(1)没有重写,和 == 作用一样。String类重写了equals方法,用于比较两个对象的内容是否相等
(2)一般重写equals方法,都要重写hashCode方法。hashCode方法声明相等对象必须具有相同的哈希代码(对象相等,hashCode一定相等;hashCode相等,对象不一定相等),如果equals重写了,比较的是内容是否相等,那么也要重写hashCode方法,使得内容相同的两个对象返回相同的hashCode
2.getClass方法 返回一个对象的运行时类(得到一个对象的Class对象)Class对象就叫运行时类
获取Class对象的3种方法:对象.getClass(),类名.class,Class.forName(全限定类名)
(1)该方法的作用是返回一个对象的运行时类,通过这个类对象(Class对象)我们可以获取该运行时类的相关属性和方法。也就是Java中的反射
(2)Java中还有一种这样的用法,通过 类名.class 获取这个类的类对象 ,这两种用法有什么区别呢?
结论:class 是一个类的属性(静态的),能获取该类编译时的类对象,而 getClass() 是一个类的方法,它是获取该类运行时的类对象。
3.hashCode方法 返回一个对象的哈希码
(1)在 JDK 的 Integer类,Float 类,String 类等都重写了 hashCode 方法,我们自定义对象也可以参考这些类来写。
4.toString()方法 返回一个对象的字符串表示
(1)默认返回:类名@hashCode
(2)打印对象时,默认调用 toString 方法,比如 System.out.println(person),等价于 System.out.println(person.toString())
三.Integer类
-128<=int <=127都被自动装箱到缓存中
(1)Integer的声明:public final class Integer extends Number implements Comparable<Integer>{}
不可被继承,实现了Comparable接口
(2)方法:valueOf(str),parsInt(str)
equals(i):比较包装类型是否相等要用equals方法
(3)compareTo(Integer anotherInteger)和compare(int x,int y)
compareTo()内部直接调用了compare方法,按照字典序比较大小(x<y:返回-1,x==y:返回0,x>y:返回1)
1 System.out.println(Integer.compare(1, 2));//-1 2 System.out.println(Integer.compare(1, 1));//0 3 System.out.println(Integer.compare(1, 0));//1
四.String类
五:ArrayList类
1.字段属性
(1)默认大小:10(2)Object[] elementData:存储元素的数组(3)size
2.构造方法
public ArrayList(Collection<? extends E> c) 将已有的集合复制到ArrayList集合中去
3.方法
(1)当通过 ArrayList() 构造一个空集合,初始长度是为0的,第 1 次添加元素,会创建一个长度为10的数组
(2)遍历:普通for,
迭代器iterator:如果在遍历的时候要删除元素,不能调用ArrayList的remove()方法,而是要调用迭代器的remove()方法。不能新增元素
forEach:其实是迭代器的变种
迭代器:ListIterator:相比于 Iterator 迭代器,这里的 ListIterator 多出了能向前迭代,以及能够新增元素。
六.LinkedList类
1.字段属性:size,Node first,Node last
2.遍历:for循环,迭代器
迭代器比for循环效率高
七.HashMap类
1.java中的hashCode方法就是哈希函数,可以将一个对象的地址转换成哈希码(把对象地址当成key)
2.底层实现:jdk1.7及以前:数组+链表,jdk1.8开始:数组+链表+红黑树
3.HashMap的定义:HashMap是一个哈希表,它存储的是键值对,而且 key 和 value 都可以为 null
4.字段属性
初始容量:16(必须是2的整数倍)(2)默认填充因子:0.75f
①、Node<K,V>[] table
③、loadFactor:负载因子
④、threshold:计算公式:capacity * loadFactor,阈值。过这个数目,就要resize
5.HashMap中的哈希算法:
把一个对象的hashCode进行取模运算:index=hashCode%tableSize。只不过对取模运算进行了优化:index=hashCode & (table.size-1)
两个对象相等,hashCode一定相等。hashCode相等,两个对象不一定相等
为什么重写equals方法的时候,要重写hashCode方法?
6.方法
(1)添加元素put(key,value)。如果key已经存在,则会覆盖value
(2)判断是否存在给定的 key 或者 value。 containsKey(Object key) containsValue(Object value)
(3)遍历元素:keySet(),entrySet()
遍历方法:
①、分别获取 key 集合和 value 集合。
②、获取 key 集合,然后遍历key集合,根据key分别得到相应value
③、得到 Entry 集合,然后遍历 Entry
④、迭代
基本上使用第三种方法是性能最好的,
第一种遍历方法在我们只需要 key 集合或者只需要 value 集合时使用;
第二种方法效率很低,不推荐使用;
第四种方法效率也挺好,关键是在遍历的过程中我们可以对集合中的元素进行删除。
7.总结
①、基于JDK1.8的HashMap是由数组+链表+红黑树组成,当链表长度超过 8 时会自动转换成红黑树,当红黑树节点个数小于 6 时,又会转化成链表。相对于早期版本的 JDK HashMap 实现,新增了红黑树作为底层数据结构,在数据量较大且哈希碰撞较多时,能够极大的增加检索的效率。
②、允许 key 和 value 都为 null。key 重复会被覆盖,value 允许重复。
③、非线程安全
④、无序(遍历HashMap得到元素的顺序不是按照插入的顺序)
八.HashSet类
1.HashSet是基于HashMap实现的,所有的键值对中的value=PRESENT,PRESENT是一个Object对象
2.方法:查找:contains(key),增加:add(e),删除:remove(e)
遍历:(1)forEach循环(2)迭代器
九.LinkedHashMap类
1.LinkedHashMap类基于HashMap实现,具有HashMap集合的所有特点。但LinkedHashMap是有序的,因为 LinkedHashMap 在 HashMap 的基础上单独维护了一个具有所有数据的双向链表,该链表保证了元素迭代的顺序。即:LinkedHashMap = HashMap + LinkedList
2.方法:查找,增加,删除。和HashMap中一样
遍历:也是4种
十.LinkedHashSet类
1.基于LinkedHashMap实现
十二.TreeMap类
存的是键值对,但是可以根据键排序
1.字段属性
①、Comparator②、Entry
2.方法:查找,增加,删除。遍历