目录
文章目录
Object类
所有对象的顶级父类,存在于java.lang包中
常用方法
class Student{
//属性、成员变量
int id;
String name;
//构造方法
public Student(){}
public Student(int id,String name){
this.id=id;
this.name=name;
}
//get set 方法
public String getName(){return name;}
public void setName(String name){this.name=name;}
public int getId(){return id;}
public void setId(int id){this.id=id;}
//equalse()指示某个对象是否与此对象“相等”
@Override
boolean equals(Object obj){
if(obj instanceof Student){
if(obj.id==id&& obj.name==name) return true;
}
return false;
}
//hashCode()返回该对象的哈希码值
@Override
public int hashCode(){
int result = 17;
result = 31*result + id;
result = 31*result + (name==null ? 0:name.hashCode);
return result;
}
//toString()返回该对象的字符表示
@Override
public String toString(){
return "Student {id="+id+",name="+name+"}";
}
//当垃圾回收器确定不存在该对象的更多引用时,由对象的垃圾回收器调用此方法。
protected void finalize()
}
1. toString()
默认返回 类名@地址 的格式,表示对象的地址值。
一般重写这个方法来查看属性值,重写后把属性拼接成一个字符串。
2. equals(Object obj)
当前对象和参数对象比较,默认是比较内存地址,如果要比较对象的属性,则重写该方法。
重写equals()的规范
- 自反性:对于任何非空引用值x,x.equals(x)都应该返回true。
- 对称性:对于任何非空引用值x,y,当且仅当y.equals(x)返回true时,x.equals(y)才返回true。
- 传递性:对于任何非空引用值x,y,z,若x.equals(y)返回true,且y.equals(z)返回true,则x.equals(z)应该返回true。
- 一致性:对于任何非空引用值x,y,在未进行更改时,多次调用equals()始终返回同样的结果。
- 对于任何非空引用值x,x.equals(null)都应该返回false。
3. hashCode()
返回对象的哈希值,主要作用是为了配合基于散列的集合(HashSet、HashMap、HashTable)一起正常运行。
equals方法和hashCode方法
- 若equals方法返回true,则两个对象的hashCode值一定相同;若两个对象的hashCode值相同,equals方法不一定返回true。
- 在重写equals方法的同时,一定要重写hashCode方法。
重写hashCode()方法
-
不能包含equals方法中没有的字段,否则会出现equals为true而hashCode不同的情况。
-
用31来计算,而且很多人都是这么写的,这是因为任何数n*31都可以被jvm优化为(n<<5)-n,移位和减法的操作效率比乘法的操作效率高很多!
result = 17; result = 31 * result + (str==null ? 0:str.hashCode); return result;
-
属性 f 的哈希码的计算
类型 哈希值 boolean true为1,false为0 byet、char、short、int 强制为int值 long (int)(f^(f>>32)) float Float.floatToIntBits(f) double Double.doubleToLongBits(f),再按照long的方法计算 引用类型 调用其hashCode方法
4. getClass()
返回此 Object的运行时类。
Student stu = new Student();
System.out.print(stu.getClass()) //class day11.Student
String类
创建对象
String s1=new String();
String s2="3";
String s3=new Scanner(System.in).nextLine(); //等同于new Stirng() 不在常量池中操作
概念
-
字符串实际上就是一个 char 数组
private final char value[];
-
final修饰,字符串不可变。
-
String str1 = new String() 是在堆中开辟新的内存空间;
-
str = “test” 是在堆中的常量池中找"test",若没有则分配新的内存。
-
str=“te”+“st” ,编译器优化成"test"再运行.
-
str1+str2+str3 字符串拼接,会有5个对象。效率低。
-
str1+str2 JVM会隐式的改写成StringBuilder调用append()
常用方法
方法名 | 用处 |
---|---|
length() | 返回此字符串的长度 |
charAt(int index) | 返回指定索引处的值 |
concat(String str) | 在结尾连接指定字符串 |
lastIndexOf(String str) | 返回指定字符串最后一次出现的索引 |
subString(int a,int b) | 返回a-b的一个子字符串,含头不含尾 |
equals(Object obj) | 将此str与指定对象进行比较 |
startsWith(String prefix) | 测试此字符串是否以指定的前缀开头。 |
endsWith(String suffix) | 测试此字符串是否以指定的后缀结尾。 |
split(String regex) | 以regex为分隔符,分割字符串,返回string数组 |
trim() | 返回一个字符串,其值为此字符串,并删除任何前导和尾随空格。 |
toCharArray() | 把字符串数据存入char[] |
getBytes() | 把字符串数据转换成整数并存入byte[] |
StringBuilder 、StringBuffer
用来优化字符串的拼接
特点
-
封装了char[] 数组,是可变的字符序列。
-
它们的对象可以被多次修改,不产生新的对象。
-
常用append()做字符串拼接。
-
内部字符数组默认初始容量是16,如果大于16会尝试扩容,新数组大小原来的变成2倍+2,容量如果还不够,直接扩充到需要的容量大小。
-
stringbuffer1.0定义是线程安全的;stringbuilder1.5定义,去除线程安全以提高速度。
包装类
为对应的基本类型提供丰富的方法。Number数字包装类的抽象父类。
与基本类型的对应关系
基本类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
Integer
创建对象
-
在Integer类中,包含256个Integer缓存对象,范围是 -128到127。
new Integer(3); //新建对象 Integer.valueOf(5);
-
使用valueOf()时,如果指定范围内的值,访问缓存对象,而不新建;如果指定范围外的值,直接新建对象。
Integer a = new Integer(3); Integer b = Integer.valueOf(3); Integer c = Integer.valueOf(3); a==b; //false b==c; //true a.equals(b);//true
方法
方法 | 用处 |
---|---|
parseInt() | 字符串转换成int |
toBinaryString() | 整数转换成2进制数据 |
toOctalString() | 整数转换成8进制数据 |
toHexString() | 整数转换成16进制数据 |
Double
创建对象
new Double(3.0)
Double.valueOf(3.0)//和new没有区别
自动装箱和自动拆箱
自动装箱
-
把基本类型包装成一包装类的对象。
Integer a = 5;//a是引用类型,引用了包装对象的地址。
-
编译器会完成对象的自动装箱:Integer a = Integer.valueOf(5);
自动拆箱
-
从包装对象中,自动取出基本类型值。
int i = a;
-
编译器会完成自动拆箱:int i = a.intValue();
日期类Date
概述
- 存在于java.util.Data包。
- 用来封装一个毫秒值表示一个精确的时间点。
- 从1970-1-1 0点开始的毫秒值。
创建对象
new Date(); //封装系统当前时间的毫秒值
new Date(30000000000L); //封装指定时间点
常用方法
Date d = new Date();
System.out.println(d);//输出当前时间
System.out.println(d.getTime());//输出1970-1-1至今的毫秒值
System.out.println(d.getMonth());//获取当前月份
System.out.println(d.getHours());//获取当前小时
日期工具类SimpleDateFormat
概述
日期格式化工具,可以把Date对象格式化成字符串,也可以将日期字符串解析成Date对象。
创建对象
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
常见方法
format(Date):把Date格式化成字符串
parse(String):把String解析成Date
BigDecimal and BigInteger
BigDecimal: 常用来解决精确的浮点数运算
BigInteger: 常用来解决超大的整数运算
创建对象
BigDecimal.valueOf(3);
常用方法
add(BigDecimal num) //加法运算
substract(BigDecimal num) //减法运算
multiply(BigDecimal num) //乘法运算
divide(BigDecimal num) //除法运算
divide(BigDecimal num,保留位数,舍入方式) //除不尽时使用
setScale(保留位数,舍入方式)
pow(int n) //求数据的几次幂