JDK源码分析

目录

 

1. java.lang

1.1 Object

     1.1.1 equals() 

     1.1.2 toString()

     1.1.3 clone()

 

1.2 String

     1.2.1 String如何存值

     1.2.2 equals()

       ​

     1.2.3 startWith()

     1.2.4 endWith()

     1.2.5 replace() 

 

2. java.util

2.1 ArrayList

    2.1.1 构造器

    2.1.2 add()

    2.1.3 remove()

2.2 LinkedList

    2.2.1 add()

    2.2.2 get(index)

    2.2.3 remove()

 


 

1. java.lang


1.1 Object

     1.1.1 equals() 

               这是object的equals() 方法,意思是比较当前对象和传入的对象相等,他在里面直接用了 == 比较 , 在java中 == 比较是两个对象的地址是否相等, 可见如果两个对象都指向了同一块地址, 那么这两个对象一定是相等的 

           public boolean equals(Object obj) {
               return (this == obj);
            }

     1.1.2 toString()

               toString()意思是返回当前对象的字符串表达形式, Object的toString返回的是   

               当前类的全限定名(包全名)+@+当前类的16进制的HashCode值

          

     1.1.3 clone()

               clone() 方法返回一个对象的副本,clone()方法是深拷贝,即拷贝出来的对象和元对象地址不同

               以下代码表示 操作原来的对象不会改变clone对象的值,因为他们的地址不同

          JDK源码分析_第1张图片

 

1.2 String

 

     1.2.1 String如何存值

          

               当new一个String把132传入进去时,发现会把123作为char[]数组存储, 并把字符串的hashCode存入当前类的hash属性

          JDK源码分析_第2张图片

     1.2.2 equals()

               String如何用equals()判断两个字符串是否相等的了呢

          

              此序号是阅读顺序       

       JDK源码分析_第3张图片

     1.2.3 startWith()

              这个方法就是判断prefix从toffset开始是否一样

              prefix是是否已这个作为前缀判断, toffset是字符串开始查找的索引位置

         JDK源码分析_第4张图片

     1.2.4 endWith()

              endWith就是判断后缀的内容是否和当前字符串后缀内容一样,处理结果和startWith一样所以可以直接用starttWith

              举例: "123".endWith("3") 

              suffix就是3(要判断的后缀字符串)  | value.length就是3(当前字符串的长度,即"123")  | suffix.value.length就是 1 (suffix的长度:就是"3")

              startWith里的参数就是  (3,3-1)    就是当前字符串第二个位置开始到结尾是否等于3(3代表字符串)

         

     1.2.5 replace() 

              //以后写 我太菜了

 

 

2. java.util


2.1 ArrayList

    2.1.1 构造器

         2.1.1.1 无参构造器,实例化一个空数组

JDK源码分析_第5张图片

JDK源码分析_第6张图片
          2.1.1.2 带初始容量的构造器

JDK源码分析_第7张图片

    2.1.2 add()

JDK源码分析_第8张图片

size是int类型,所以现在值为0

JDK源码分析_第9张图片

ensureCapacityInternal(size+1)  这个方法是用来调整数组的长度(自动扩容)

JDK源码分析_第10张图片

此方法又调用了grow()

JDK源码分析_第11张图片

JDK源码分析_第12张图片

总结: arrayList如何实现自动扩容

当往ArrayList里添加数据的时候,会判断当前数组如果是空就使用的长度+1和默认的数组容量10比较,返回最大的数,如果数组不是空就直接返回size+1 的数, 然后如果这个size+1 大于当前数组长度就开始进行扩容, 然后就把这个size+1 扩容1.5倍赋值给原来的数组

    2.1.3 remove()

          2.1.3.1 根据索引删除

JDK源码分析_第13张图片

         2.1.3.2 根据内容删除

JDK源码分析_第14张图片

这个fastRemove(index) 和上面的根据index删除元素的代码基本一样 使用数组拷贝的方式删除元素

 JDK源码分析_第15张图片


2.2 LinkedList

       linkedList由双向链表存储

    2.2.1 add()

          add方法调用了linkLast方法来添加元素

JDK源码分析_第16张图片

    2.2.2 get(index)

           get(index)里调用了node(index)方法

JDK源码分析_第17张图片

    2.2.3 remove()

checkElementIndex() 就是检查index的值是否合法

node(index) 就是上面分析过得方法 ,根据索引获取对象

JDK源码分析_第18张图片

这是unlink() 方法

简单概括就是:

如果要删除一个对象 就是把这个对象的上一对象和下一个对象里的prev或next都重新指向, 然后清空当前对象

JDK源码分析_第19张图片

}

你可能感兴趣的:(Java)