Day3 - 高级应用

1. Collection 集合 没有长度限制

  • Set 接口实例存储的是无序的,不重复的数据。
  • List 接口实例存储的是有序的,可以重复的元素。

List 可以重复

  1. ArrayList 底层用数组,长度有限,有动态添加空间代码 数组存放在连续空间,查找高效
  2. LinkedList 链表 插入和删除效率高,做更新操作
  3. Vector 线程安全,如果多个线程使用集合中的元素 使用了锁机制
    因为平时把数据从数据库中拿出来,更多是做查询操作,所以ArrayList用的多

Set 更像数学上的集合,不能重复

  1. HashSet 不允许出现重复元素,不保证集合中元素的顺序,允许包含值为 null 的元素,但最多只能一个。
  2. TreeSet 可以对元素排序

判断集合中2个元素是否重复,涉及到类对象的比较(hashCode)

  • 实现 Comparable 接口的 compareTo 方法使得类可以比较,并确定比较规则
  • 重写 hashCode 方法,使得属性值相同的对象的 hashCode 相同
  • 重写 equals 方法,能使 equals 返回 true,但是两个对象 hashCode 还不同,HashSet 在添加时还视为 2 个不同的对象

注意,如果只重写了 hashCode,两个内容相同的对象调用 equals 方法依然返回 false,说明默认的 equals 方法并不是比较 hashCode

Object 类 equals 方法

public boolean equals(Object obj) {
    return (this == obj);
}

HashSet 实例

Customer 类

public class Customer implements Comparable {

    private String name;
    private int age;

    public Customer() {
    }

    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override // 重写 equals 
    public boolean equals(Object obj) {
        if (obj instanceof Customer) {
            Customer c = (Customer) obj;
            if (c.getName().equals(name) && age == c.getAge())
                return true;
        }
        return false;
    }

    @Override // 重写 hashCode 使得属性值相同的对象的 hashCode 相同
    public int hashCode() {
        return name.hashCode() + age;
    }

    @Override // 实现 Comparable 接口的 compareTo 方法使得类可以比较,并确定比较规则
    public int compareTo(Object o) { // 按年龄升序排列
        if (o instanceof Customer) {
            Customer c = (Customer) o;
            if (age < c.getAge()) return -1; // this < o
            else if (age > c.getAge()) return 1; // this > o
            else return 0; // this = o
        }
        return 0;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类

public class Set_HashSet {
    public static void main(String[] args) {
        Set<Customer> set = new HashSet<>();

        Customer c1 = new Customer("Tom", 20);
        Customer c2 = new Customer("Tom", 20);

        // HashSet 添加
        set.add(c1);
        set.add(c2);

        // equals
        System.out.println(c1.equals(c2));

        // hashCode
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());

        System.out.println(set.size());

        for (Object o : set) { // Object 是 Customer 的父类
            System.out.println(o); // 体现 重写toString 的多态性
        }
    }
}
true
84294
84294
1
Customer{name='Tom', age=20}

测试 String 对象

public class Set_HashSet {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();

        String s1 = "hello";
        String s2 = "hello";

        set.add(s1); // 虽然是2个对象,但是String内部重写了hashCode
        set.add(s2);

        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        System.out.println(s1.equals(s2));
        
        System.out.println(set.size());

        for (Object o : set) { // 自定义的类基本都继承了Object类
            System.out.println(o); // 体现 重写toString 的多态性
        }
    }
}
99162322
99162322
true
1
hello

可以看出 String 内部已经完成了这些操作。

2. Map (key, value)

  1. hashMap
  2. TreeMap
  3. HashTable 线程安全 防止多个线程同时索取共享资源发生崩溃

3. 泛型

4. 反射

java.lang.Class 没有构造器

Class c = t.getClass

Class 所有的类都是 Class 类的对象
Filed 所有的属性
Constructor 构造器
Method 方法

5. 异常

public class Exception extends Throwable { }

分类

  • 编译时异常 checked (继承 Exception)
  • 运行时异常 unchecked (继承 RuntimeException)

抛异常
throw new Exception();

处理异常:

  1. try ... catch ... finally
  2. throws xxException
try {
    throw new Exception(); // 抛异常
    // 如果异常,后面的代码不执行,直接到catch
    ...
} catch (Exception e) { // 打印异常信息栈
    e.printStackTrace(); 
    System.out.println(e.getMessage());
} finally {
    // 不管是否异常都可以执行
}

谁调用就把异常抛给谁,如果没有处理,再向上抛,直到给 JVM

自定义异常

6. IO 流 - 输入输出

数据持久化:平时的数据加载到内存运行后就被 JVM 垃圾回收机制释放掉了,通过 IO 流将数据输入到外部文件中,可以在将来还使用这些数据。

计算机中的数据传输必须要序列化 java.io.NotSerializableException
数据写入写出的时候,必须要指定序列化。
类对象需要输出,需要 implement Serializable

public class Customer implements Comparable, Serializable { }

7. 创建数据库

用户和环境
SQL> create user briup identified by briup;

用户已创建。

SQL> grant connect, resource to briup;

授权成功。

SQL> conn briup/briup
已连接。
SQL> select table_name from user_tables; -- 查看当前用户下的表

未选定行

SQL> select sysdate from dual; -- 目前语言环境为中文

SYSDATE
--------------
16-8月 -17

SQL> alter session set nls_language=english; -- 修改语言环境

Session altered.

SQL> select sysdate from dual; -- 修改为英文

