Java教程

四.源码解读

本文主要是介绍四.源码解读,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一.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方法声明相等对象必须具有相同的哈希代码,如果equals重写了,比较的是内容是否相等,那么也要重写hashCode方法,使得内容相同的两个对象返回相同的hashCode

2.getClass方法  返回一个对象的运行时类(得到一个对象的Class对象)Class对象就叫运行时类

(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.方法:查找,增加,删除。遍历

 

这篇关于四.源码解读的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!