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
3type[] copy = new type[newLength];
System.arrayCopy(original,0,copy,0,Math.min(original,newLenth));
return copycopyOfRange()
copyOfRange(type[] original, int from, int to)
1
2
3
4
5
6int 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
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
6String str1 = "hello";
String str2 = "hello";
String str3 = "world";
str1 == str2 -> true
str2 == str3 -> false
构造方法:
1
2
3String str1 = new String("hello");
String str2 = new String("hello");
String str3 = new String("world");
Api
charAt() |
||
indexOf() |
||
lastIndexOf() |
||
… |
equals
- 比较地址 一样:true 否则false
- 地址不一样 检查参数类型是否是String,是String转为String 否则false
- 类型正确 比较字符数组长度 不一样:false
- 长度一样 逐个元素比较(whilen–遍历) 遇到不一样的:false
字符串常量,不可变 private final char value[];
一旦进行修改就是创建了新的实例,以前的没有被引用的实例就会被gc。final
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 |
|
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 |
|
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!