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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Java-yao 初级黑马   /  2018-11-14 17:14  /  899 人查看  /  5 人回复  /   3 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Java-yao 于 2018-11-14 17:23 编辑

day01 Object类 常用API

1. Object
java.lang.Object 类: 根类, 所有类的父类
Object类的特点:
1. Object类是所有类的根类
2. 所有类的对象都能使用Object继承下来的方法

1.1 toString方法
public String toString() :返回该对象的字符串表示
[Java] 纯文本查看 复制代码
String s = person.toString(); //调用方法 person 对象名


重写toString()方法
目的: 查看JavaBean的属性值
操作: Alt+ Insert, 选择 toString() , 全选
[Java] 纯文本查看 复制代码
// 生成toString: Alt + Insert, 选择 toString, 全选所有属性

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
[/table]
1.2 equals方法
public boolean equals(Object obj) :指示其他某个对象是否与此对象"相等"

重写equals()方法
目的: 比较两个对象的属性值判断对象是否相等
操作: Alt+ Insert, 选择 equals() and hashCode(), 全选
[Java] 纯文本查看 复制代码
// Alt + Insert, 选择 equals() and hashCode()
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }


2. 毫秒值的概念和作用
时间原点: 从 0时区 1970-01-01 00:00:00 开始, 至今经过的毫秒值(1 秒 = 1000 毫秒)

2.1 Date类: 构造方法, 成员方法
注意: 不要导错包! 有2个包中都有Date类, 我们用的是 java.util.Date

java.util.Date类: 日期类, 表示特定的瞬间, 精确到"毫秒"
        // 构造方法
        Date(): 创建Date对象, 表示当前系统时间
        Date(long date): 创建Date对象, 使用指定的毫秒值作为时间
        // 常用成员方法
        long getTime(): 获取Date对象中保存的时间毫秒值
        void setTime(long time): 修改Date对象的时间  

DateFormat类和SimpleDateFormat
java.text.DateFormat抽象类: 用于格式化和解析时间. 提供了方便的方法
        // 常用成员方法 (抽象类不能创建对象, 但可以有非抽象的方法供子类使用)
        String format(Date date): 格式化, 从Date对象转换为String对象
        Date parse(String source): 解析, 从String对象转换为Date对象

java.text.SimpleDateFormat
        // 构造方法
        SimpleDateFormat(String pattern): 用给定的模式和默认语言环境的日期格式符号创建对象
// 使用指定的模式创建对象
SimpleDateFormat format = new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss");

// 常用模式: 可在SimpleDateFormat类中查看
                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

格式化format()方法, 解析parse()方法
String format(Date date): 格式化, 从Date对象转换为String对象
        例如, SimpleDateFormat对象的模式是: "yyyy年MM月dd日  HH:mm:ss"
        那么, 将Date格式化后就可以是这种样子: 2018年01月02日  03:04:05

Date parse(String source): 解析, 从String对象转换为Date对象
        例如, SimpleDateFormat对象的模式是: "yyyy-MM-dd"
        要解析为Date对象的字符串必须符合模式: 2000-01-02

2.2 Calendar类: 获取Calendar对象
java.util.Calendar抽象类: 代表日历, 提供了不同国家的历法, 封装了很多时间属性
// 静态方法
static Calendar getInstance(): 根据当前系统设置获取合适的Calendar对象, 表示当前系统时间

// 获取日历对象的示例
Calendar c = Calendar.getInstance();  // 代表了当前时间

Calendar类: 常用功能
java.util.Calendar抽象类: 代表日历, 提供了不同国家的历法, 封装了很多时间属性
        // 静态成员变量
[Java] 纯文本查看 复制代码
        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       :秒

        // 非静态成员方法  2018 09 11
[Java] 纯文本查看 复制代码
        [mw_shl_code=java,true]int get(int field): 获取指定日历字段的值   int date = cal.get(Calendar.DAY_OF_MONTH)
        void set(int field, int value): 修改指定日历字段为指定的值
        void set(int year, int month, int date): 快速设置年月日
        void add(int field, int amount): 调整指定日历字段的值. 正数增加, 负数减少
        Date getTime(): Calendar转Date
        void setTime(Date d): Date转Calendar
[/mw_shl_code]

