1. Collection 集合 没有长度限制
- Set 接口实例存储的是无序的,不重复的数据。
- List 接口实例存储的是有序的,可以重复的元素。
List 可以重复
- ArrayList 底层用数组,长度有限,有动态添加空间代码 数组存放在连续空间,查找高效
- LinkedList 链表 插入和删除效率高,做更新操作
- Vector 线程安全,如果多个线程使用集合中的元素 使用了锁机制
因为平时把数据从数据库中拿出来,更多是做查询操作,所以ArrayList用的多
Set 更像数学上的集合,不能重复
- HashSet 不允许出现重复元素,不保证集合中元素的顺序,允许包含值为 null 的元素,但最多只能一个。
- 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)
- hashMap
- TreeMap
- 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();
处理异常:
- try ... catch ... finally
- 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 男