Object类
一:Object类
1.object的介绍
特点:java中所有类的根类
2.类下的方法:
1).toString方法:
返回对象的字符串表示(对象---->字符串)
字符串的格式:
包名.类名@地址值(@:分隔符)
不重写:
public static void main(String[] args) {
Dog dog=new Dog("小小",12);
System.out.println(dog);
}
结果:
day01.Dog@28d93b30 Process finished with exit code 0
在开发中我们一般会:重写toString
作用:子类重写数据,就不会再调用父类
返回对象中的内容
重写:
public static void main(String[] args) {
Dog dog=new Dog("小小",12);
System.out.println(dog);
}
结果:
Dog{name='小小', age=12}
Process finished with exit code 0
注意:
实际上,我们平时直接打印对象是,JVM会先调用对象的toString,然后打印toString的返回值
String s = dog.toString();
System.out.println(s);
||(上面的两句代码 等价于 下面一句代码)
System.out.println(dog);
2).equals方法:
概念:
判断其他某个对象是否与此对象“相等”
判断规则:
Object中equals方法默认比较两个对象的地址值
在开发中我们又要重写equals,修改原有的比较地址规则,改成比较两个对象内容。
注意:
当两个对象用==进行比较时,比较的是对象的地址值
多态的弊端:
父类不能调用子类独有的内容,需要进行强制转换。
3.Objects类:
工具类的特征:
XxxUtils和Xxxs结尾的
概念:
是一个工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法
null save(空指针安全的)或null tolerant(容忍空指针的),用于计算对象的hashcode,
返回对象的字符串表示形式,比较两个对象
在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals
方法就优化了这个问题
方法:
public static boolean equals(Object a,Object b)判断两个对象是否相等
源码:
public static boolean equals(Object a,Object b){ return (a==b)||(a!=null && a.equals(b)); }
建议:
在开发中如果判断两个引用类型(String)是否相等,建议使用该方法。
二:Date类:
里边重写了toString
概述:
java.util.Date:表示特定的瞬间(时间点),精确到毫秒
构造函数:
public Date();//代表系统的当前时间点
public Date(long time);//time代表距离标准时间的毫秒值
标准时间是:1970.01.01 00:00:00(英国)
1970.01.01 08:00:00(中国)
成员方法:
public long getTime();//获取Date对象,距离标准时间的毫秒值
三:DateFormat类:-----抽象类
日期格式化类(把Date对象,转成指定格式的String)
子类:
SimpleDateFormat
构造方法:
public SimpleDateFormat(String pattern);//以指定的模式创建一个简单Date格式化对象
模式:(日期的格式)
yyyy年 MM月 dd日 HH时mm分ss秒
时间模式:

