JDK1.8中文文档
我们常用的类用这个文档来学习。
通过索引搜索出类的信息。
Object类是所有类的父类,所有类都默认继承了Object类。
java.lang.Object类
Class Object是类Object结构的根。 每个班都有Object作为超类。 所有对象(包括数组)都实现了这个类的方法。
需要注意的是在clone在Object中是project修饰符。因为所有类都是Object的子类,所以如果不实现clone方法,在类中可以直接使用父类的clone方法,但是其对象在别的类中不能调用clone方法。所以必须重写clone方法。
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
Person person = new Person();
Person clone = (Person)person.clone();
深拷贝和浅拷贝是啥?
返回对象的字符串表示形式。 一般来说, toString方法返回一个“textually代表”这个对象的字符串。 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。
返回对象的字符串表示形式。
Person person = new Person("name");
System.out.println(person.toString());
打印结果为
com.liu.Person@4554617c
一般重写object的tostring方法.
alt + insert快捷键快速生成toString()
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", test2='" + test2 + '\'' +
'}';
}
打印结果为:
Person{name=‘name’, age=0, test2=‘null’}
返回此Object的运行时类。 返回的类对象是被表示类的static synchronized方法锁定的对象。
返回结果:表示 类对象的运行时类的Class对象。
不可重写,要调用的话,一般和getName()联合使用,如getClass().getName();
Person person = new Person("name");
System.out.println(person.getClass());
class com.liu.Person
Person person = new Person("name");
System.out.println(person.getClass().getName());
垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。 一个子类覆盖了处理系统资源或执行其他清理的finalize方法。
垃圾回收器会调用回收该对象
指示一些其他对象是否等于此。
该equals类方法Object实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空的参考值x和y ,当且仅当x和y引用相同的对象( x == y具有值true )时,该方法返回true 。
一般比较的是引用的地址
String a = "1";
if("1".equals(a)){
System.out.println("true");
}
一般都会重写,String上面的比较一看就是比较字符的值而不是地址,查看源码。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
重写了equals
返回对象的哈希码值。 支持这种方法是为了散列表,如HashMap提供的那样 。
只要在执行Java应用程序时多次在同一个对象上调用该方法, hashCode方法必须始终返回相同的整数,前提是修改了对象中equals比较中的信息。 该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。
如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
不要求如果两个对象根据equals(java.lang.Object)方法不相等,那么在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。 但是,程序员应该意识到,为不等对象生成不同的整数结果可能会提高哈希表的性能。
重写equals方法都会重写hashCode
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
wait导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或指定的时间已过。
notify醒正在等待对象监视器的单个线程。 如果任何线程正在等待这个对象,其中一个被选择被唤醒。 选择是任意的,并且由实施的判断发生。 线程通过调用wait方法之一等待对象的监视器。
八种基本数据类型都对应自己的包装类
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
根据第一步查找对象的jdk1.8的中文文档,可以详细看到每个包装类提供的方法。这里介绍几个常用的方法。 |
int m = 500;
Integer obj = new Integer(m); // 手动装箱
int n = obj.intValue(); // 手动拆箱
System.out.println(Integer.parseInt("100"));
System.out.println(Integer.toString(1));
上面 Integer obj = new Integer(m); // 手动装箱
其实可以自动
int a = 2;
Integer b =a;
int c = b;
b.toString();
va 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数
常用的方法
Math.abs(-10); //绝对值
Math.cbrt(1);//计算立方根
Math.pow(2, 2);//计算a的b次方
Math.max( 2,5 );//计算最大值
Math.min( 2,3 );//计算最小值
Math.rint(5.5);
Math.random(); //取得一个大于或者等于0.0小于不等于1.0的随机数
int a = (int)(Math.random()*100);
System.out.println(a);
该类的实例用于生成伪随机数的流。
上面介绍了Math下面提供一个random(),可以用来提供随机数。
System.out.println(new Random().nextInt(100));
java.util 包提供了 Date 类来封装当前的日期和时间。
System.out.println(new Date().toString());
打印结果 Sun Jun 12 13:55:10 CST 2022
Date date = new Date();
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
System.out.println(ft.format(date));
打印结果 2022-06-12 01:59:40
这边只要对应yyyy mm等就行 中间随意定义连接
G 纪元标记
yyyy 四位年份
MM 月份
dd 一个月的日期
hh (1~12)格式小时
HH 一天中的小时 (0~23)
mm 分钟数
ss 秒数
SS 毫秒
E 星期几
Date date = new Date();
SimpleDateFormat ft = new SimpleDateFormat ("yyyy/MM/dd E HH:mm:ss");
System.out.println(ft.format(date));
2022/06/12 星期日 14:07:37
我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分
呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar
类。Date中有很多方法都已经废弃了!
Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明
的,只需要使用getInstance方法创建即可。
set(int year, int month, int date, int hourOfDay, int minute)
Calendar c = Calendar.getInstance();//默认是当前日期
c.set(2019,6,12);
System.out.println(c.get(Calendar.YEAR));
常量 | 描述 |
---|---|
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期,和上面的字段意义完全相同 |
Calendar.HOUR | 12小时制的小时 |
Calendar.HOUR_OF_DAY | 24小时制的小时 |
Calendar.MINUTE | 分钟 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期几 |
Calendar 完全是强化班的date
Calendar nowTime = Calendar.getInstance();
SimpleDateFormat ft = new SimpleDateFormat ("yyyy/MM/dd E HH:mm:ss");
System.out.println(ft.format(nowTime.getTime()));
String 类代表字符串。字符串是常量;它们的值在创建之后不能更改。
public final class String
String源码是用final修饰的。
String str="hello";//直接赋值的方式 1
String str2=new String("hello");//实例化的方式
在字符串中,如果采用直接赋值的方式(String str=“hello”)进行对象的实例化,则会将匿名对象“hello放入对象池,每当下一次对不同的对象进行直接赋值的时候会直接利用池中原有的匿名对象,我们可以用对象手工入池;
equals
比较字符串内容是否相等
String str="hello";//直接赋值的方式 1
String str2=new String("hello");//实例化的方式
if(str.equals(str2)){
System.out.println("true");
}
equalsIgnoreCase
比较内容是否相等,忽略大小写
String str="hello";//直接赋值的方式 1
String str2=new String("Hello");//实例化的方式
if(str.equalsIgnoreCase(str2)){
System.out.println("true");
}
boolean startsWith(String str):
判断字符串对象是否以指定的str开头
boolean endsWith(String str):
判断字符串对象是否以指定的str结尾
length
长度
String str="hello";//直接赋值的方式 1
System.out.println(str.length());
charAt
获取指定位置的索引,从0开始,下面打印出来就是e
System.out.println(str.charAt(1));
indexOf
获取str在字符串对象中第一次出现的索引,打印为2
System.out.println(str.indexOf("ll"));
substring
字符串截取,开始索引,结束索引
System.out.println(str.substring(2));
System.out.println(str.substring(2,4));
toCharArray 把字符串转换为字符数组
toLowerCase 把字符串转换为小写字符串
toUpperCase 把字符串转换为大写字符串
String str="hello";//直接赋值的方式 1
char[] chars = str.toCharArray();
System.out.println(str.toLowerCase ());
System.out.println(str.toUpperCase());
trim 去两端空格
split 字符串分割
String str=" hello world";//直接赋值的方式
String[] os = str.split("o");
System.out.println(str);
System.out.println(os[0]);
System.out.println(str.trim());
StringBuilder 和 StringBuffer都是可变的字符串,和String相比。在这里插入代码片
StringBuilder 是非线程安全的
StringBuffer 是线程安全的
StringBuilder str = new StringBuilder("hello");
StringBuffer stb = new StringBuffer("world");
在index位置插入。
StringBuilder str = new StringBuilder("hello");
StringBuffer stb = new StringBuffer("world");
str.insert(3,"222");
System.out.println(str);
运行结果 hel222lo。
StringBuilder str = new StringBuilder("hello");
StringBuffer stb = new StringBuffer("world");
str.insert(3,new StringBuffer("333"));
System.out.println(str);
在原来的字符串追加。
StringBuilder str = new StringBuilder("hello");
StringBuffer stb = new StringBuffer("world");
str.append(new StringBuffer("333"));
System.out.println(str);
位置0,到2 的内容替换成22
StringBuilder str = new StringBuilder("hello");
StringBuffer stb = new StringBuffer("world");
str.replace(0,2,"22");
System.out.println(str);
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
在大多数情况下三者在执行速度方面的比较:StringBuilder > StringBuffer > String
文件类
File f = new File("d:/src3/TestObject.java");
详情见IO学习