JDK源码学习java.lang包下的类

【Object】类:
clone:
方法拷贝对象返回的是一个新对象,新对象包含原来对象的信息。是浅拷贝,如果要深拷贝则需要将设计到的引用变量对象都实现cloneable接口重写clone方法,使用super.clone实现拷贝变成深拷贝。

hashCode: 
调用java本地hashCode方法(JNI),原理是根据一定规则和对象信息比如根据对象相关地址和字段,生成一个数值也叫散列值。
作用是为了配合基于散列的集合一起正常运行,比如map集合添加值就是先判断hashcode,不同则存,如果相同再判断equals,如果equals相同则不存,不相同则更新hashcode值然后添加。减少equals次数,提高了hashmap的效率。
如果两个对象equals相等,那他们hashcode肯定相等;hashcode相同,对象equals不一定相同。
因为对象hashcode跟对象存储地址和字段有关,所以重写equals方法必须重写hashCode方法。不然会导致equals相同但hashcode不同。
记住:重写hashCode方法不要依赖易变字段,不会会因为异变字段值更改而导致hashcode变化。否则导致equals相同但hashcode不同。
equals:
比较两个对象引用地址是否相同。 PS:但String类重写equals方法,增加了将两个字符串的char数组循环比较值是否一样,不一样返回false。所以String的equals是比较值。

toString:
返回 getClass().getName() + "@" + Integer.toHexString(hashCode()); 感觉不太实用,一般都会重写toString方法。

finalize:
垃圾收集器收集对象的时候会调用该方法(不做任何处理)。一般用于重写该方法做一些垃圾收集该对象前的业务逻辑处理。

wait:
表示持有对象锁的线程A放弃锁,进入等待,需要notify ,notifyAll才能唤醒。
重载方法wait(long timeout)进入等待,超时自动唤醒。wait(timeout, nanos)更精准。
notify:
表示持有对象锁的线程准备释放锁,通知jvm唤醒竞争该对象锁的某个线程(具体是谁不得而知)。
notifyAll:
表示持有对象锁的线程准备释放锁,通知jvm唤醒竞争该对象锁的所有线程。
具体使用如生产者-消费者模型
调用:wait、notify、notifyAll方法必须在synchronized块或者synchronized方法里面。否则报错。

【String】类:
equals:
先比较两个字符串地址是否相同,再检查对象是否是String实例,然后比较获取双方字符串的值char[],循环下标比较每一个字符。
equalsIgnoreCase:
比较两个字符串地址是否相同或者不为空同时两个字符串长度相等同时调用regionMatches方法返回ture。才认为相同。
regionMatches:
获取字符串的长度跟字符数组,先判断长度是否相同,再根据长度--循环,通过下标获取字符比较是否相同,不相同则根据是否忽略大小写,然后都转换成大写比较,还不同则转换为小写比较,都不符合返回false。相同返回true. 有个重载方法不忽略大小写。
valueOf:
静态方法,将其他类型的变量转换为字符串。
format:
字符串格式化,%s    字符串类型    %d整数类型 例子:str=String.format("Hi,%s", "小超");  
trim:获取字符串长度,然后一个从0开始循环取得非空格的下标,一个从长度-1开始循环取得非空格的下标。然后再截取获得非空格字符。
toUpperCase: 先循环每个字符判断是否需要改变为大写如果不需要则返回本身。复制当前数组到新的数组里面;如果需要则根据需要改变字符的下标,调用CharacterData.toUpperCase方法获取转换大写后的int再转换成字符。然后替换到新数组里面,并以此创建一个新的字符串返回。
toLowerCase: 与toUpperCase同理,只是判断是否为小写。
split: 如果regex内容为一个非正则匹配符或者是转以后的特殊字符时,采用indexOf()+substring()处理,否则使用正则表达式。 
replace:循环字符数组得到与原
contains:根据查找到的字符第一个字符去获取原字符的下标,然后根据长度的到循环长度然后一个个字符判断,返回下标。如果没有匹配的则返回-1. 最后判断返回数值是否>-1.底层是调用indexOf方法。
matches:是否匹配指定的字符串,如果匹配则为true,否则为false;
concat:根据AB长度创建一个新的字符数组C,然后将A字符数组值通过Arrays.copyOf复制到C里面。然后再通过Arrays.copyOf将B字符值复制到C数组里面去,从A.length下标开始将B字符都添加到C数组里去。然后用数组C创建一个字符串返回。
substring: 非法参数判断是否符合规则;然后如果截取是从0到最后一位则直接返回当前对象;根据开始下标和截止下标,创建一个新的字符串。底层调用System.arraycopy本地方法赋值。
indexOf: 比较两边的字符数组然后循环匹配上了,就返回匹配的位置下标、
hashCode:根据字符串的字符数组循环h = 31*h+字符返回int数字。
endsWith:拿原字符串长度-匹配字符串长度作为偏移量,然后调用startsWith方法判断。
startsWith:获取匹配字符串长度,然后根据长度循环字符数组下标从偏移量开始(默认为0),比较字符跟匹配字符是否一样不一样直接返回false;
PS:所以平常可以通过偏移量来使用这个startswith,不一定要用contains.
compareTo:
比较两个字符串顺序
compareTo()的返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,如果原字符串长度比较完了,这时就比较字符的长度. 一般应用在数组排序