SYSDATE
------------
16-AUG-17
建表
SQL> @ c:\table.sql

Table created.
...
Commit complete.

SQL> select table_name from user_tables;

TABLE_NAME
------------------------------------------------------------
S_DEPT
S_EMP
S_REGION

SQL> desc S_EMP; -- 查看表结构
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 ID                                                    NOT NULL NUMBER(7)
 LAST_NAME                                             NOT NULL VARCHAR2(25)
 FIRST_NAME                                                     VARCHAR2(25)
 USERID                                                         VARCHAR2(8)
 START_DATE                                                     DATE
 COMMENTS                                                       VARCHAR2(255)
 MANAGER_ID                                                     NUMBER(7)
 TITLE                                                          VARCHAR2(25)
 DEPT_ID                                                        NUMBER(7)
 SALARY                                                         NUMBER(11,2)
 COMMISSION_PCT                                                 NUMBER(4,2)

SQL> desc s_region
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 ID                                                    NOT NULL NUMBER(7)
 NAME                                                  NOT NULL VARCHAR2(50)

SQL> desc S_DEPT
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 ID                                                    NOT NULL NUMBER(7)
 NAME                                                  NOT NULL VARCHAR2(25)
 REGION_ID                                                      NUMBER(7)
查询

员工姓名,薪水,工作部门,部门所在区域 并按照薪水降序排列

SQL> select e.FIRST_NAME, e.LAST_NAME, e.SALARY, d.NAME, r.NAME
  2  from S_EMP e, S_DEPT d, S_REGION r
  3  where e.DEPT_ID = d.ID and d.REGION_ID = r.ID
  4  order by e.SALARY desc;

FIRST_NAME   LAST_NAME        SALARY NAME                           NAME
------------ ------------ ---------- ------------------------------ ------------------------------
Carmen       Velasquez          2500 Administration                 North America
Audry        Ropeburn           1550 Administration                 North America
Mai          Nguyen             1525 Sales                          Asia
Yasmin       Sedeghi            1515 Sales                          Africa / Middle East
Henry        Giljum             1490 Sales                          South America
Mark         Quick-To-See       1450 Finance                        North America
LaDoris      Ngao               1450 Operations                     North America
Andre        Dumas              1450 Sales                          Europe
Colin        Magee              1400 Sales                          North America
Midori       Nagayama           1400 Sales                          North America
Elena        Maduro             1400 Operations                     North America
Marta        Havel              1307 Operations                     Europe
Antoinette   Catchpole          1300 Operations                     Asia
Roberta      Menchu             1250 Operations                     South America
Akira        Nozaki             1200 Operations                     South America
Molly        Urguhart           1200 Operations                     North America
Sylvie       Schwartz           1100 Operations                     Europe
Ben          Biri               1100 Operations                     Africa / Middle East
George       Smith               940 Operations                     North America
Bela         Dancs               860 Operations                     Europe
Alexander    Markarian           850 Operations                     Africa / Middle East
Eddie        Chang               800 Operations                     Asia
Vikram       Patel               795 Operations                     South America
Radha        Patel               795 Sales                          Asia
Chad         Newman              750 Operations                     Africa / Middle East

25 rows selected.
表样式调整
SQL> set pagesize 100  -- 最大行数
SQL> set line 100 -- 最大行宽
SQL> col name format a30 -- 设置 NAME 列宽为 30 字符

DataType

  • number(8, 2)
  • date
  • varchar2(32), char, varchar

Constraint

  • primary key
  • not null
  • unique
  • foreign key
  • check ( cAddress in ('北校区','南校区','新校区','铁道校区','湘雅校区') );
自己建表

一对多,在多的一端建外键。

drop table tbl_user;
create table tbl_user(
    id number(8) primary key,
    name varchar2(20),
    age number(4),
    gender varchar2(8)
);

drop table tbl_order;
create table tbl_order(
    id number(8) primary key,
    order_date date,
    user_id number(8),
    constraint order_user_id_fk
    foreign key(user_id) references tbl_user(id)
);
事务

单一性、原子性
要么全部成功,要么全部失败

SQL> savepoint A;

保存点已创建。

SQL> insert into tbl_user values(1,'谢帅',21, '男');

已创建 1 行。

SQL> select * from tbl_user;

        ID NAME                                            AGE GENDER
---------- ---------------------------------------- ---------- ----------------
         1 谢帅                                             21 男

SQL> rollback to A;

回退已完成。

SQL> select * from tbl_user;

未选定行
序列
drop sequence seq_test;
create sequence seq_test
    start with 45
    increment by 2
    maxvalue 60
    cycle
    nocache;

insert into tbl_user values(seq_test.nextval,'谢帅',21, '男');
SQL> @ d:\create_sequence

序列已创建。

SQL> select seq_test.nextval from dual;

   NEXTVAL
----------
        45

SQL> select seq_test.nextval from dual;

   NEXTVAL
----------
        47

SQL> select seq_test.currval from dual;

   CURRVAL
----------
        47

SQL> savepoint A;

保存点已创建。

SQL> insert into tbl_user values(seq_test.nextval,'谢帅',21, '男');

已创建 1 行。

SQL> select * from tbl_user;

        ID NAME                                            AGE GENDER
---------- ---------------------------------------- ---------- ----------------
        49 谢帅                                             21 男
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,582评论 18 399
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,693评论 0 11
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,213评论 0 2
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,046评论 0 4
  • iOS6新特征:UICollectionView介绍: http://www.devdiv.com/forum.p...
    楚雨荨阅读 255评论 0 1