### java.lang包
不需要导入
***
### Object类
Object类是所有类的父类,也是唯一一个没有父类的类
**常见方法:**
**①public boolean equals(Object obj)比较两个引用数据类型是否相等**
***
**面试题:equals与==的区别**
==既能比较基本数据类型,又能比较引用数据类型,比较基本数据类型时,比较的是字面真值;比较引用数据类型时比较的是引用值是否相等(即地址是否相等)
equals只能比较引用数据类型,而且子类可以通过重写的方式定制比较规则
***
**面试题:String s1 = "hello";与String s2 = new String("hello");的区别**
String s1 = "hello"只在字符串常量池中创建了一个对象;
String s2 = new String("hello");在在字符串常量池中和堆中各创建一个对象
#### 内存模型
String s1 = "hello";
![](https://box.kancloud.cn/e5e968947e8990d0177712f6d420d3ad_658x399.png)
String s2 = new String("hello");
![](https://box.kancloud.cn/fbd2c2689a2d52f3d5538bf4d7a05ebf_659x399.png)
***
**②public int hashCode()返回十进制整数,唯一标识一个对象**
如果两个对象用equals方法比较返回true,这两个对象的hashCode一定一样;如果两个对象的hashCode一样,equals不一定返回true
***
**③public String toString() 返回 类名@hashcode**
***
**④protected void finalize() throws Throwable { }**
**面试题:final,finally,finalize有什么区别**
final能修饰类,方法,属性
final修饰类,该类不能被继承
final修饰方法,该方法不能被重写
final修饰属性(常量),程序运行时不可以改变
finally一般用于异常处理,存放一定要执行的代码,大多数用于回收资源
finalize与垃圾回收机制有关,没有引用指向的对象,JVM会视其为垃圾对象,JVM会自动调用这个对象的finalize方法,释放内存空间
***
### 包装类
在Java中,基本数据类型不被视为对象,包装类可以将基本数据类型包装成对象,从而可以调用一些方法
**基本数据类型对应的包装类**
![](https://box.kancloud.cn/e4d643ea03f4e3fd9608569155454f53_570x329.png)
~~~
public class BaoZhuangClassDemo1 {
public static void main(String[] args) {
// 包装类的功能
// 1.进行与字符串之间的相互转换
// ①基本数据类型转字符串
// int num1 = 200;
// String strNum1 = Integer.toString(num1);// 包装类转换
// System.out.println(strNum1+1);
// double num2 = 9.999;
// String strNum2 = Double.toString(num2);
// // String的valueOf()也能将基本数据类型转成字符串
// String strNum3 = String.valueOf(num1);
// String strNum4 = String.valueOf(num2);
// boolean b1 = false;
// String strB1 = Boolean.toString(b1);
// System.out.println(strB1);
// char c[] = {'h','e','l','l','o'};
// String c1 = new String(c);
// System.out.println(c1);
// ②字符串转基本数据类型
String strNum1 = "123";
int num1 = Integer.parseInt(strNum1);
// 特殊情况
boolean b1 = Boolean.valueOf(strNum1);
System.out.println(b1);
// 转字符数组
char c[] = strNum1.toCharArray();
for(char c1:c) {
System.out.println(c1);
}
// 2.能够像基本数据类型一样存值
// int num = 1;
// num = null;// 基本数据类型不能为null
// 自动装箱
// Integer num1 = 2;// 相当于Integer num1 = new Integer(2);
// Integer num2 = 5;
// 自动拆箱--默认调用intValue()转成了基本数据类型
// System.out.println(num1+num2);
}
}
~~~
***
### String字符串常量
String代表一组不可变的字符串(对它的任何改动都不是在原有的基础上进行的,都是在创建新的字符串)
**String是不能被继承的,因为是final类**
**常用方法:**
~~~
public class StringDemo1 {
public static void testStr1() {
String str = "";
for(int i = 0;i < 100000;i++) {
str += i;
}
}
public static void testStr2() {
String str = "";
for(int i = 0;i < 100000;i++) {
str.concat(String.valueOf(i));
}
}
public static void main(String[] args) {
// 字符串常量
// String str1 = "hello";
// String str2 = new String("hello");
// str1 = str1 + "world";
// System.out.println(str1);
// byte[] b = str1.getBytes();
// for(byte b1:b) {
// System.out.println(b1);
// }
// System.out.println(new String(b));
// System.out.println(str1 == str2);
// System.out.println(str1.equals(str2));
// 常用方法
// 1.equalsboolean equals(String) 比较两个字符串字面量是否相等
System.out.println("hello".equals("Hello"));
// 2.boolean equalsIgnoreCase(String) 忽略大小写比较
System.out.println("hello".equalsIgnoreCase("Hello"));
System.out.println("hello".toUpperCase());
System.out.println("HELLO".toLowerCase());
// 3.char charAt(int) 返回指定索引处的字符
System.out.println("hello".charAt(3));
// 4.String substring(int begin) 截取begin之后的所有子串
System.out.println("abcdefghijklmn".substring(4));
// 5.String substring(int begin,int end) 截取begin到end-1的字串
System.out.println("abcdefghijklmn".substring(4,6));
// 6.String trim() 专门用来去开始和结尾的空格
System.out.println(" hello world ".trim());
String username = "abcde";
if(username == null || username.trim().equals("")) {
System.out.println("您的用户名填写有误");
}
// 7.int length( ) 返回字符串长度
System.out.println(" hello".length());
// 数组.length 字符串.length()方法 集合.size()
for(int i = 0;i < username.length();i++) {
System.out.println(username.charAt(i));
}
// 8.int indexOf/lastIndexOf(char)
// indexOf返回参数在字符串当中第一次出现的索引值,找不到返回-1
System.out.println("fgdfgdhdsdfsdfghasdash".indexOf("z"));
System.out.println("fgdfgdhgddsdfsdfghasdash".lastIndexOf("gd"));
System.out.println("fgdfgd".indexOf("gd",2));
// lastIndexOf("gd",7),索引值7之前gd最后一次出现的索引值
System.out.println("fgdfgdaaaaadasd".lastIndexOf("gd",7));
// 9.String concat(String str) 连接--不重要
long start = System.currentTimeMillis();
testStr2();
long end = System.currentTimeMillis();
System.out.println((end-start)/1000);
// 10.String[] split(String regex) 切
String suit[] = "黑桃,红桃,方片,草花".split(",");
for(String s:suit) {
System.out.println(s);
}
String s1[] = "黑桃^红桃^方片^草花".split("\\^");
System.out.println(s1.length);
for(String s:s1) {
System.out.println(s);
}
String s2[] = "黑打发士大夫黑都发生黑水电费黑".split("黑");
System.out.println(s2.length);
for(String s:s2) {
System.out.println("^^"+s);
}
System.out.println("hello".replace('l', 'z'));
System.out.println("hello".startsWith("hee"));// false
System.out.println("hello".endsWith("llo"));// true
}
}
~~~
***
### StringBuffer类
StringBuffer代表一组可变的字符串面,对它所有的改动,都是在原有字符串基础上进行的,不生成新的对象
***
### StringBuilder类
**面试题:String,StringBuffer,StringBuilder之间有什么区别?**
String是字符串常量,不可改变,对它的改动都不是在原有基础上进行,都创建了新的对象;
StringBuffer与StringBuilder代表一组可以改变的字符串,StringBuffer是线程安全的(数据同步),StringBuilder是线程不安全的(数据不同步),效率高于StringBuffer,单线程操作建议使用StringBuilder
***
### Math类
**final类不能被继承**
~~~
public class MathDemo1 {
public static void main(String[] args) {
// 常用方法
// 1.Math.random()生成一个[0,1)的随机数
double num1 = Math.random();
double num2 = 9.9;
System.out.println(Math.abs(num2));
System.out.println(Math.ceil(num2));
System.out.println(Math.floor(num2));
System.out.println(Math.max(-7, 2));
System.out.println(Math.min(-7, 2));
System.out.println(Math.round(-4.6));
}
}
~~~
***
### Date与Calendar类
~~~
import java.util.Calendar;
import java.util.Date;
public class DateDemo1 {
public static void main(String[] args) {
// 1.java.util.Date类
Date date1 = new Date();
System.out.println(date1.getTime());
// date.getTime()得到的是从1970年1月1日00:00:00到系统当前时间经过的毫秒数字
// 2.Calendar
Calendar date2 = Calendar.getInstance();
System.out.println(date2.getTime().getTime());
// set方法设置时间,注意:月份从0开始,即0代表1月
date2.set(1989,9,8,17,36,55);
System.out.println(date2.getTime());
System.out.println(date2.get(Calendar.YEAR));
System.out.println(date2.get(Calendar.MONTH));
System.out.println(date2.get(Calendar.DATE));
System.out.println(date2.get(Calendar.DAY_OF_YEAR));
System.out.println(date2.get(Calendar.HOUR));
}
}
~~~
### SimpleDateFormat类
功能:字符串与日期之间的转换
~~~
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo1 {
public static void main(String[] args) {
// 实例化SimpleDateFormat对象
// 参数--转换格式
Date date1 = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM月-dd HH:mm:ss");
// format将Date转成String
String strDate1 = sdf.format(date1);
System.out.println(strDate1);
// parse将String转成Date
String strDate2 = "2018-4月-28 13:14:15";
try {
Date date2 = sdf.parse(strDate2);
System.out.println(date2);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
~~~
***
#### 总结:
①Object类,它是所有类的父类
②java.lang,不需要手动导入
③了解equals,hashCode,toString,finalize方法
④包装类(与字符串之间的互相转换)
**包装类.toString(基本数据变量)**
**包装类.valueOf(字符串)**
**包装类.parseXXX(字符串)**
⑤字符串
String,StringBuffer,StringBuilder的区别?
String s = "hello"与String s = new String("hello")的区别?
**两个StringBuffer或两个StringBuilder比较字面量时,切记要调用toString()转成字符串常量,再调用equals方法**
***
**常用方法:**
equals
equalsIgnoreCase
substring
length()
charAt()
trim()
indexOf(),lastIndexOf()
split-->返回值是一个String[]
startsWith(),endsWith()
append()追加--StringBuffer的方法
***
⑥Math类
⑦Date和Calendar日期
⑧SimpleDateFormat日期转换类