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的效率会更高

 

 

 

posted on 2018-12-28 15:59  杰cc  阅读(208)  评论(0)    收藏  举报