Java核心类库(上)学习笔记

Object类

boolean equals(Object obj)

  • 用于判断调用对象是否与参数对象相等。
  • 该方法默认比较两个对象的地址是否相等,与 == 运算符的结果一致
  • 若希望比较两个对象的内容,则需要重写该方法。
  • 若该方法被重写后,则应该重写hashCode方法来保证结果的一致性。
int hashCode()
  • 用于获取调用对象的哈希码值(内存地址的编号)。
  • 若两个对象调用equals方法相等,则各自调用该方法的结果必须相同。
  • 若两个调用对象equals方法不相等,则各自调用该方法的结果应该不相同。
  • 为了使得该方法与equals方法保持一致,需要重写该方法。

String toString()

  • 用于获取调用对象的字符串形式
  • 该方法默认返回的字符串为:包名.类名@哈希码值的十六进制
  • 为了返回更有意义的数据,需要重写该方法
  • 使用print或println打印引用或字符串拼接引用都会自动调用该方法
Class<?> getClass()
  • 用于返回调用对象执行时的Class实例,反射机制使用

Integer常用的方法

 自动装箱池

  •  在Integer类的内部提供了自动装箱池技术,将-128到127之间的整数已经装箱完毕,当程序中使用该范围之间的整数时,无需装箱直接取用自动装箱池中的对象即可,从而提高效率。

 Double常用的方法

Charecter类常用的方法

Math类常用方法

 BigDecimal常用方法

BigInteger常用方法

 String类

  •  从jdk1.9开始该类的底层不使用char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一些空间。

String常用的构造方法

String 常量优化机制

// 常量优化机制,变量没有
String str1 = "ab";
String str2 = "cd";
String str3 = "ab" + "cd";          // 常量优化机制 "abcd"
String str4 = "abcd";
String str5 = str1 + str2;
String str6 = "ab" + str2;
String str7 = "ab" + new String("cd");
System.out.println(str3 == str4);
System.out.println(str4 == str5);
System.out.println(str4 == str6);
System.out.println(str4 == str7);

String常用方法很多,记不清看API

正则表达式相关内容即用即查

StringBuilder和StringBuffer的区别(具体相关方法查看API)

  •  StringBuffffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低。
  •  StringBuilder类是从jdk1.5开始存在,属于非线程安全的类,效率比较高。  

Date类常用方法

 Calendar类常用方法

多态的使用场合

  •  通过方法的参数传递形成多态;

     public static void draw(Shape s){

      s.show();

    }

    draw(new Rect(1, 2, 3, 4));
  • 在方法体中直接使用多态的语法格式
    Account acc = new FixedAccount();
  • 通过方法的返回值类型形成多态
    Calender getInstance(){
      return new GregorianCalendar(zone, aLocale);
    }

Java8日期类的概述

  •  Java 8通过发布新的Date-Time API来进一步加强对 日期与时间的处理。
  • java.time包:该包日期/时间API的基础包。
  • java.time.chrono包:该包提供对不同日历系统的访问。
  • java.time.format包:该包能够格式化和解析日期时间对象。
  • java.time.temporal包:该包包含底层框架和扩展特性。
  • java.time.zone包:该包支持不同时区以及相关规则的类。

LocalDate类

  • java.time.LocalDate类主要用于描述年-月-日格式的日期信息,该类不表示时间和时区信息。
  • static LocalDate now()    在默认时区中从系统时钟获取当前日期

LocalTime类

  • java.time.LocalTime 类主要用于描述时间信息,可以描述时分秒以及纳秒。

 LocalDateTime类

  •  java.time.LocalDateTime类主要用于描述ISO-8601日历系统中没有时区的日期时间,如2007-12-03T10:15:30。

LocalDateTime常用方法:

 Instant类

  •  java.time.Instant类主要用于描述瞬间的时间点信息。

DatetimeFormatter类

  集合框架

Collection集合常用的方法

 Iterator类:

 

 List集合

List subList(int fromIndex, int toIndex)

  • 获取当前集合的子集合,也就是将集合中的一部分内容取出来,子集合和当前集合共用一块内存空间。

Queue集合(重点)

 List 泛型 -- 菱形特性  

  • Java7 开始的新特性:菱形特性  就是后面<>中的数据类型可以省略
  • List<Double> doubleList = new ArrayList<>();

