A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-7-26 17:18 编辑

一. Object类
1.1 Object简介
    Object类是所有类的父类、根类、超类、基类,所有类如无继承关系则默认继承Object类。所有类都直接或简介继承Objcet类。所有类都可以调用Object中一些的方法。今天学习其中的toString方法和equals方法。
1.2 Object中的toString()方法
  
[AppleScript] 纯文本查看 复制代码
 java.lang.Object
    public String toString() :任何类的对象调用toString(),得到该对象的字符串表现形式。如子类不重写toString()方法,默认调用Object的里的toString()方法,则会输出该对象的地址值,如:com.itheima.Student@93b9c129。
    详解:
  
[AppleScript] 纯文本查看 复制代码
  Object类的toString源代码:
     public class Object {
        public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
    }

代码解释:

   
[AppleScript] 纯文本查看 复制代码
 getClass().getName():
        getClass(): Object类的方法, 获取当前对象的类的字节码对象
        getClass().getName(): 通过字节码对象获取该类的全名
    Integer.toHexString(hashCode())
    hashCode(): Object类的方法, 获取当前对象地址值的哈希值
       Integer.toHexString(int n): 将参数转换为十六进制数字的字符串[/color][/font][/align][align=left][color=black][font=微软雅黑]最终结果:[b]com.itheima.Student@93b9c129。[/b][/font][/color][font=微软雅黑][color=black]
因此,为了得到我们想要的表现形式或者把对象里的成员变量以字符串的形式展示,我们需要经常重写Object的toString()方法。
因为经常重写toString()方法,我们通过Alt+Insert快捷键,选择toString(),即可完成toString()方法的重写。
补充:直接打印对象会直接就会直接调用对象的toString()方法。
1.3 Object中的equals
(Object obj)
方法
[AppleScript] 纯文本查看 复制代码
[b]public boolean[/b] [color=red][b]equals(Object obj)[/b][/color] [/color][/font][/align][align=left][font=微软雅黑][color=black]        指示其他某个对象是否与此对象"[b]相等[/b]"
Object类中equals()的实现方式:
[AppleScript] 纯文本查看 复制代码
        public class Object {
[b]          public boolean [color=red]equals(Object obj)[/color][/b] {
              return (this == obj);  // 引用数据类型, ==比较对象的地址值是否相同
          }
        }
        因此,不重写时, 自定义对象默认继承Object类的equals(
Object obj
)
方法, 通过 == 比较地址值。但开发时, 一般要重写equals(
Object obj
)
方法, 让对象根据属性值来判断是否相等。
IDEA快捷键: Alt+Insert, 选 equals() and hashCode()
重写方法代码详解:
[AppleScript] 纯文本查看 复制代码
  @Override
        public boolean [color=red][b]equals(Object o) [/b][/color]{
[b]        // 如果对象地址值相同, 则是同一个对象, 那么属性值肯定相同, 认为相等
[/b]          if (this == o) return true;
[b]        // 如果被比较对象为null, 或者不是同一个类型, 则认为不相等
[/b]          if (o == null || getClass() != o.getClass()) return false;
[b]        // 如果不是同一个对象, 且不为null, 且是一个类型, 则向下转型比较子类特有属性
[/b]          Person person = (Person) o;
[b]        // 基本类型属性值用==比较, 引用类型属性值用Objects工具类的equals()比较
[/b]          return age == person.age &&
          Objects.equals(name, person.name);
         }
1.4 Objects中的equals
(Object a , Obbject b)
方法
两个对象在调用equals()方法比较的时候,如果调用方法的对象其中的值为null,则会发生空指针异常,而Objects中的
equals
(Object a , Obbject b)
方法则加入了a是否为null的判断。

        
源代码为:

[AppleScript] 纯文本查看 复制代码
public static boolean equals(Object a, Object b) {
                                                        return (a == b) || (a != null && a.equals(b));
                                                        }

二、时间相关类
  
[AppleScript] 纯文本查看 复制代码
  long(数学计算)
        \       SimpleDateFormat
         Date -------------------- String (用户输入和显示)
        /
Calendar (获取时间的某个部分)

1.1 Date类及其方法介绍
        java.util.Date类: 日期, 表示特定的瞬间, 精确到"毫秒"
