zoukankan      html  css  js  c++  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方法声明相等对象必须具有相同的哈希代码(对象相等,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.方法:查找,增加,删除。遍历

  • 相关阅读:
    类似qq弹窗,自动消失
    词法分析实验报告
    编译原理
    开发中遇到的杂七杂八
    Gradle+Jetty实现静态资源的热部署
    Eclipse中进行Gradle+Jetty部署的web项目的断点调试
    俳句与短歌收藏
    影评收藏
    诗歌与词曲收藏
    歌词收藏
  • 原文地址:https://www.cnblogs.com/midiyu/p/15172787.html
Copyright © 2011-2022 走看看