常用类
一.Object
1.简介
java.lang.Object 类 所有类的根,所有类都直接或者简间的继承了Object类
Object 类中11个方法,需要掌握
2.常用方法
方法名 | 作用 |
---|---|
getClass | 获取对象的运行是类的Class对象 |
equals | 比较两个对象是否相等 |
hashCode | 获取对象的hashCode值 |
toString | 将对象转换为字符串 |
clone | 克隆对象 |
finalize | 对象被回收是自动调用 |
2.1getClass()
主要用于反射(后面讲)。 返回一个Class对象,表示一个运行时类,简单来说,可以认为是字节码文件(当前对象运行的字节码文件)
字节码文件 也是一个Class类型的对象
类名.class : 同样返回一个Class类型的对象
Object类中多个方法是被native关键词修饰的
- 称为 本地方法
- 该方法的方法体不是由java语言实现的,主要用来调用计算机本地的底层语言, 如 C 或 C++
2.2equals()
equals 和 == 的区别:
-
== 判断是否引用同一个对象。(判断基本类型时比较的是值,判断引用类型比较的是地址)
-
equals 如果没有被重写,默认和 == 区别。(Object类中的equals源码就是使用== 来比较的)
String类中对equals方法进行了重写,字符串和字符串的比较 比的是值
-
如果重写了equals方法,则按照重写后的规则进行比较
说明:
- 自定义类可以重写equals方法,实现对特定属性的比较
- 通过开发工具自动生成 ( equals 和 hashCode 一起重写)
2.3hashCode()
返回对象的hashCode值,哈希码值
-
hashCode值是为了支持数据结构-- 哈希表 (hashtable)
-
如果没买重写方法,默认返回为对象的内存地址相关的数值
-
重写equals方法是,要求重写hashCode()方法,
如果两个对象的equals方法比较为true时,则两个对象的hashCode值也应该相同— 重写hashCode()方法
如果两个对象的equals方法比较为false时,不强制要求hashCode值一定不同。但为不同对象产生不同的hashcode值可以提升哈希表的性能(集合时在讲)
2.4toString()
将对象转换为字符串的形式
- 当直接输出对象时,会自动调用了对象的toString()方法。本质上输出的是toString()方法的返回值
- 如果没有重写该方法,默认返回值: 全类名/完整类名 + @ + 16进制的hashCode值
- 通过重写该方法,输出对象时可以是返回需要的信息,便于查看结果,一般用于测试
2.5clone()
用于克隆对象
对象被克隆的要求:
- 必须重写clone()方法,且要调用super.clone()方法
- 被克隆对象的类 必须实现Cloneable接口,表示该类可以被克隆
浅克隆 与深克隆
- 浅克隆 : 只克隆第一层,不克隆它所引用的对象 ---- Object类中的clone()方法是浅克隆
- 深克隆: 把要克隆的对象所引用的其他对象都进行克隆----需要自己写方法实现
2.6finalize()
该方法不需要程序员手动调用,由垃圾回收器自动调用
垃圾回收机制(gc机制):
gc过程:
- 每个对象上,都会存在一个int类型的变量,叫做引用计数器
- 每当有一个引用指向该对象时,引用计数+1
- 每当有一个引用不再指向该对象时,引用计数-1
- 当引用计数值为0时,gc就认为该对象为垃圾对象
- gc会在合适的时机(算法)去对该对象进行回收,释放内存资料
- 当gc在回收对象时,就自动调用finalize();
- System.gc() 建议jVM进行垃圾回收
二.String
1.简介
java.lang.String 字符串,是java中最常用的类型
创建字符串:
- 直接创建
- 使用new关键字创建(构造方法创建)
2.常用方法
方法 | 作用 |
---|---|
length | 获取字符串长度 |
indexOf | 获取指定子串第一次出现的位置,如果找不到则返回-1 |
lastIndexOf | 获取指定子串最后一次出现的位置 |
substring | 获取指定索引范围内的子串,即截取字符串,范围[beginIndex,endIndex),左闭右开 |
charAt | 获取指定索引位置的字符 |
startsWith | 判断是否以指定子串开头 |
endsWith | 判断是否以指定子串结尾 |
contains | 判断是否为空字符串 |
equals | 判断值是否相等 |
equalsIgnoreCase | 判断是否相等,忽略大小写 |
toLowerCase | 转换为小写 |
toUpperCase | 转换为大写 |
replace | 替换 |
trim | 去掉字符串首尾的空格 |
split | 将字符串分割为数组 |
toCharArray | 将字符串转为字符数组 |
getBytes | 将字符串转为字节数组 |
join | 将多个元素以指定分隔符拼接为字符串 静态方法 String.join() JDK8新增的方法 |
3.字符集
字符: 各种文字和符号的总称。
常用字符集: ASCII ISO-8859-1 GBK UTF-8
Windows系统中默认使用GBK,linux 和 MacOS 使用UTF-8
计算机底层使用二进制, (1,0) 在处理各种字符时,需要对进行编码和解码
- 将字符串转为字节数组 ---- 编码
- 将字节数组转为字符串 ---- 解码
如果编码和解码的字符集不一致,就会导致中文乱码
4.正则表达式
4.1 简介
正则表达式也是一门独立的语言,有自己的语法,用于检测指定字符串是否符合特定的规则
通过正则表达式定义规则
4.2 规则
正则表达式 由 元字符 转义字符 限定字符 构成
- 元字符:组成正则表达式的字符
- 转义字符 \
- 限定字符: 限制字符的个数
示例 | 作用 |
---|---|
a | 只能是a |
a|b | a或者b |
a{5} | 只能是a,并且有5位 |
a{5,} | 只能是a,至少有5位 |
a{m,n} | 只能是a,m到n位 |
a* | 只能是a, 0到多位,可有可无 |
a+ | 1到多位,至少一位 |
a? | 0到一位 , 最多一位 |
[a-z]{5} | 由小写字母组成,并且5位 |
[a-zA-Z]{5} | 由字母组成,并且5位 |
[a-zA-Z0-9]{2,} | 字母 0-9,最少2位 |
. | 任意一个字符 |
\d | 数字 |
\D | 非数字 |
\w | 数字 字母 下划线 |
\W | 非(数字 字母 下划线) |
\s | 空格 |
\S | 非空格 |
示例:
- 手机号的正则(数字 11位 第一位为1) 1\d{10}
- 密码的规则:5-16位, 只能包含数字,字母,下划线,首位为大写字母 [A-Z]{1}[a-zA-Z0-9_]{4,15}
4.3 用法
String中 支持正则表达式的方法
方法名 | 作用 |
---|---|
matches | 判断某个字符串是否匹配指定的规则 |
replaceAll | 替换,作用和replace一样,区别在于 支持正则 |
split | 使用正则表达式,定义一个分割的规则 |
5.不变性
字符串的值一旦确定,则不可修改。
可修改是指的内存中的值不能在修改。
6.常量池
String常量:使用双引号直接创建的字符串,称为String常量,即字符常量
- 字符常量放在内存的常量池中
- 常量池中的值不会被gc回收,垃圾回收机制不会清理该区域的内容
- 多次出现的相同字符常量,只会在常量池中创建一个String对象
常量池的位置:
- jdk1.8 常量池在 与 堆空间相独立的位置
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OCGb6Op9-1610939552478)(img/常量池.png)]
三.StringBuffer 和StringBuilder
1.简介
Stringbuffer 和Stringbuider都是用来处理字符串的
String 是不可变字符串,不可修改
- 频繁对String进行修改,会在内存中产生很多对象,垃圾数据
- String类中提供了很多方法,但没有增删改等操作方法
如果在程序中频繁对字符串进行修改,建议使用StringBuffer 和StringBuilder 可变字符串
这两个类的用法基本一致
2.常用方法
方法 | 含义 |
---|---|
append() | 向末尾追加 |
insert | 向指定的索引位置插入数据 |
delete | 根据索引的范围删除字符 |
deleteCharAt | 根据索引删除一个字符 |
setCharAt | 根据索引修改 |
setLength | 保留指定的长度 |
reverse | 反转 |
toString | 转为String类型 |
3.区别
StringBuffer
- 线程安全(多个人同时访问一个字符串,不会出现问题)
- 效率低
StringBuilder
- 线程不安全的(多个人同时访问一个字符串,可能会出现问题)
- 效率高
四.包装类
1.简介
基本数据类型的功能比价简单,不具有面向对象的特点。
java中为每个基本类型的都提供了一个对应的包装类,使其具有面向对象的特点。
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
特性:
- 包装类的默认值为 null
- 包装类属于值传递
- 包装类中提供了一些方法
2.基本类型和包装类的转换
装箱和拆箱
- 将基本类型转为包装类型 – 装箱
- 将包装类型转为基本类型 — 拆箱
在JDK1.5后,支持自动装箱和拆箱
3.基本类型和String类型的转换
/**
* 将基本类型 ----- String
*/
int a = 8;
//1.简单处理
String s1 = a+"";
//2.通过调用包装类的方法
String s2 = Integer.toString(a);
String s3 = Double.toString(12.3);
String s4 = Float.toString(12.3f);
//3.通过调用String类的方法
String s5 = String.valueOf(a);
String s6 = String.valueOf(12.6);
/**
* String ---- 基本类型
*/
String str = "11";// 数值形式的字符串,才能转换
//1. 通过调用包装类的方法
int i = Integer.parseInt(str);
double d = Double.parseDouble(str);
boolean b = Boolean.parseBoolean(str);
System.out.println(b);
//2.
int n1 = Integer.valueOf(str);
double n2 = Double.valueOf(str);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
五.其他类
1.Date
1.1简介
java.util.Date 表示日期
java底层使用long类型来表示日期
- long类型表示当前时间的毫秒值
- 毫秒值是基于 1970/01/01 00:00:00 开始的, 这个时间被认为是计算机的起始时间(纪元时间)
Date类中有多个方法都是过时的,不建议使用
1.2方法
Date d = new Date();// 当前日期
d.getTime();//获取毫秒值
d.setTime(6000);//设置毫秒值
System.out.println("设置的时间为:"+d);
//after 判断某个时间是否在指定时间之后
Date d1 = new Date(111);
Date d2 = new Date(222);
System.out.println(d1.after(d2));
//befor() 之前
//a.compareTo(b)
System.out.println(d1.compareTo(d2));
1.3Date和String的转换
使用java.text.SimpleDateFormat 日期格式化类
具体格式参考api
Date date = new Date();
System.out.println(date);
// Date --String
// 1.指定一个日期格式
// SimpleDateFormat df = new SimpleDateFormat(" yyyy年MM月dd日 hh:mm:ss E");
DateFormat df = new SimpleDateFormat(" yyyy年MM月dd日 hh:mm:ss E");
//2. 调用方法进行格式化
String s = df.format(date);
System.out.println(s);
//String --Date
String str = "2018/12月01日";
// 格式要与字符串中的格式匹配 -- ParseException (格式不匹配包 错误)
SimpleDateFormat df2 = new SimpleDateFormat("yyyy/MM月dd日");
Date d = df2.parse(str);
System.out.println(d);
2.Calendar
2.1 简介
java.util.Calendar 表示日历,用于日期的运算和取值
Calendar 是一个抽象类,不能通过new来创建,使用静态方法getInstance()获取一个实例
2.2常用方法
Calendar c = Calendar.getInstance();
/**
* 常用方法
*/
// getTime(); 将Calendar 转为 Date
Date d = c.getTime();
System.out.println(d);
//setTime() 设置时间
c.setTime(new Date());
// get() 获取指定的时间段
System.out.println(c.get(Calendar.YEAR));//年
System.out.println(c.get(Calendar.MONTH)+1);//月 返回 0-11
System.out.println(c.get(Calendar.DAY_OF_WEEK));//星期 返回1-7 1 星期天
//set() 设置日期时间
c.set(Calendar.YEAR, 2020);
c.set(Calendar.DATE, 12);
c.set(2019, 01, 01);
// add() 添加日期
c.add(Calendar.YEAR, 2);// +2 年
c.add(Calendar.MONTH,2);// +2月
//getTimeInMillis()获取毫秒值
System.out.println(c.getTimeInMillis());
c.clear();//清空
System.out.println(c.getTime());
3.Math
java.lang.Math用于数学运算
Math类中所有的方法都是静态方法
// 常量
System.out.println(Math.PI);//圆周率
System.out.println(Math.E);//自然对数
//方法
double a = 3.821545;
//round() 四舍五入
System.out.println((int)a);
System.out.println(Math.round(a));//返回 long类型
System.out.println(Math.round(a*100)/100.0);//保留两位小数
//floor 返回小于等于参数的最大整数
System.out.println(Math.floor(a));//3.0
//ceil 返回大于等于参数的最小整数
System.out.println(Math.ceil(a));//4.0
//abs 绝对值
System.out.println(Math.abs(-5));
//pow 求次方
System.out.println(Math.pow(2, 5));
// random() 产生【0,1)
System.out.println(Math.random());
System.out.println((int)(Math.random()*100));// [0,100)
System.out.println((int)(Math.random()*61)+20);//[20,80]
4.Random
java.util.Random 用于生成随机数
Random r = new Random();
System.out.println(r.nextInt());
System.out.println(r.nextInt(100));//[0,100)
System.out.println(r.nextInt(61)+20);//[20,80]
System.out.println(r.nextDouble());
System.out.println(r.nextBoolean());