Java Api

常用Java Api介绍

API

java.lang.System

  • arraycopy(src,srcPos,des,drsPos,len)
  • currentTimeMillis()
  • exit()

java.util.Arrays

APi

  • fill()

    全部填充 void fill(T[] arr, T val) 遍历赋值

    部分填充 void fill(T[] arr, from, to , T val) 判断是否下标越界、再遍历赋值

    rangeCheck(arr.length,from,to)

  • toString()

    重写Object.toString()

    不是空引用、长度不为0,用StringBuilder拼接为[,,,,]字符串

  • equals()

    和Object的equals()方法没有关系,只是名字一样(这里的equlas是静态的,Object的是非静态的)

    什么内容不可以被继承?还有 静态?内部类?static?final?复习这里!

    全部一样返回true 对于引用类型,首先比较地址(是否一样 是否为空),(再比较长度),地址一样再比较内容

  • copyOf()

    type[] arr = copyOf(type[] original, int newLength) 拷贝指定长度到新创建的一个数组

    1
    2
    3
    type[] copy = new type[newLength];
    System.arrayCopy(original,0,copy,0,Math.min(original,newLenth));
    return copy
  • copyOfRange()

    copyOfRange(type[] original, int from, int to)

    1
    2
    3
    4
    5
    6
    int newLength = to - from;
    if(newLength < 0)
    throw new IlligalArgumentException("...");
    type[] copy = new type[newLength];
    System.arrayCopy(original,from,copy,0,Math.min(original.length-from,newLength));
    return copy;

    比如:original的长度为10,当copyOfRange(original,5,12)时,newLength会大于original.length-from,为了不下标越界所以Math.min()。新数组会长一些

  • binarySearch()

  • stream()

  • sort()

深拷贝?浅拷贝?

比较器

引用类型的比较

什么时候用外部 什么时候用内部?

只有一种比较规则的时候用内部,需要有多种比较规则进行比较就要定义多个外部比较器

内部比较器

java.long.comparable

实现该接口,实现一个compareTo()方法 将比较的逻辑写在了被比较的类的内部,所以叫内部比较器

外部比较器

java.util.Comparator

实现该接口,实现一个compare()方法

排序

排序时基于比较的

Arrays.sort(),需要一个比较器,要么内部要么外部,如果单参并且传入的实例的类没有定义相关的内部比较器就会报错。

java.lang.ClassCastException: module.Person cannot be cast to java.lang.Comparable

java.lang.CharSequence

image-20230821151358855

image-20230821151532350

String

value[]

char类型默认值是空格?还是‘\0’

多种构造方法:

  • String() 没有字符的字符串
  • String(String s)
  • String(char[] c) 字符数组构建到字符串
  • String(char[] c, int offset, int count) 字符数组的部分
  • … byte[]

两种方式创建:

  • 字面量值:将一个值以特定的格式直接定义在代码中

    比如:‘c’, “kkkkk” ,010(八进制)

  • 构造方法

区别:

  • 字面量:

    因为“hello”第一次被创建的时候是在字符串常量池创建,后续创建的时候会先去常量池找 如果已经存在,就直接引用这个地址,否则再在常量池创建新的。

    1
    2
    3
    4
    5
    6
    String str1 = "hello";
    String str2 = "hello";
    String str3 = "world";

    str1 == str2 -> true
    str2 == str3 -> false
image-20230821154651880
  • 构造方法:

    image-20230821155932566
    1
    2
    3
    String str1 = new String("hello");
    String str2 = new String("hello");
    String str3 = new String("world");

Api

java.lang.String.pdf

charAt()
indexOf()
lastIndexOf()

equals

  1. 比较地址 一样:true 否则false
  2. 地址不一样 检查参数类型是否是String,是String转为String 否则false
  3. 类型正确 比较字符数组长度 不一样:false
  4. 长度一样 逐个元素比较(whilen–遍历) 遇到不一样的:false

字符串常量,不可变 private final char value[]; 一旦进行修改就是创建了新的实例,以前的没有被引用的实例就会被gc。final

image-20230821200823746

StringBuillder

字符串变量,还有StringBuffer

value[], int count

value[]没有被final修饰

多种构造方法

  • StringBuider()

    super(16) -> (AbstractStringBuilder) new char[16]

  • StringBuilder(int capacity)

    super(capacity) -> new char[capacity]

  • StringBuilder(String s)

    • 初始化一个容量为16+s.length()的StringBuilder
    • 将字符串append进去

为什么return this?方便多次拼接 级联调用 (返回的是同一个地址)

所以

1
2
3
StringBuilder sb = new StringBuilder();
StringBuilder append = sb.append("hello").append(" ").append("world");
boolean b = sb == append; //b=true
  • StringBuilder(Charsquence c)

Api

  • 追加
  • 插入
  • delete()
  • 。。。

扩容

  • 通过构造方法StringBuilder(String str)或者StringBuilder(Charsequence c)创建时,初始容量(capacity、value.length)是16+str.length() 或 16+c.length()

  • 通过无参构造方法创建的StringBuilder的初始容量(capacity、value.length())是16,或者用另外一个单参构造方法指定初始容量后;在每次调用append(String str)方法追加字符串时,如果容量足够容纳增加后的字符串,不会扩容,如果不够,将会扩大到原来容量的两倍再加2(jdk8是value.length<<1+2,左移一位再加2)

    会经历以下步骤:

    • super.append(str);return this;

      在AbstractStringBuilder中,append方法:

      • if(str == null) return appendNull();

      • int len = str.length()

      • ensureCapacityInternal(len + count)

        ensureCapacityInternal(minCapacity)方法:

        • if(minCapacity - value.length > 0)value = Arrays.copyOf(value,newCapacity(minCapacity));

          newCapacity()方法:

          • newCapacity = (value.length << 1) + 2; //位运算,(依次向左移动一位)相当于*2然后+2 这样效率更高。。。还有一些实现省略了
      • str.getChars(0,len,value,count)

        getChars(srcBegin,srcEnd,des,desBegin)方法:

        • 如果srcBegin<0, srcBegin>srcEnd, srcEnd>len 引发对应的异常
        • System.arraycopy(value,0,des,count,srcEnd-srcBegin) [这里的value是String类的value]
      • count+=len

      • return this;

什么时候使用StringBuilder什么时候String?

高频率拼接,比如在一个for循环里面,使用StringBuilder

Object.toString()使用的String,Arrays.toString使用的StringBuilder

JDK8时间

不用java.util.Date…(老版本)

java.time.* java.time.Year, java.time.YearMonth, java.time.MonthDay, java.time.LocalDate java.time.LocalTime java.time.LocalDateTime

构造方法私有化,不能直接实例化,用now()等方法创建

  • static now() 获取当前时间
  • static of() 获取指定时间的时间
  • atXXX() 拼接
  • 比较
    • 比较器
    • isBefore() isAfter() equals
  • getXXX()
  • isLeapYear()
  • minusXXX(), plusXXX(), addXXX()

转换&还原

format(DateTimeFomatter.ofParttern(),java.time.*)

parse(str,DateTimeFormatter.ofParttern())

java.time.* <–> timeMillis

1
2
3
long timeMillis = 1629638400L;
LocalDateTime.ofInstant(Instant.ofEpochSeconds(timeMillis),ZoneId.systemDefault());
Instant是一个精确到纳秒级别的时间点,与时区无关。
1
2
LocalDateTime localDateTime = LocalDateTime.of(2024,10,1,8,30,26);
long timeMillis = localDateTime(localDateTime.atZone(ZoneId.systemDefault()));

image-20220829201947889


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!