0%

  • 创建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    /*
    有参构造
    参数大于0,创建初始容量等于参数
    等于0,创建空
    */
    public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
    this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
    this.elementData = EMPTY_ELEMENTDATA;
    } else {
    throw new IllegalArgumentException("Illegal Capacity: "+
    initialCapacity);
    }
    }

    /*
    无参构造
    创建空,这里常量空数组定义与有参空数组不同
    为了扩容时区分
    */
    public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

    /*
    参数是集合子类
    size不为0时,若传入集合本身就是ArrayList,直接指向
    否则,复制一遍
    */
    public ArrayList(Collection<? extends E> c) {
    Object[] a = c.toArray();
    if ((size = a.length) != 0) {
    if (c.getClass() == ArrayList.class) {
    elementData = a;
    } else {
    elementData = Arrays.copyOf(a, size, Object[].class);
    }
    } else {
    // replace with empty array.
    elementData = EMPTY_ELEMENTDATA;
    }
    }
  • /*
    将当前列表容量最小化,为了最小化存储
    */
    public void trimToSize() {
        modCount++;
        if (size < elementData.length) {
            elementData = (size == 0)
              ? EMPTY_ELEMENTDATA
              : Arrays.copyOf(elementData, size);
        }
    }
    
    /*
    将当前列表容量扩容到能包含指定参数的大小
    注意通过无参构造的“空”不会扩容,另外若需要大小小于等于10,也不会扩容
    */
    public void ensureCapacity(int minCapacity) {
            if (minCapacity > elementData.length
                && !(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
                     && minCapacity <= DEFAULT_CAPACITY)) {
                modCount++;
                grow(minCapacity);
            }
        }
    
     private Object[] grow(int minCapacity) {
            return elementData = Arrays.copyOf(elementData,
                                               newCapacity(minCapacity));
        }
    
    /*
    重点
    新大小等于原来大小+原来大小的一半(向下取整)
    如果还不够,
    如果本来就是无参构造的空数组,扩容到10和新大小的最大值
    */
    private int newCapacity(int minCapacity) {
            // overflow-conscious code
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if (newCapacity - minCapacity <= 0) {
                if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                    return Math.max(DEFAULT_CAPACITY, minCapacity);
                if (minCapacity < 0) // overflow
                    throw new OutOfMemoryError();
                return minCapacity;
            }
            return (newCapacity - MAX_ARRAY_SIZE <= 0)
                ? newCapacity
                : hugeCapacity(minCapacity);
        }
    

  • Collection接口
    • List接口:存储有序的,可重复的数据
      • ArrayList:作为List接口的主要实现类,线程不安全,效率高,底层使用Object[]
      • LinkedList:底层使用双向链表,频繁插入删除
      • Vector:作为List古老实现类,线程安全,效率低
    • Set接口
      • HashSet:作为Set接口主要实现类,线程不安全,可以存null值
      • LinkedHashSet:HashSet的子类,遍历按添加顺序,用于频繁遍历
      • TreeSet:红黑树实现,数据要是同一个类,可以按指定属性排序
  • Map接口
    • HashMap:Map的主要实现类,线程不安全,效率高,可以存null的key和value
    • LinkedHashMap:HashMap的子类,遍历按添加顺序,用于频繁遍历
    • TreeMap:按照添加的key-value排序,实现排序遍历,此时考虑key的排序,底层使用红黑树
    • Hashtable:古老实现类,线程安全,效率低,不能存null
    • Properties:Hashtable子类,key和value都是String,常用来处理配置文件

使用Iterator接口遍历Collection

创建本地仓库与添加文件

  • 转到需要创建仓库的目录下
  • git init创建.git隐藏目录
  • git status查看文件管理状态
  • git add * 添加目录下所有文件到本地仓库,还未提交
  • git commit -m ‘备注’ 提交到仓库

上传远程仓库

  • ssh-keygen -t rsa -C “邮箱” 创建密钥(若有可忽略)
  • git remote add origin xxxx.git
  • git push -u origin master