【AbstractStringBuilder】类:
这个抽象类是StringBuilder和StringBuffer的直接父类。
newCapacity: 得到数组新容量长度;默认设置新长度为数组长度*2+2。如果新长度<参数值<Integer.MAX_VALUE-8则返回参数值,否则判断超过Integer.MAX_VALUE报错,未超过则返回参数值。
ensureCapacityInternal: 返回扩容后的字符数组。如果参数大于当前数组长度,则调用newCapacity扩容,然后用Array.copyOf方法创建一个新的数组,长度为参数,通过System.ArrayCopy方法将原数组的值都赋值给新数组。并返回新的数组替换为原数组。
append: 
根据要追加的字符串长度对字符数组进行扩容(如果数组长度不够则扩容,够的话直接话返回),然后通过String.getChars方法(底层System.copys)将
将新增字符串追加到原字符数组后,然后count加上新增字符串长度,返回这个对象。该方法有很多重构方法包括包括增加null,增加boolean类型。
delete(int start, int end):
先获取要删除的长度len,然后调用System.arraycopy方法将原数组下标为从start+len位置的数据,复制替换原数组下标为start的位置,复制长度为数组长度-end
reverse:

【StringBuffer】类:
继承AbstractStringBuilder类,默认构造函数声明长度为16的数组。或者根据传入的参数+16申明数组。
append:同步方法,追加字符串;设置toStringCache=null,调用父类方法。
replace:同步方法,调用父类方法。
substring:同步方法,调用父类方法。
indexOf:调用父类方法。
toString:如果toStringCache为空,则通过Arrays.copyOfRange创建新数组,然后复制一份原数组数据返回给toStringCache缓存。然后通过new String(toStringCache)返回字符串。
reverse:同步方法,调用父类方法。

【StringBuilder】类:
继承AbstractStringBuilder类,默认构造函数声明长度为16的数组。或者根据传入的参数+16申明数组。
大部分方法跟StringBuffer一样都继承父类方法,跟StringBuffer的区别是它都不是同步synchronized方法。
toString:根据字符数组创建一个新的String字符串返回。
【Integer】类:
toString:
parseInt:先获取字符串长度,小于等于0报错;然后取第一个字符判断是否是"-" or "+"号。然后根据字符串长度循环,调用Character.digit去获取每个字符转换的数字,然后再累加计算。返回。涉及进制
valueOf:底层也是调用parseInt实现。
String 为十进制. 采用parseInt(String )合适. 非十进制,采用parseInt(String ,int)
想要获得Integer:
String 为十进制. 采用valueof(String)合适. 非十进制,采用decode(String)
想要获得int
String 为十进制. 采用parseInt(String)合适. 非十进制,采用parseInt(String ,int)
IntegerCache在初始化的时候初始化-128 到127的数字放入缓存. 因此当使用此之间数据==比较时返回true.
【Boolean】类:略过
【Byte】类:略过
【Double】类:略过
compare:比较两个double,A>B返回1,否则返回-1.如果比较相等则把他们转换为long再次比较。
常用的封装类型都差不多。

【Thread】类:
sleep: JNI本地方法,暂停当前线程执行*毫秒,把cpu片段让出给其他线程。
start:底层调用JNI本地方法,启动线程,并不会立马执行,而是获得cpu时间片开始执行run方法。
run:实现自Runnable接口抽象方法,普通方法一样执行run方法。
stop: 调用底层JNI本地方法stop0,释放改线程所持有的所有的锁,而锁的突然释放会导致被保护的数据的不一致性。已标记过时,不建议使用。
【ThreadLocal】类:
set:获取当前运行的线程对象,然后根据线程对象获取ThreadLocal.ThreadLocalMap对象,如果对象不为空则,循环ThreadLocal.ThreadLocalMap的table数组,循环数组下标判断值跟当前this对象一样,则将当前线程对象赋值给table对应下标的value。如果为空则在ThreadLocal.ThreadLocalMap理创建一个长度为16的数组,往后找一个没有数据的位置赋值当前线程对象。
get:根据ThreadLocal中的threadLocalHashCode取模,取得线程中的ThreadLocal.ThreadLocalMap中的table的一个位置,看一下有没有数据,没有就往下一个位置找
remove:取得当前线程的ThreadLocal.ThreadLocalMap,如果有ThreadLocal.ThreadLocalMap,找到对应的Entry,移除掉就好了。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值