文章目录
Java常用类
object类
所有的类都继承了Object类
native关键字
告诉JVM调用本地操作系统程序代码(通常由C,C++编写),实现Java程序的关键字。Object类的很多方法都由native关键字修饰。
getClass()
返回的是Class对象,表示的是运行时类。
如何判断对象的类型?
instance of或者.class
equals()
- ==:判断引用是否指向同一对象
- equals:没重写时和==一模一样,重写equals使其满足我们的条件可以通过开发工具快速重写equals方法
hashCode()
返回对象的哈希码值,如果不重写方法,返回的是对象的内存地址。
重写equals时务必要重写hashCode
多次调用同一个对象的hashCode值必须返回相同的值
如果两个对象的equals比较值为true,其hashCode值也应该相同
如果两个对象的equals的比较值为false,不强制hashCode值不相同,但产生不同的hashCode值会提高哈希表的性能
toString()
直接输出对象时,会自动调用对象的toString方法,本质上是输出toString方法的返回值
如果不重写该方法,默认返回值:类全名@16进制hashCode值`<\kbd>
clone()
用于克隆对象
对象被克隆的要求:
- 克隆方法被重写,且要调用super.clone()
- 被克隆的类必须实现一个接口:Cloneable表示该类可以被克隆
克隆分类:
-
浅克隆:只克隆对象本身,不克隆它所引用的对象,所有对其他对象的引用依然指向原来的对象。Object默认浅克隆,和被克隆对象的地址不相同。
-
深克隆:把要克隆的对象所引用的对象都克隆一遍,所有对其它对象的引用都将指向被克隆的新对象。没有现成的方法,需要自己实现深克隆。
finalize()
该方法不需要程序员手动调用,由垃圾回收器自动调用
机制:
JVM中存在有一个守护线程:垃圾回收器gc
gc的作用:
每个对象上都会存在一个int变量,叫做引用计数器
每当有一个引用指向该对象时,引用计数+1
每当有一个引用不再指向该对象时,引用计数-1
引用计数器为0时,gc认为该对象是垃圾,会在合适的时机对对象进行回收
可以通过System.gc()建议JVM进行垃圾回收,但只是建议,JVM不一定执行
String
java.lang.String,字符串,就是一个字符序列。
创建字符串的方式:
- 直接创建 但是原则上说,所有引用数据类型都应该通过new关键字创建,只有基本数据类型才能直接赋值。但是String是Java的一种特殊的类型,由于特别常用,JVM对其进行了优化
- 调用构造方法
“”和null的区别:
“”在堆中分配了内存,而null没有
String可以和其它任意类型进行拼接操作。
常用方法:
方法 | 作用 |
---|---|
length() | 返回字符串长度 |
indexOf() | 指定子串第一次出现的位置,没有找到子串则返回-1 |
lastIndexOf() | 指定子串最后一次出现的位置 |
subString() | 获取字符串的子串(左闭右开) |
charAt() | 获取指定位置字符 |
concat() | 拼接字符串 |
startWith() | 是否以某字符串开头 |
endsWith() | 是否以某字符串结尾 |
contains() | 是否包含指定子串 |
isEmpty() | 本质上是判断str.length() == 0 |
equals() | 判断字符串内容是否一样 |
equalsIgnoreCase() | 忽略大小写 |
toUpperCase() | 转化成大写 |
toLowerCase() | 转化为小写 |
replace() | 指定字符串的替换 |
trim() | 去除字符串两边空格 |
split() | 字符分割,参数是以“。。。”进行分割 |
toCharArray() | 将字符串转化为字符数组 |
getBytes() | 字符串转换成字节数组 |
join(JDK8新增方法,是一种静态方法) | String s = String .join("-", “a”, “b”, “c”);返回a-b-c,和split作用相反 |
字符集Charset
字符的集合
编码:字符串转换成字节数组
解码:字节数组转换成字符串
乱码:字符集设置不对,或者编码解码用的是不一样的字符集,就会出现乱码
解决方案:按解码方式重新对字符串编码再按原来的编码方式解码,所以最初编码方式要对。
String name = "大家好";
byte[] bytes = name.getBytes("gbk");
System.out.println(Arrays.toString(bytes));
String str = new String(bytes, "iso8859-1");
System.out.println(str);
byte[] bytes1 = str.getBytes("iso8859-1");
String str1 = new String(bytes1, "gbk");
System.out.println(str1);
输出如下:
[-76, -13, -68, -46, -70, -61]
´ó¼ÒºÃ
大家好
首先我们用GBK编码方式正确地得到了编码后的字节数组,但是解码方式不对出现了乱码,再以相同的方式重新编码并按照原来编码方式解码后获得正确的结果。
正则表达式
简介可见官方文档
常见方法:
方法 | 作用 |
---|---|
matches() | 是否符合给定正则表达式 |
replaceAll(regulate expression, String) | 符合格式的正则表达式替换成目标字串 |
replaceFirst() | 同上但是只置换第一个 |
split() | 搜寻到正则表达式并分开 |
String不变性
字符串的值一旦确定,则不可修改,指的是内存中的值不再修改:
int i = 3;
i = 6;//在堆中,3的值被6覆盖
String str = "jack";
str = "Tom";//在堆中,jack的值依旧存在,只是新生成了一个字符串Tom让str重新指向Tom
String常量池
String常量:直接用双引号创建的字符串,存放在常量池中,常量池在元空间中,和堆相独立,常量池中的值不会被gc回收。创建字符串常量时,会先检查常量池中有没有相等的字符串常量,有的话就不会在常量池中新建字符串常量,而是新建引用指向原来的字符串。
运行时创建String:new出来的字符串放在堆中,一旦不被对象所引用,便被垃圾回收器回收
StringBuffer&StringBuilder
频繁对String进行修改时会产生很多垃圾数据。
StringBuffer直接在对象上修改值,而不是重新new一个值。
单线程下没有区别
StringBuffer:
线程安全效率低
StringBuilder:
线程不安全效率高
包装类
Java对每个基本数据类型都提供了一个包装类,间接地让每个基本数据类型有面向对象的特征。
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
int | Integer |
short | Short |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
包装类作为参数传递时,属于值传递,而不是引用传递
基本数据类型和包装类型转换
基本数据类型转包装类型的操作叫装箱,反之为拆箱。
int a = 10;
Integer integer = a;//自动装箱
int c = integer;//自动拆箱
基本数据类型和String的转换
Integer.toString()
Integer.toBinaryString();
Integer.parseInt(String, 进制,默认为10);//字符串转int
其它类
Date
java.util.Date
Java底层使用long类型表示日期,表示的是当前时间的毫秒值,这个毫秒值是基于1970.1.1 0:0:0的差值。
Date和字符串的转换
使用java.text.SimpleDateFormat类
日期转字符串
创建SimpleDateFormat对象,指定目标格式
调用format()进行格式化
字符串转日期
创建SimpleDateFormat对象,指定字符串日期格式
调用parse()解析为日期
Calendar类
java.util.Calendar
是一个抽象类,无法用new创建,使用静态方法getInstance
Math类
Math里的所有方法都是静态方法
random()产生一个[0, 1)之间的随意浮点数
Random类
nextInt()
nextInt(100)
nextDouble()
nextBoolean()