[Java] 纯文本查看 复制代码
// 示例
// 获取日期: 
int day = calendar.get(Calendar.DAY_OF_MONTH);
// 修改年: 
calendar.set(Calendar.YEAR, 2000);
// 修改月: 
calendar.set(Calendar.MONTH, 0);
// 日期增加一天: 
calendar.add(Calendar.DAY_OF_MONTHY, 1);
// 日期减少一天: 
calendar.add(Calendar.DAY_OF_MONTHY, -1);


3. System类
currentTimeMillis()和arrayCopy()方法
java.lang.System类: 系统相关功能
[Java] 纯文本查看 复制代码
        // 静态方法
        static long currentTimeMillis(): 返回当前系统时间的毫秒值
        static void arrayCopy(Object src, int srcPos, Object dest, int destPos, int length): 

复制源数组中指定长度个元素到一个新数组中

* Object src: 源数组 (被复制的数组)
        * int srcPos: 源数组索引 (从源数组的哪个索引开始复制)
        * Object dest: 目标数组 (要复制到哪个数组)
        * int destPos: 目标数组索引 (指定目标数组接收元素的索引位置)
        * int length: 长度 (要复制的元素个数)

4. StringBuilder类
+号拼接字符串的问题:
        String是不可变的, 使用加号进行字符串拼接, 会创建很多额外的对象, 浪费内存空间

StringBuilder: 构造方法和append()拼接方法
java.lang.StringBuilder类: 可变字符序列, 可以高效拼接字符串. 底层使用数组保存
[Java] 纯文本查看 复制代码
        // 构造方法
        StringBuilder(): 构造一个空的StringBuilder容器
        StringBuilder(String str): String转StringBuilder
        // 常用方法
        StringBuilder append(任意类型): 添加任意类型数据的字符串形式, 并返回当前对象


链式调用:   
        new StringBuilder().append(1).append("hello").append(true);

StringBuilder: toString()
java.lang.StringBuilder类: 可变字符序列, 可以高效拼接字符串. 底层使用数组保存
        // 成员方法
        String toString(): 将当前StringBuilder对象转换为String对象

5. 包装类: 概述
包装类: 基本数据类型对应的引用数据类型
[table=0]
基本类型
对应的包装类(位于java.lang包中)

byte
Byte

short
Short

int
Integer

long
Long

float
Float

double
Double

char
Character

boolean
Boolean

5.1 包装类: 装箱与拆箱
装箱: 从基本类型转换为对应的包装类对象
[Java] 纯文本查看 复制代码
        装箱原理: 
        //Integer i1 = new Integer(1);
        //Integer i2 = new Integer("1");
        Integer i3 = Integer.valueOf(1); //使用包装类中的静态方法valueOf()
拆箱: 从包装类对象转换为对应的基本类型
        拆箱原理:
        int num = i.intValue();

5.2 包装类: 自动装箱与自动拆箱
JDK 5开始, 装箱和拆箱都是自动的
[Java] 纯文本查看 复制代码
[mw_shl_code=java,true]Integer i = 10;
int a = i;

ArrayList<Integer> list = new ArrayList<>();
list.add(10);
int a = list.get(0);
[/mw_shl_code]

5.3 包装类常用方法: 基本类型与字符串之间转换
基本类型转为String:
        1. 拼接空字符串:
                String s = "" + 34
        2. 每个包装类中的静态方法 static String toString(参数):
                String s = Integer.toString(10);
        3. String类中的静态方法 static String valueOf(参数):
                String s = String.valueOf(10);

String转基本类型: 利用每种包装类中的静态方法
[Java] 纯文本查看 复制代码
    static byte parseByte(String s): 将字符串参数转换为对应的byte基本类型
    static short parseShort(String s): 将字符串参数转换为对应的short基本类型
    static int parseInt(String s): 将字符串参数转换为对应的int基本类型
    static long parseLong(String s): 将字符串参数转换为对应的long基本类型
    static float parseFloat(String s): 将字符串参数转换为对应的float基本类型
    static double parseDouble(String s): 将字符串参数转换为对应的double基本类型
    static boolean parseBoolean(String s): 将字符串参数转换为对应的boolean基本类型

    注意: 没有转char的!!
day02 泛型

1. Collection集合的常用功能