1
2
3
4
5
-- 插入语句
-- insert into 表名 (字段名1, 字段名2, ...) values(值1.1,值1.2,...), (数据2), ...
-- 主键自增可以忽略
-- 不写表字段就会一一匹配
-- 一般写插入语句, 一定要数据和字段一一对应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 学生表(从表)的gradeid字段 要去引用年级表(主表)的gradeid
-- 定义外键key
-- 给这个外键添加约束 (执行引用) references

-- 创建表时
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)

-- 修改表
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade` (`gradeid`)

-- 以上操作都是物理外键, 数据库级别外键, 不建议使用, 避免数据库过多造成困扰
-- 最佳实践:
-- 数据库就是单纯的表,只用来存数据,只有行和列
-- 我们想使用多张表的数据,想使用外键,用程序实现

1
2
3
SHOW CREATE DATABASE school -- 查看创建数据库语句
SHOW CREATE TABLE student -- 查看student数据表的定义语句
DESC student -- 显示表结构

1、修改

1
2
3
4
5
ALTER TABLE `XXX` RENAME AS `YYY`(修改表名)
ALTER TABLE `XXX` ADD `YYY` INT(10)(增加字段)
ALTER TABLE `XXX` MODIFY 'YYY' VARCHAR(10)(修改约束)
ALTER TABLE `XXX` CHANGE `YYY` `ZZZ` INT(10)(字段重命名)
--MODIFY 和 CHANGE 的区别?

2、删除

1
2
ALTER TABLE `XXX` DROP `YYY`(删除表字段)
DROP TABLE [IF EXISTS] `XXX`(删除表)

MYISAM INNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间大小 较小 较大,约为MYISAM两倍

常规使用操作:

  • MYISAM节约空间,速度较快
  • INNODB安全性高,支持事务处理,多表多用户操作

物理空间位置

所有数据库文件都存在data目录,一个文件夹一个数据库

本质是文件存储

MySQL引擎在物理文件区别

  • INNODB在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件

  • MYISAM对应文件

    • *.frm 表结构定义文件
    • *.MYD 数据文件(Data)
    • *.MYI 索引文件(Index)

设置数据库表的字符集编码

CHARSET=UTF8

不设置会是mysql默认字符集编码,不支持中文

在my.ini中配置默认编码

character-set-server=utf8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SHOW CREATE TABLE `XXX`  --查看某张表的创建语句
--尽量表名字段使用``
--字符串使用''
--所有语句后加, 最后一个不用加
--主键最好加最后,一般一个表唯一
--注意顺序 [属性][索引][注释]
CREATE TABLE [IF NOT EXISTS] `XXX` (
`列名` INT(4)(类型) [NOT NULL(非空) AUTO_INCREMENT(自增) COMMENT(注释) '注释'],
`列名` VARCHAR(30) [DEFAULT NULL(默认为空) COMMENT ''],
…………,
PRIMARY KEY (`列名`)
)[ENGINE = INNODB(引擎/类型) DEFAULT = UFT8(编码)]

DESC `XXX` --查看表结构

1、Unsigned

  1. 表示无符号整数
  2. 当前列无法被声明为负数

2、zerofill

  1. 0填充
  2. 不足的位数,使用0填充
  3. 5 —> 005

3、自增

  1. 自动在上一条记录的基础+1
  2. 通常用来设计唯一主键,必须是整数类型
  3. 可以自定义增量

4、非空(null OR not null)

  1. 如为非空,必须赋值
  2. 否则若不赋值,默认是null(字符串除外)
  3. 空字符串不是null

5、默认(default)

如果不指定该列值,则值变为默认值

以下5个字段每个表必须存在,表示一个记录存在的意义(项目用)

6、version(版本 乐观锁)

7、is_delete (伪删除 存在但不可查询)

8、gmt_create (创建时间)

9、gmt_update (修改时间)

10、id (主键)