基础部分之System、Object、Calendar
基础部分之System、Object、Calendar、StringBuffer
System.out.println(obj)和 System.out.println(obj.toString())区别
public static void main(String[] args) { Object o = new Object(); System.out.println(o);//java.lang.Object@1540e19d System.out.println(o.toString());//java.lang.Object@1540e19d }
两者结果完全一致,分析:System类
out为System的静态变量
System:
public final static PrintStream out = null;
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
String:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
实际上printLn方法内部调用了String的valueOf()方法,valueOf()内部又掉了Object的toString()方法,所以这两者实质是一样的效果
Object类equals()方法的作用
public static void main(String[] args) { Object o1 = new Object(); Object o2 = new Object(); System.out.println(o1==o2);//false System.out.println(o1.equals(o2));//false }
Object类的equals方法和==没有区别,都是比较引用对象对应内存空间的地址值,故没有实际意义,真正意义在于其子类可以重写Object的equals方法来实现想要的效果
,举个例子:
public class TestOne {
public static void main(String[] args) {
Person p1 = new Person("liuyan", '女');
Person p2 = new Person("yangmi", '女');
Person p3 = new Person("成龙", '男');
System.out.println(p1.equals(p2));//true
System.out.println(p1==p2);//false
System.out.println(p1.equals(p3));//false
}
}
class Person{
private String name;
private char gender;
public Person(String name,char gender){
this.name = name;
this.gender = gender;
}
//比较Person对象重写后的的性别
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
if (gender != person.gender) {
return false;
}else {
return true;
}
}
}
实际意义也就是如果有多个对象,地址值肯定不同,但只要属性值相同,用重写后的equals方法比较后就应该相等。
Calendar日历的使用
public static void main(String[] args) { /** * Calendar是一个抽象类,不能创建实例 * Calendar.getInstance()得到的是Calendar的子类对象 * 这个方法可以根据本地信息(时区/语言)来获取相应版本的日历 * 如果在日本,获取的就是JapaneseImperialCalendar 日本日历 * 如果在中国,获取的就是GregorianCalendar ,格里高利历 俗称‘公历’ */ Calendar ca = Calendar.getInstance();//2019-08-16 System.out.println("ca = " + ca); //给月份向后平移两个月 ca.add(Calendar.MARCH,2); int year = ca.get(Calendar.YEAR); //国外时间是(0-11)所以需要加1 int month = ca.get(Calendar.MARCH) + 1; int day = ca.get(Calendar.DAY_OF_MONTH); System.out.println(year+"-"+month+"-"+day);//2019-10-16 }
在格里高利历中,月份是从0-11依次对应中国的1-12,所以在取月份的时候要加1,set月份时候要减1,但如果set和get同时用到,就不需要加1和减1
例如:
Calendar ca2 = Calendar.getInstance();//2019-08-25
ca2.set(Calendar.MARCH, 4-1);
System.out.println(ca2.get(Calendar.MARCH)+1);
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(ca2.getTime()));
Calendar ca3 = Calendar.getInstance();//2019-08-25
ca3.set(Calendar.MARCH, 4);
System.out.println(ca3.get(Calendar.MARCH));
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(ca3.getTime()));
//结果
4
2019-04-25
4
2019-05-25
System类arraycopy方法 数组复制
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :将 数组中指定的数据拷贝到另一个数组中。
private static void arrayCopy() { /** * 前提是目标数组要又对应的值,不能造成数组越界异常 */ Integer[] arr1 = {1, 2, 3, 4, 5}; Integer[] arr2 = {6,7,8,9}; System.arraycopy(arr1,2,arr2,0,3); System.out.println(Arrays.toString(arr2)); }
StringBuffer与String的区别
- 由于String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象,在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被更改
- 而StringBuffer刚好对此进行了优化,它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder会自动 维护数组的扩容。原理如下图所示:(默认16字符空间,超过自动扩充)
- 两个常用方法 append()和toString