Object类
类的特点都有
成员内部类
定义在一个类里面的类称为内部类,在外面的类称为外部类
特点:
无法定义静态变量和方法(类加载时期不一样)
不能在不存在的里面定义一个已经存在的东西
可以访问外部类的成员(私有,静态)
创建:
内部类.对象名=new 外部类().new 内部类();
静态内部类
可以定义静态成员和非静态成员(属性方法)
只能调用外部类静态成员
创建:
内部类.对象名=new 外部类();
局部内部类
在方法中它的作用域已经确定了,不能再使用访问修饰符(在作用域就在局部),只能在方法中使用
特点:和成员内部类一样
局部内部类只能访问局部常量
局部变量在方法结束之后会被销毁,对象还在变量没了
局部内部类不会随着方法的死亡而死亡
创建:在哪个方法内作用域就在哪new
匿名内部类(常用)
语法:
new 父类(){};
特点:
匿名内部类本身就是对象
通常会有一个父类,父类:通常是个接口或抽象类
一般不会定义自己的属性和方法(可以定义,但定义也调不了)
一般最多用在方法的参数为接口时使用!!!
有个接口就得有个实现类,太多冗余
lambda表达式就是简化内部类
String类
直接赋值
通过构造方法赋值
通过字节数组创建String对象(io流..)
通过字符数组创建String对象
常用方法
获取的方法
获取字符串指定下标对应的字符,返回值为char类型charAt()
获取字符串指定字符串对应的下标indexOf()
从后向前找下标lastIndexOf()——也是从前数
获取字符串长度length()
判断方法
判断字符串是否相等,区分大小写equals()
不区分大小写equalsIgnoreCase()
判断字符串是否已指定字符串开头startsWith()
判断字符串是否已指定字符串结尾endsWith()
判断字符串是否包含指定的字符串contains()
判断字符串长度是否为0,是否为空isEmpty()
其他方法
将字符串变为字节数组byte[] bytes=字符串名.getBytes()
将字符串变为字符数组char[] ch=字符串名.toCharArray()
字符串截取substring(参数1:起始下标 参数2:结束下标) (是个左闭右开的区间,从0数起 )
注意:String类是一个字符串常量,一旦定义不能改变。一定要重新赋值(字符串不可变)
字符串指定内容替换repalce()
字符串切割split() 返回的是数组
将字符串变为大写toUpperCase()
将字符串变为小写toLowerCase()
去除字符串前后的空格trim()
将以他类型转化为String类型valueOf()
String内存分配
在做字符串比较的时候,尽量使用equals方法
字符串1是通过Scanner对象扫描出来的(会创建在堆中)
字符串2是直接定义出来的(会创建在常量池中)
所以他们地址不一样
Sring a="abc"; s="bcd" ;
在内存中常量池会放一个新的字符串acd
s指向了新的字符串,并不是改值操作
str2/3:
都是在常量池中(不会被内存回收)
str4:
str4在堆内存中,因为java对于变量的字符串凭借做了优化,其底层使用到了StringBuilder类(new的都在堆里)
str5:
str5在堆内存中
str6:
str6在堆内存中,后面那个c是在常量池中
str7:
str7在常量池中,intern()方法的作用就是让此对象返回这个字符串在常量池中的地址
s3!=str5:
使用new关键字产生的对象地址永远不可能相等
可变的字符串序列StringBuffer(StringBuilder一样)
这两类的API方法一致
定义一个空字符串
StringBuffer sb=new StringBuffer();
常用方法
(不用向String一样要赋值)
append
在原有的字符串序列上追加指定字符串,地址不变
insert(下标,内容)
指定位置插入字符串
delete(下标,下标)
删除指定内容,左闭右开
reverse()
翻转
toString()
将字符串序列变成String类型
String
String 、StringBuffer 、StringBuilder区别
String类是字符串常量类,一旦定义不能改变(拼接一次创建一次对象),而后者是字符串可变类,如果实现字符串的拼接是在原有的基础上拼接的
StringBuffer线程安全的,而StringBuilder是线程不安全的,所以效率更高(一人和多人WC)
Object类
java继承树上最顶层的父类,所以类都是直接间接继承自Object,都拥有其提供的方法
常用方法
getClass()
获取对象的真实类型(类对象),反射中用得多
public final Class<?> getClass()
toString()
默认返回这个对象的内存地址
通常重写为对象的属性信息
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
hashCode()
返回这个对象十进制的hash值(hash值的作用是区分对象,不同对象应该有不同的hash值,有时会出现hash冲突)
equal()
- 底层相当于==
- == 可以用于基本类型和引用类型
- equals只能用于引用类型的比较
- 返回两个对象是否相等,默认比较内存地址
- 如果不希望比较地址,可重写
- Double/Integer/String类重写父类的equals方法,从而比较内容
- 在HashSet等集合的底层去重原理?(如何比较两个对象是否相等)
- 在java中会优先比较两个对象的hash值,如果不一致,那么两个对象不相同
- 如果一致,进而比较equals方法也相等,那么这两个对象相同
finalize方法
当垃圾回收器回收垃圾对象的时候,自动调用
包装类
为什么要有包装类
因为基本数据类型不具有方法和属性。而引用数据类型可以拥有属性和方法,使用更加的灵活
装箱和拆箱
未来在集合中只保存引用类型
8大基本数据类型首字母大写就是对应的包装类
装箱/拆箱
装:基本类型转换为包装类型
自动拆装箱
Number类
是包装类的父类
常用包装类
Integer
Integer缓冲区
(-128~127数组缓冲区,在这个范围不会new,超了会new)
属性:
MAX_VALUE
MIN_VALUE
Double
Number类
Byte、Short、Integer、Long、Float、Double六个子类
提供一组方法,用于将其中某一种类型转换成其他类型 xxxValue()方法
常用属性
MAX_VALUE
MIN_VALUE
常用方法
将字符串类型的数值转换成int或者是double类型
String s = "123";
//方式1:
int i = Integer.parseInt(s);
System.out.println(i);
//方式2:
int i2 = Integer.valueOf(s);
System.out.println(i2);
缓冲区
缓冲区是内存空间的一部分。用来缓冲输入或输出的数据
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
public class Demo02 {
public static void main(String[] args) {
/**
* 面试题:整数型包装类缓冲区
* 整数型的包装类定义缓冲区(-128~127),直接从缓存数组中获取,
* 否则,重新new新的对象
*/
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(i1 == i2); //false
System.out.println(i1.equals(i2));//true
//而当传入的数值不在这个范围之内,程序便会创建一个新的对象
Integer i3 = 1000; //Integer i3 = new Integer(1000);
Integer i4 = 1000; //Integer i3 = new Integer(1000);
System.out.println(i3 == i4); //false
System.out.println(i3.equals(i4));//true
Integer i5 = 100; //IntegerCache.cache[i + (-IntegerCache.low)]
Integer i6 = 100; //IntegerCache.cache[i + (-IntegerCache.low)]
System.out.println(i5 == i6);//true
System.out.println(i5.equals(i6));//true
}
}
Date类
创建Date对象 alt+Enter java.util.Date
获取系统当前时间 Date date=new Date();
表示指定日期Date date=new Date(2020-1900,10-1,20);——2020-10-20
毫秒数(时间戳)
编号
计算活了多少天
SimpleDateFormat日期化格式类
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 2022-04-13 20:31:30
format(time) 对long类型的毫秒数进行格式化
format(date)方法
parse(time)方法
前端向后端提交的永远都是字符串类型的
字符串——>日期类型
System系统类
获取当前时间的毫秒数 currentTimeMillis() 从1970开始
终止虚拟机运行 0表示正常退出 exit(0);
Math类(静态的直接调用)
a的b次方 pow(底数,幂数)
a的平方根 sqrt(a)
a的立方根 cbrt()
向上取整 ceil()
向下取整 floor()
四舍五入 round()
随机数 random() 默认范围[0,1)
保留一个两位正整数[0,90)
int num=(int)(Math.random()*90+10)
random类(调用)
new一下
随机一个[0,100) nexInt(100);
BigDecimalDemo(精确计算)
java浮点型在保存小数的时候是近似存储,所以计算不准确
new对象 调用方法加减乘除 add/subtract/multiply/divide
除法运算设置模式