// 构造方法
        Date(): 创建Date对象, 表示当前系统时间
        Date(long date): 创建Date对象, 使用指定的毫秒值作为时间,制定毫秒值是从UNIX时间戳开始累加表示指定时间
        注:UNIX时间戳: 从0时区 1970-01-01 00:00:00 开始, 至今经过的毫秒值(1 秒 = 1000 毫秒)
              10位 精确到秒  : 1494992791    = 2017/5/17 11:46:31
              13位 精确到毫秒: 1494992791000 = 2017/5/17 11:46:31
// 常用成员方法
     
[AppleScript] 纯文本查看 复制代码
   long getTime(): 获取Date对象中保存的时间毫秒值
        void setTime(long time): 修改Date对象的时间

1.2 DateFormat类方法及其 SimpleDateFormat子类的构造方法
        java.text.DateFormat抽象类: 用于格式化和解析时间. 提供了方便的方法
// 常用成员方法 (抽象类不能创建对象, 但可以有非抽象的方法供子类使用)

      
[AppleScript] 纯文本查看 复制代码
  String format(Date date): 格式化, 从Date对象转换为String对象
        Date parse(String source): 解析, 从String对象转换为Date对象
// 为DateFormat子类重写了
[AppleScript] 纯文本查看 复制代码
String format(Date date)和Date parse(String source)方法,所以我们一般直接调用该方法。
       java.text.SimpleDateFormat类
// SimpleDateFormat构造方法
SimpleDateFormat(String pattern): 用给定的模式和默认语言环境的日期格式符号创建对象
  // 常用模式: 可在SimpleDateFormat类中查看

  
[AppleScript] 纯文本查看 复制代码
y: 年
  M: 月
  d: 日
  H: 时 (24小时制)
  m: 分
  s: 秒
  
  E: 星期
  D: 年中的天
  K: 小时(12小时制)
  S: 毫秒
  
  示例: "yyyy-MM-dd E HH:mm:ss.SSS"
  结果: 2016-04-01 星期五 17:29:15.868

  
  如果要匹配普通的英文字母, 则需要用单引号括起来: "'abc'"
  如果要匹配单引号, 则使用2个单引号: "''"
  
// 使用指定的模式创建对象

[AppleScript] 纯文本查看 复制代码
SimpleDateFormat format = new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss");
1.3 DateFormat类之格式化format方法
String format(Date date)
: 格式化, 从Date对象转换为String对象,并返回

例如, 创建的SimpleDateFormat对象的模式是: new SimpleDateFormat(
"yyyy年MM月dd日  HH:mm:ss"
)


那么, 将Date格式化后就可以是这种样子: 2018年01月02日  03:04:05
具体代码演示如下:
[AppleScript] 纯文本查看 复制代码
public class Test {
        public static void main(String[] args) {
        // 创建SimpleDateFormat对象用于格式化日期为字符串
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss");

        // 创建日期对象(使用当前系统时间)
          Date date = new Date();
        // 格式化
          String s = sdf.format(date);

          System.out.println(s);  // 2018年07月24日  14:45:48
          }
        }


1.4 DateFormat之解析parse(String source)方法    

Date parse(String source): 解析, 从String对象转换为Date对象,并返回Date类型数据
例如, 创建的SimpleDateFormat对象的模式是:

[AppleScript] 纯文本查看 复制代码
new SimpleDateFormat(
"yyyy-MM-dd"
)

要解析为Date对象的字符串必须符合模式: 2000-01-02
具体代码演示如下:
[AppleScript] 纯文本查看 复制代码
public class Test {
        public static void main(String[] args) throws ParseException {
// 已知日期字符串"2000-10-01"
           String s = "2000-10-01";

        // 将该日期字符串解析为日期对象
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
           Date date = sdf.parse(s); // 红线按 Alt + Enter , 选择第一项 Add exception to method signature
           System.out.println(date);
           }
        }

1.5 Calendar对象的获取方式

[AppleScript] 纯文本查看 复制代码
java.util.Calendar抽象类: 代表日历, 提供了不同国家的历法, 封装了很多时间属性

// 静态方法
[AppleScript] 纯文本查看 复制代码
static Calendar getInstance(): 根据当前系统设置获取合适的Calendar对象, 表示当前系统时间

// 获取日历对象的示例

