基础部分之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
版权声明:本文为chenglei0718原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/chenglei0718/p/11361450.html