泛型的底层原理

  •  泛型的本质就是参数化类型,也就是让数据类型作为参数传递,其中E相当于形式参数负责占位,而使用集合时<>中的数据类型相当于实际参数,用于给形式参数E进行初始化,从而使得集合中所有的E被实际参数替换,由于实际参数可以传递各种各样广泛的数据类型,因此得名为泛型。

自定义泛型类

  •  泛型类和普通类的区别就是类名后面添加了类型参数列表,可以有多个类型参数,如:<E, T, .. >等。
  • 实例化泛型类时应该指定具体的数据类型,并且是引用数据类型而不是基本数据类型。
  • 父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型。
  • 子类必须是“富二代”,子类除了指定或保留父类的泛型,还可以增加自己的泛型。

泛型类继承实现方式

package com.lagou.task15;

//public class SubPerson extends Person { // 不保留泛型并且没有指定类型,此时Person类中的T默认为Object类型   擦除
//public class SubPerson extends Person<String> {  // 不保留泛型但指定了泛型的类型,此时Person类中的T被指定为String类型
//public class SubPerson<T> extends Person<T> { // 保留父类的泛型  可以在构造对象时来指定T的类型
public class SubPerson<T, T1> extends Person<T> { // 保留父类的泛型,同时在子类中增加新的泛型
}

自定义泛型方法

  •  泛型方法就是我们输入参数的时候,输入的是泛型参数,而不是具体的参数。我们在调用这个泛型方法的时需要对泛型参数进行实例化。
  • 泛型方法的格式:

    [访问权限] <泛型> 返回值类型 方法名([泛型标识 参数名称]) { 方法体; }

  • 在静态方法中使用泛型参数的时候,需要我们把静态方法定义为泛型方法。
// 自定义方法实现将参数指定数组中的所有元素打印出来
    public static <T1> void printArray(T1[] arr) {
        for (T1 tt: arr) {
            System.out.println("tt = " + tt);
        }
    }

泛型在继承上的体现

  •  如果B是A的一个子类或子接口,而G是具有泛型声明的类或接口,则G并不是G的子类型!

    比如:String是Object的子类,但是List<String>并不是List<Object>的子类。

通配符的使用

  • 有时候我们希望传入的类型在一个指定的范围内,此时就可以使用泛型通配符了。
  • 如:之前传入的类型要求为Integer类型,但是后来业务需要Integer的父类Number类也可以传入。
  • 泛型中有三种通配符形式:
    <?> 无限制通配符:表示我们可以传入任意类型的参数。
    <? extends E> 表示类型的上界是E,只能是E或者是E的子类。
    <? super E> 表示类型的下界是E,只能是E或者是E的父类

通配符代码测试

public static void main(String[] args) {

        // 1.声明两个List类型的集合进行测试
        List<Animal> lt1 = new LinkedList<>();
        List<Dog> lt2 = new LinkedList<>();
        // 试图将lt2的数值赋值给lt1,也就是发生List<Dog>类型向List<Animal>类型的转换
        //lt1 = lt2;  Error: 类型之间不具备父子类关系

        System.out.println("---------------------------------------------");
        // 2.使用通配符作为泛型类型的公共父类
        List<?> lt3 = new LinkedList<>();
        lt3 = lt1; // 可以发生List<Animal>类型到List<?>类型的转换
        lt3 = lt2; // 可以发生List<Dog>类型到List<?>类型的转换

        // 向公共父类中添加元素和获取元素
        //lt3.add(new Animal()); Error: 不能存放Animal类型的对象
        //lt3.add(new Dog());    Error: 不能存放Dog类型的对象, 不支持元素的添加操作

        Object o = lt3.get(0);  // ok,支持元素的获取操作,全部当做Object类型来处理

        System.out.println("---------------------------------------------");
        // 3.使用有限制的通配符进行使用
        List<? extends Animal> lt4 = new LinkedList<>();
        // 不支持元素的添加操作
        //lt4.add(new Animal());
        //lt4.add(new Dog());
        //lt4.add(new Object());
        // 获取元素
        Animal animal = lt4.get(0);

        System.out.println("---------------------------------------------");
        List<? super Animal> lt5 = new LinkedList<>();
        lt5.add(new Animal());
        lt5.add(new Dog());
        //lt5.add(new Object());  Error: 超过了Animal类型的范围
        Object object = lt5.get(0);
    }