[AppleScript] 纯文本查看 复制代码
Calendar c = Calendar.getInstance();  // 代表了当前时间
补充:Calendar c = Calendar.getInstance() 会根据当前系统获取合适的子类对象。并把当前系统时间作为参数传递到对象的静态变量里。

// 静态成员变量

[AppleScript] 纯文本查看 复制代码
static int YEAR                     :年份
static int MONTH                :月份. 注意月份数值是 0-11
static int DAY_OF_MONTH :月中的日期
static int HOUR                   :小时(12小时制)
static int HOUR_OF_DAY    :小时(24小时制)
static int MINITE                 :分钟
static int SECOND               :秒

// 非静态成员方法
[AppleScript] 纯文本查看 复制代码
 int get(int field): 获取指定日历字段的值  代码为:  int year = cal.get(Calendar.YEAR)
void set(int field, int value): 修改指定日历字段为指定的值
void add(int field, int amount): 调整指定日历字段的值. 正数增加, 负数减少
Date getTime(): Calendar转Date
void setTime(Date d): Date转Calenda

1.6 日期转换总结
longDate对象互转
    利用Date

   
[AppleScript] 纯文本查看 复制代码
 Date(long millis): long转Date
    long getTime(): Date转long

StringDate对象互转

   
[AppleScript] 纯文本查看 复制代码
 利用SimpleDateFormat
    Date parse(String s): String转Date
    String format(Date): Date转String

Calendar对象和Date对象互转
[AppleScript] 纯文本查看 复制代码
     利用Calendar
     Date getTime(): Calendar转Date
    void setTime(Date d): Date转Calendar

三、System类
1.1 System类之获取时间毫秒值
        java.lang.System类: 系统相关功能
// 静态方法

      
[AppleScript] 纯文本查看 复制代码
 static long currentTimeMillis(): 返回当前系统时间的毫秒值

注意:Date date = new Date(); 的空参构造实际上也是调用了System.currentTimeMillis()实现的.
1.2 System类之数组复制方法
java.lang.System类: 系统相关功能
// 静态方法

[AppleScript] 纯文本查看 复制代码
 static void arrayCopy(Object src, int srcPos, Object dest, int destPos, int length): 复制源数组中指定长度个数的元素到一个新数组中
        * Object src: 源数组 (被复制的数组)
        * int srcPos: 源数组索引 (从源数组的哪个索引开始复制)
        * Object dest: 目标数组 (要复制到哪个数组)
        * int destPos: 目标数组索引 (指定目标数组接收元素的索引位置)

        * int length: 长度 (要复制的元素个数)

四、StringBuilder类
1.1 StringBuilder概述与构造
[AppleScript] 纯文本查看 复制代码
java.lang.StringBuilder类: 可变字符序列, 可以高效拼接字符串. 底层使用数组保存
// 构造方法
StringBuilder(): 构造一个空的StringBuilder容器
StringBuilder(String str): String转StringBuilder


1.2   append(任意类型) String拼接方法
StringBuilder append(任意类型): 添加任意类型数据的字符串形式, 并返回当前对象

因为: 实际上+加号在最终执行时, 会被翻译为:
            new StringBuilder("原字符串").append("要拼接的字符串").toString();
            额外创建了多余的StringBuilder对象

作用:String是不可变的, 使用+进行字符串拼接, 会创建很多额外的对象, 浪费内存空间,这就需要StringBuilder类来进行String的实时拼接。
补充append(任意类型)的返回值类型所以可以通过链式调用的方式来减少代码的书写。链式调用时指当一个方法的返回值是一个对象时,可以继续调用该对象的其他方法。
1.3  StringBuilder对象转换为String对象的转换方法
String toString(): 将当前StringBuilder对象转换为String对象,并返回
补充:StringStringBuilder互转: // 通过把String对象作为参数传入构造
StringBuilder(String str): StringStringBuilder
// 通过StringBuilder toString成员方法来转换回String
String toString(): StringBuilderString


五、包装类
1.1 包装类概述
因为集合中无法储存基本数据类型的数据,就需要把数据存入包装类来让集合保存。
对应类型如下:
[td]
基本类型
对应的包装类(位于java.lang包中)
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean


1.2 自动装箱与自动拆箱
装箱: 从基本类型转换为对应的包装类对象
拆箱: 从包装类对象转换为对应的基本类型