成员方法:
public String format(Date d);//将Date对象,转成指定模式的字符串
public Date parse(String time);//将一个字符串,解析成日期对象
例子:求出生多少天?
public static void main(String[] args) throws ParseException {
//求出生了多少天
/*
思路:1970年标准时间 出生时间 现在时间
1970年标准时间-现在时间-(标准时间-出生时间)=出生天数
*/
//1.用户输入出生时间
System.out.println("请输入你的出生日期 格式为:xxxx-xx-xx");
Scanner scanner=new Scanner(System.in);
String s = scanner.nextLine();
//2.现在的时间 距离标准时间的毫秒值
Date date=new Date();
long time = date.getTime();
//3.用户出生的时间距离标准时间的毫秒值
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
Date parse = simpleDateFormat.parse(s);
long time1 = parse.getTime();
//现在据出生日期的毫秒值
long l = time - time1;
//5.毫秒值到天的运算
long days = l / (1000 * 60 * 60 * 24);
System.out.println("出生了"+days+"天");
}
四:Calendar类:(日历)-----抽象类
a.获取方式
public static Calendar getInstance();//根据当前默认的语言和时区
注:可以获取当前的系统时间,月是从0开始算的
/* java.util.GregorianCalendar[ //毫秒值 time=1545896864062, //年,月 YEAR=2018,MONTH=11, //一年中的第几周 WEEK_OF_YEAR=52, //一个月中的第几周,一个月中的第几天 WEEK_OF_MONTH=5,DAY_OF_MONTH=27,DAY_OF_YEAR=361,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1, //时 HOUR=3,HOUR_OF_DAY=15, //分 MINUTE=47, //秒 SECOND=44,MILLISECOND=62,ZONE_OFFSET=28800000,DST_OFFSET=0] */
b.常用方法:
public int get(int fieId);//根据成员变量的编号(或Calender.字段名),获取该成员变量的值
public void set(int fieId,int value);//修改指定编号(或Calender.字段名)的成员变量的值
public void add(int fieId,int amount);//添加指定编号(或Calender.字段名)的成员变量的值
五:System类
1.两个常用的静态方法
public static long currentTimeMillis();//获取当前系统时间的毫秒值,等价于new Date.getTime();
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int lebgth);//复制数组
//原数组,原数组的起始下标,目标数组,目标数组的起始下标,复制的长度
2.复制数组小练习(代码实现)
将src数组中的3个元素,复制到dest数组的前3个位置,要求如下:
复制元素前:src数组元素[1,2,3,4,5]
dest数组元素[6,7,8,9,10]
复制元素后:src数组元素[1,2,3,4,5]
dest数组元素[1,2,3,9,10]
public static void main(String[] args) {
/*
将src数组中的3个元素,复制到dest数组的前3个位置,要求如下:
复制元素前:src数组元素[1,2,3,4,5]
dest数组元素[6,7,8,9,10]
复制元素后:src数组元素[1,2,3,4,5]
dest数组元素[1,2,3,9,10]
*/
int[] sec=new int[]{1,2,3,4,5};
int[] dest=new int[]{6,7,8,9,10};
System.arraycopy(sec,0,dest,0,3);
for (int i : dest) {
System.out.print(i+" ");
}
}
六:StringBuilder类
1.String在拼接字符串时的性能问题
性能极其低下,因为每次拼接都会新建很多对象
字符串是不可变的,如果你觉得它变了,那么底层必然是一个新的对象出现了
2.StringBuilder的介绍
一个可变的字符串:
原因:底层是一个字符串数组
3.构造方法和常用方法
构造方法:
public StringBuilder();//空的StringBuilder
public StringBuilder(String str);//有内容的StringBuilder
常用方法:
public StringBuilder append(String str);//向StringBuilder对象中追加内容
注:
该方法返回对象本身,支持链式编程,支持不同的类型
在开发中,拼接字符串使用StringBuilder,要打印时再把StringBuilder转成String
public String toString();//把StringBuilder对象转成String对象
七:包装类
1.包装类的介绍:
案例:ArrayList<int> nums=new ArrayList<int>();//报错的,因为JVM规定,基本类型不能作为集合的泛型
java为每一种基本类型,提供了 基本数据类型的包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
2.自动拆箱和自动装箱的介绍
JDK1.7之前,包装类就是包装类和基本类型没有直接联系
Integer i = 10;// 不能的
Integer i = new Integer(10);
或者
Integer i = Integer.valueof(10);
i.intValue() + 10;
JDK1.7之后
自动装箱:
Integer i = 10; //可以的
自动拆箱
i++;// i = i + 1; 既有自动拆箱 又有自动装箱
总结:
在开发中只要是基本类型 和 包装类 进行混合运算
我们统统当做基本类型来计算即可
3.包装类的另一个作用
解析字符串,将字符串解析成对应的基本类型
比如:
Integer.parseInt("30");
Double.parseDouble("3.14");
Boolean.parseBoolean("true");
但是要注意:解析的字符串格式要符合解析要求
面试题:
1.String 、StringBuilder 、StringBuffer的区别?
答:java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们都可以存储和操作字符串,区别如下:
1).String是只读字符串,也就意味着String引用的字符串是不能被改变的。
例子:
String a="abc"; a="bcd";
字符串a是一个引用对象,它指向一个字符串对象"abc",第二行代码的含义是让a重新定义一个新的字符串”bcd“对象,而”abc“对象并没有任何改变,该对象变成了一个不可及对象
2).StringBuffer/StringBuilder表示字符串对象可以直接进行修改
3).StringBuilder是java5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被synchronized(https://baike.so.com/doc/397655-421025.html)修饰,因此它的效率理论上也比StringBuffer要高。
2. 什么情况下用“+”运算符进行字符串连接比调用 StringBuffer/StringBuilder 对象的append方法连接字符串性能更好?
字符串是java程序中最常用的数据结构之一。在java中String类已经重载了““+”。也就说,字符串可以直接使用”+“进行连接,在 Java 中提供了一个StringBuilder类(这个类只在J2SE5及以上版本提供,以前的版本使用StringBuffer类)。结论:在java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder。
从上面的代码可以看出,Java编译器将"+"编译成了StringBuilder,这样for语句每循环一次,又创建了一个StringBuilder对象。 如果将上面的代码在JDK1.4下编译,必须将StringBuilder改为StringBuffer,而JDK1.4将"+"转换为StringBuffer(因为JDK1.4并没有提供StringBuilder类)。StringBuffer和StringBuilder的功能基本一样,只是StringBuffer是线程安全的,而StringBuilder不是线程安全的。因此,StringBuilder的效率会更高
浙公网安备 33010602011771号