Set集合

  • java.util.Set集合是Collection集合的子集合,与List集合平级。
  • 该集合中元素没有先后放入次序,且不允许重复。
  • 该集合的主要实现类是:HashSet类 和 TreeSet类以及LinkedHashSet类。
  • 其中HashSet类的底层是采用哈希表进行数据管理的。
  • 其中TreeSet类的底层是采用红黑树进行数据管理的。
  • 其中LinkedHashSet类与HashSet类的不同之处在于内部维护了一个双向链表,链表中记录了元素的迭代顺序,也就是元素插入集合中的先后顺序,因此便于迭代。

图解

 思考:为什么要求重写equals方法后要重写hashCode方法呢?

  •  当两个元素调用equals方法相等时证明这两个元素相同,重写hashCode方法后保证这两个元素得到的哈希码值相同,由同一个哈希算法生成的索引位置相同,此时只需要与该索引位置已有元素比较即可,从而提高效率并避免重复元素的出现。 
TreeSet集合的概念
  • 二叉树主要指每个节点最多只有两个子节点的树形结构。
  • 满足以下3个特征的二叉树叫做有序二叉树。
    a.左子树中的任意节点元素都小于根节点元素值;
    b.右子树中的任意节点元素都大于根节点元素值;
    c.左子树和右子树的内部也遵守上述规则; 
  • 由于TreeSet集合的底层采用红黑树进行数据的管理,当有新元素插入到TreeSet集合时,需要使用新元素与集合中已有的元素依次比较来确定新元素的合理位置。 
  • 比较元素大小的规则有两种方式:
    使用元素的自然排序规则进行比较并排序,让元素类型实现java.lang.Comparable接口;
    使用比较器规则进行比较并排序,构造TreeSet集合时传入java.util.Comparator接口; 
  • 自然排序的规则比较单一,而比较器的规则比较多元化,而且比较器优先于自然排序; 

Map集合(重点)

  •  java.util.Map<K,V>集合中存取元素的基本单位是:单对元素,其中类型参数如下:

     K - 此映射所维护的键(Key)的类型,相当于目录。

     V - 映射值(Value)的类型,相当于内容。

  •  该集合中key是不允许重复的,而且一个key只能对应一个value。
  •  该集合的主要实现类有:HashMap类、TreeMap类、LinkedHashMap类、Hashtable类、Properties类。
  •  其中HashMap类的底层是采用哈希表进行数据管理的。
  •  其中TreeMap类的底层是采用红黑树进行数据管理的。
  •  其中LinkedHashMap类与HashMap类的不同之处在于内部维护了一个双向链表,链表中记录了元素的迭代顺序,也就是元素插入集合中的先后顺序,因此便于迭代。
  •  其中Hashtable类是古老的Map实现类,与HashMap类相比属于线程安全的类,且不允许null作为key或者value的数值。
  •  其中Properties类是Hashtable类的子类,该对象用于处理属性文件,key和value都是String类型的。
  •  Map集合是面向查询优化的数据结构, 在大数据量情况下有着优良的查询性能。
  •  经常用于根据key检索value的业务场景。 

元素放入HashMap集合的原理

  •  使用元素的key调用hashCode方法获取对应的哈希码值,再由某种哈希算法计算在数组中的索引位置。
  • 若该位置没有元素,则将该键值对直接放入即可。
  • 若该位置有元素,则使用key与已有元素依次比较哈希值,若哈希值不相同,则将该元素直接放入。
  • 若key与已有元素的哈希值相同,则使用key调用equals方法与已有元素依次比较。
  • 若相等则将对应的value修改,否则将键值对直接放入即可。 

相关的常量

  •  DEFAULT_INITIAL_CAPACITY : HashMap的默认容量是16。
  • DEFAULT_LOAD_FACTOR:HashMap的默认加载因子是0.75。
  • threshold:扩容的临界值,该数值为:容量*填充因子,也就是12。
  • TREEIFY_THRESHOLD:若Bucket中链表长度大于该默认值则转化为红黑树存储,该数值是8。
  • MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量,该数值是64。

 Collections工具类常用方法

 

 错题集

 

 

posted @ 2020-11-05 18:11  君莫笑我十年游  阅读(145)  评论(0编辑  收藏  举报