JDK 5开始, 装箱和拆箱都是**自动的**
// 自动装箱原理
         Integer i2 = Integer.valueOf(4); //使用包装类中的valueOf方法

// 自动拆箱原理
        int num = i.intValue();

以上代码都是自动默认添加的
1.3 包装类常用方法: 基本类型与字符串之间转换
String转基本类型: 利用包装类的静态方法


   
[AppleScript] 纯文本查看 复制代码
static byte parseByte(String s): 将字符串参数转换为对应的byte基本类型
    static short parseShort(String s): 将字符串参数转换为对应的short基本类型 Short
    static int parseInt(String s): 将字符串参数转换为对应的int 基本类型 Integer
    static long parseLong(String s): 将字符串参数转换为对应的long基本类型
    static float parseFloat(String s): 将字符串参数转换为对应的float基本类型
    static double parseDouble(String s): 将字符串参数转换为对应的double基本类型
    static boolean parseBoolean(String s): 将字符串参数转换为对应的boolean基本类型
一、Collection
1. Collection
1.1 集合概述
集合: 长度可变容器, 可以存储多个对象
集合和数组的区别:
    1. 数组长度不可变; 集合长度可变

    2. 数组可以存基本类型或引用类型, 只能存同一种类型; 集合只能存储引用类型元素, 可以是多种类型元素
Collection接口: 单列集合顶层
        |_ List接口: 元素存取有序, 可重复, 有索引
        |_ Set接口: 元素存取无序, 不可重复, 无索引

先学习使用顶层: 顶层接口/抽象类中共性的方法, 所有子类都可以使用
后学习使用底层: 使用底层子类/实现类创建对象

1.2 Collection常用功能
java.util.Collection接口:
// 成员方法(子类都会实现)

[AppleScript] 纯文本查看 复制代码
 boolean add(E e): 把给定的对象添加到当前集合中
void clear(): 清空集合中所有的元素
boolean remove(E e): 把给定的对象在当前集合中删除
boolean contains(E e): 判断当前集合中是否包含给定的对象
boolean isEmpty(): 判断当前集合是否为空(没有元素)
int size(): 返回集合中元素的个数
Object[] toArray(): 把集合中的元素,存储到数组中

Iterator<E> iterator(): 获取集合的迭代器对象 (后面讲到)
        Iterator接口: 迭代器

二、迭代器
1.1 迭代器Iterator接口介绍和迭代步骤
迭代: 类似于遍历, 判断是否有下一个元素, 有则取出下一个, 直到没有
迭代器: 用于遍历集合的对象

java.util.Collection<E>接口:
// 成员方法(子类都会实现)
[AppleScript] 纯文本查看 复制代码
Iterator<E> iterator(): 获取集合的迭代器对象

java.util.Iterator<E>接口: 迭代器
// 成员方法
[AppleScript] 纯文本查看 复制代码
boolean hasNext(): 判断是否有下一个元素
E next(): 获取下一个元素
void remove(): 删除next指向的元素


使用迭代器遍历集合的3步:
1. 使用集合对象的 iterator() 获取迭代器对象, 用 Iterator 接口接收.(多态)
2. 使用 Iterator 接口中的 hasNext() 方法, 判断是否有下一个元素

3. 使用 Iterator 接口中的 next() 方法, 获取下一个元素
1.2  增强for循环
增强for: 也称foreach循环, JDK 5出现, 用于遍历集合, 底层采用迭代器
作用:
        遍历数组
        遍历集合
增强for格式:

         for(元素的数据类型 变量名 : Collection集合或数组名){
            //操作代码  
      }


增强for对于数组和集合的操作:
对数组只是写法上的优化, 底层还是普通for循环

对集合是通过迭代器实现的
补充:增强for, 普通for, 迭代器的区别:
增强for:
    优点: 获取元素很方便, 格式简单
    缺点: 没有普通for中的索引, 没有迭代器对象可以进行元素的增删
    应用场景: 适用于遍历获取数组和集合元素的场景
普通for:
    优点: 有索引可以使用, 某些方式可以在遍历过程中增删元素
    缺点: 格式繁琐
    应用场景: 需要用到索引的场景
迭代器:
    优点: 可以使用迭代器对象的方法操作元素
    缺点: 格式繁琐
    应用场景: 需要在迭代过程中增删元素的场景