java.util.Collection<E>接口:
[Java] 纯文本查看 复制代码
       // 成员方法(子类都会实现)
boolean add(E e): 把给定的对象添加到当前集合中
void clear(): 清空集合中所有的元素
boolean remove(E e): 把给定的对象在当前集合中删除
boolean contains(E e): 判断当前集合中是否包含给定的对象
boolean isEmpty(): 判断当前集合是否为空(没有元素)
int size(): 返回集合中元素的个数
Object[] toArray(): 把集合中的元素,存储到数组中
Iterator<E> iterator(): 获取集合的迭代器对象 (后面讲到)
Iterator接口: 迭代器


测试Collection接口的方式:

        使用多态方式创建对象: Collection c = new ArrayList();

        编译看左边, 这样只能调用Collection接口中定义的方法, 不会出现子类特有方法


2. 迭代器Iterator接口介绍和迭代步骤

迭代:

        类似于遍历, 判断是否有下一个元素, 有则取出下一个, 直到没有

迭代器:

        用于遍历集合的对象


java.util.Collection<E>接口:

        // 成员方法(子类都会实现)

        Iterator<E> iterator(): 获取集合的迭代器对象


java.util.Iterator<E>接口: 迭代器

        // 成员方法

        boolean hasNext(): 判断是否有下一个元素

        E next(): 获取下一个元素


        void remove(): 删除next指向的元素


使用迭代器遍历集合的3步:

        1. 使用集合对象的 iterator() 获取迭代器对象, 用 Iterator 接口接收.(多态)

        2. 使用 Iterator 接口中的 hasNext() 方法, 判断是否有下一个元素

        3. 使用 Iterator 接口中的 next() 方法, 获取下一个元素


迭代器遍历集合的标准写法:
[Java] 纯文本查看 复制代码
Iterator<元素类型> iterator = 集合对象.iterator();

while (iterator.hasNext()) {

    元素类型 变量名 = iterator.next();

}

迭代器的实现原理

集合和迭代器对象的关系:

        每个集合都有对应的一个迭代器对象


迭代器的原理:

        迭代器有一个指针(其实就是个变量, 保存索引值), 最初指向集合的 0 位置

        hasNext() 方法可以判断当前索引是否有元素

        next() 方法返回当前元素, 并移动指针到下一个索引


迭代器的并发修改异常

并发修改异常的原因:

        在使用迭代器迭代的过程中, 如果执行了改变集合长度的操作 (如 add(), remove(), clear()), 则会抛出 ConcurrentModificationException 并发修改异常.


如何避免:

        1. 迭代过程中不要修改集合长度

        2. 在迭代的过程中添加, 删除元素, 要使用迭代器自带的方法, 而不能使用集合的方法

                Iterator中的 remove() 方法

                ListIterator中的 add(), remove() 方法


3. 增强for循环

        也称foreach循环, JDK 5出现, 用于遍历集合, 底层采用迭代器


作用:

        遍历数组

        遍历集合


增强for格式:


    for(元素的数据类型 变量名 : Collection集合或数组名){

        //操作代码  

    }


[Java] 纯文本查看 复制代码
    // 数组示例
    int[] arr = {1,2,3};
    for (int i : arr) {
        System.out.println(i);
    }

        // 集合示例
    Collection<Integer> c = new ArrayList<>();
    for (int i : c) {
        System.out.println(i);
    }


增强for对于数组和集合的操作:

        对数组只是写法上的优化, 底层还是普通for循环

        对集合是通过迭代器实现的


增强for, 普通for, 迭代器的区别:

        增强for:

                优点: 获取元素很方便, 格式简单

                缺点: 没有普通for中的索引, 没有迭代器对象可以进行元素的增删

                应用场景: 适用于遍历获取数组和集合元素的场景

        普通for:

                优点: 有索引可以使用, 某些方式可以在遍历过程中增删元素

                缺点: 格式繁琐

                应用场景: 需要用到索引的场景

        迭代器:

                优点: 可以使用迭代器对象的方法操作元素

                缺点: 格式繁琐

                应用场景: 需要在迭代过程中增删元素的场景


4. 泛型的概述以及不使用泛型产生的问题

Generic Type. JDK 5 增加. 是一种未知的数据类型

        定义集合时, 某些方法不知道使用什么类型时, 就可以使用泛型

        创建集合对象时, 需要确定泛型具体的类型


