Java学习笔记(八)——了解源码之java.base下的的java.lang包
API接口文档什么是API?API是指应用程序的编程接口,用来让别人使用这个应用程序。关于API更加形象具体的说明见这里。API接口说明文档,用来告诉别人这个应用程序如何使用。我们现在想要看java的API文档说明是想看看java是怎么设计的,写java的技术人员是怎么设计一些函数、数据类型等等的。咋样能看到java的API方法一:上链接方法二:Java框架结构(后续慢慢将这个补完整)先看看jav
API接口文档
什么是API?
API是指应用程序的编程接口,用来让别人使用这个应用程序。关于API更加形象具体的说明见这里。
API接口说明文档,用来告诉别人这个应用程序如何使用。
我们现在想要看java的API文档说明是想看看java是怎么设计的,写java的技术人员是怎么设计一些函数、数据类型等等的。
咋样能看到java的API
方法一:上链接
方法二:
Java框架结构(后续慢慢将这个补完整)
先看看java.base —— 描述java平台标准版的API功能
包含一堆package 和 services。
先来看包,里面有很多种包,java.io、java.lang包等等,java.lang很常见,先来看这个。
java.lang
点开java.lang发现里面描述了很多接口、数据类型类、和一些其他的东西。
查看class里面有Boolean、Byte、Interger、Object这样的类,继续点进去发现有很多关于这个类的说明、和方法解释;比如Object类有equal方法、getclass方法等,interger也有equal方法。
equal方法如何实现:
-
Object
这时候我们就很想看一下这个源码是怎样实现这个比较方法的,点到编译器里查看就会发现Object实现equal的方法特别简单。
==判等是判断两个对象是否地址相同
-
String
所以Object的equal方法只是判断两个对象是不是存放在同一个地址。但是显然这种方法不能适用于所有情况,比如对于String类型,可能两个对象不在同一个地址,但是内容相同,这样的情况应该怎么判断呢。—————— 在String这个类里面重写equal方法,(毕竟所有的类都是Object的子类嘛)
判断方法:
判断是否在一个地址,是则true,不在一个地址的情况下继续判断。
判断是否是同一种类型,是的话转型,不是则false。
转型之后,如果coder码相等或者COMPACT_STRINGS为假,就进行如下判断:
code码和COMPACT_STRINGS是个啥:
code码是给所有对象编号的一个hash码。
COMPACT_STRING判断字符串压缩以及联系判断编码的机制的解释如下:
更加详细的解释后续补上。
先判断长度,长度相等继续判断每一个值,所有值相等返回true,否则都要返回false(长度都不相等肯定是false啦)。
这个就是String全部判等过程,那么所有的类型可能都要重写自己的判等方法。
-
其他
比如自己写的User类、数组等等。但是从String的判断过程中我们可以总结一个判断的流程框架。
- 判断两对象的地址是否相同。同则true,否则进入2。
- 判断两对象的类型是否相同以及对象是否为空。同且不为空则进入3,否则false。对象类型是否相同判断方法:
- interface
- getclass
3. 转型,转为本类类型。
- 如果是整数、常量基本数据类型等等,用==判断。
- 如果是String、Integer 等类型,用已有的equal判断,他们都是经过一遍重写的。
- 如果是自己写的类要自己写判等方法。
ps: 一些常量值会直接放在常量池中,常量值相同,他们的地址是相同的,因此可以用==判断。
eg: //User 不重写判等方法
User user0 = new User();
User user1 = new User();
user0.id="12345";
user1.id="12345";
user0.equal(user1);
public class Test { String testID; public boolean equal(Object anObject){ if(this == anObject) return true; if( this!=null && anObject instanceof Test) { Test test0 = (Test) anObject; return (this.testID == test0.testID); //return (this.testID.equals(test0.testID)); } return false; } public static void main(String[] args){ Test test0 = new Test(); Test test1 = new Test(); test0.testID="12345"; test1.testID="12345"; System.out.println(test0.equal(test1)); } }
<其他架构后面继续补充>
练习
//User.java
public class User {
String id;
String name;
int age;
String phoneNum;
Test test;
Integer i;
int[] arr;
public User(){
}
public User(String id,String name,int age,String phoneNum,Test test,Integer i,int[] arr){
this.id = id;
this.name = name;
this.age = age;
this. phoneNum = phoneNum;
this.test = test;
this.i = i;
this.arr = arr;
}
@Override
public boolean equals(Object o) {
//自己写的方法:
if(this == o) return true;
if((o == null) || (this.getClass() != o.getClass())) return false;
User user0 = (User) o;
if(this.arr.length != user0.arr.length) return false;
for(int i=0;i<this.arr.length;i++){
if(this.arr[i] != user0.arr[i]) return false;
}
return ( (this.id.equals(user0.id)) && (this.name.equals(user0.name)) && (this.age == user0.age) && (this.phoneNum.equals(user0.phoneNum)) && (this.test.equal(user0.test)) && (this.i.equals(user0.i)));
//下面是idea自己生成的判等方法:
// if (this == o) return true;
// if (o == null || getClass() != o.getClass()) return false;
// User user = (User) o;
// return age == user.age && Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(phonenum, user.phonenum) && Objects.equals(test, user.test) && Objects.equals(i, user.i) && Arrays.equals(arr, user.arr);
}
public static void main(String[] args){
int[] arr1 = new int[5];
int[] arr2 = new int[5];
for(int j=0;j<5;j++){
arr1[j]=j+1;
arr2[j]=j+1;
}
Test test0 = new Test();
test0.testID =new String("001");
Test test1 = new Test();
test1.testID =new String("001");
User user1 = new User("410","Stefan",27,"1234567890",test0,2,arr1);
User user2 = new User("410","Stefan",27,"1234567890",test1,2,arr2);
System.out.println(user1.equals(user2));
}
}
//Test.java
public class Test {
String testID;
public boolean equal(Object anObject){
if(this == anObject) return true;
if( this!=null && anObject instanceof Test) {
Test test0 = (Test) anObject;
return (this.testID.equals(test0.testID));
}
return false;
}
}
更多推荐
所有评论(0)