三、泛型
1.1泛型的概述以及不使用泛型产生的问题泛型: Generic. JDK 5 增加. 是一种未知的数据类型
    定义集合时, 某些方法不知道使用什么类型时, 就可以使用泛型
    创建集合对象时, 需要确定泛型具体的类型
    泛型可以看作是一个变量, 用来接收数据类型
1.2 泛型的好处不使用泛型的问题:
         集合实际存储的是 Object 类型, 存入的元素无论是什么类型, 都会被提升为 Object, 取出来的也是 Object, 要想调用元素特有方法, 就要向下转型, 有可能发生类型转换异常 ClassCastException

泛型的好处:
         1. 避免了类型转换的麻烦
         2. 将运行时的类型转换异常, 转移到了编译时期 (有利于程序员提前发现问题)
1.3 定义和使用含泛型的类泛型的定义和使用
    泛型在定义时, 不能是具体的类型, 只是一个变量名
    泛型在使用时, 必须是具体的数据类型

// 带有泛型的类定义格式
      修饰符 class 类名<代表泛型的名字> {  // 泛型的变量一般用一个大写字母表示, 但也可以是多个字母

    }
   
    类中泛型在创建对象时, 确定泛型的具体类型
1.4 定义含有泛型的方法与使用方法中的泛型定义位置:
    修饰符 和 返回值类型 之间

// 带有泛型的方法定义格式
     修饰符 <代表泛型的名字> 返回值类型 方法名(参数){

    }
   
  方法中定义泛型后, 返回值类型和参数类型都可以使用泛型

方法泛型的使用:
    在调用方法时确定泛型的具体类型
1.5 定义与使用含有泛型的接口定义泛型接口与定义泛型类一样
// 带有泛型的类定义格式
      修饰符 interface接口名<代表泛型的变量> {

    }
实现类实现了泛型接口后可以有2种选择:
  1. 定义实现类时就确定泛型的具体类型
  2. 定义实现类时仍然沿用泛型, 直到创建该类对象时才确定泛型的具体类型
1.6 总结定义在类上的泛型:
    有效范围: 整个类中都有效
    何时确定具体类型: 创建该类对象时确定泛型的具体类型
定义在方法上的泛型:
    有效范围: 方法中(包括返回值类型和参数类型)有效
    何时确定具体类型: 调用方法传参时确定泛型的具体类型
定义在接口上的泛型:
    有效范围: 接口中
    何时确定具体类型:
    1. 子接口或实现类定义时确定泛型的具体类型
    2. 创建实现类对象时确定泛型的具体类型
1.7 泛型通配符  
[AppleScript] 纯文本查看 复制代码
泛型通配符: 
[/size][/font][/size][/color][/font][/align][align=left][font=微软雅黑][color=black][size=4][font=Microsoft YaHei][size=3]
[/size][/font][/size][/color][/font][/align][align=left][font=微软雅黑][color=black][size=4][font=Microsoft YaHei][size=3]        不知道使用什么类型来接收时, 此时可以使用 [b]<?>[/b] 来表示未知通配符
        示例: [b]List<?> list[/b]  接收泛型是任意类型的[b]List[/b]对象
        注意: 只能接收数据, 不能调用方法存储元素[/size][/font][/size][/color][/font][/align][align=left][font=微软雅黑][color=black][size=4][font=Microsoft YaHei][size=3]             [mw_shl_code=applescript,true]   List<?> list 这种集合不能调用 add() 添加元素, 只能调用 get() 获取元素
                List<?> list 其实是一个变量, 所以可以将一个集合赋值给它
                        如: List<?> list = new ArrayList<String>();

        使用方式:
                不能创建对象使用
                只能作为方法参数使用. (减少方法重载)

泛型的上限:
        
[AppleScript] 纯文本查看 复制代码
格式: 类型名称<? extends 类名> 对象名称
        示例: List<? extends Number> list
        作用: 只能接收该类型及其子类 (Number及其子类的泛型)


泛型的下限:
      
[AppleScript] 纯文本查看 复制代码
 格式: 类型名称<? super 类名> 对象名称
        示例: List<? super Number> list
        作用: 只能接收该类型及其父类型 (Number及其父类的泛型)
[/mw_shl_code]







0 个回复

您需要登录后才可以回帖 登录 | 加入黑马