泛型可以看作是一个"变量", 用来接收数据类型

定义:

<E>: 声明了一个泛型 (声明了一个变量)

E: 使用E这种类型作为数据类型  (参数数据类型, 返回值类型)

使用:

ArrayList<Integer>: 确定了泛型的具体类型


[Java] 纯文本查看 复制代码
public class ArrayList<E> {   // E可以表示任意的引用类型, 但是只能表示某一种
        String name;
        int age;
        E e;
        public boolean add(E e){}  String
        public E get(int index){}
}


泛型的好处

        1. 避免了类型转换的麻烦

        2. 将运行时的类型转换异常, 转移到了编译时期 (有利于程序员提前发现问题)


定义和使用含泛型的类

定义泛型

        <泛型名>


泛型的"定义"和"使用"

        泛型在"定义"时, "不能是"具体的类型, 只是一个变量名: public class ArrayList<E> {}

        泛型在"使用"时, "必须是"具体的数据类型 ArrayList<Integer>


    // 带有泛型的类定义格式

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


    }


类中的泛型, "在创建对象时", 确定泛型的具体类型


定义含有泛型的方法与使用

方法中的泛型定义位置:

        修饰符 和 返回值类型 之间


        // 带有泛型的方法定义格式

    修饰符 <代表泛型的名字> 返回值类型 方法名(参数){
    }
方法中定义泛型后, 返回值类型和参数类型都可以使用泛型
方法泛型的使用:
        "在调用方法时"确定泛型的具体类型

定义与使用含有泛型的接口
定义泛型接口与定义泛型类一样
    // 带有泛型的类定义格式
    修饰符 interface 接口名<代表泛型的变量> {
    }

[Java] 纯文本查看 复制代码
 [/align][/align][/align][align=left]public interface GenericInterface<I> {[/align]
[align=left]void method(I i);[/align]
[align=left]}


泛型定义总结:
        定义在类上的泛型:
                有效范围: 整个类中都有效
                何时确定具体类型: 创建该类对象时确定泛型的具体类型
        定义在方法上的泛型:
                有效范围: 方法中(包括返回值类型和参数类型)有效
                何时确定具体类型: 调用方法传参时确定泛型的具体类型
        定义在接口上的泛型:
                有效范围: 接口中
                何时确定具体类型:
                        1. 子接口或实现类定义时确定泛型的具体类型
                        2. 创建实现类对象时确定泛型的具体类型

5. 泛型通配符

        不知道使用什么类型来接收时, 此时可以使用 <?> 来表示未知通配符
        示例: List<?> list  接收泛型是任意类型的List对象
[Java] 纯文本查看 复制代码
        public void addAll(List<?> list){
                        // ...
        }
                ArrayList<Integer> list1 = new ArrayList<>();
                ArrayList<String> list2 = new ArrayList<>();
                addAll(list1);
                addAll(list2);

        注意: 只能接收数据, 不能调用方法存储元素
                List<?> list 这种集合不能调用 add() 添加元素, 只能调用 get() 获取元素
                List<?> list 其实是一个变量, 所以可以将一个集合赋值给它
                        如: List<?> list = new ArrayList<String>();  // 正确
                但是不能直接new 泛型为?的集合对象:
                        如: List<?> list = new ArrayList<?>();  // 错误
        使用方式:
                不能创建对象使用
                只能作为方法参数使用. (减少方法重载)

泛型的上限:

        格式: 类型名称<? extends 类名> 对象名称
        示例: List<? extends Number> list
        作用: 只能接收泛型为该类型及其子类的对象 (Number及其子类的泛型)

泛型的下限:

        格式: 类型名称<? super 类名> 对象名称
        示例: List<? super Number> list
        作用: 只能接收泛型为该类型及其父类型的对象 (Number及其父类的泛型)








5 个回复

倒序浏览
66666666666666666666666
回复 使用道具 举报
话说你可以去csdn上注册个博客,去那发!!
回复 使用道具 举报
你这个就有点牛皮了
回复 使用道具 举报
9999999,你都牛翻了.我要收藏一下,我前面学习从没写过笔记.感谢.祝帖主早日键盘敲懒!!!
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马