• Java---刷题03


    1、136. 只出现一次的数字 - 力扣(LeetCode)

    2、138. 复制带随机指针的链表 - 力扣(LeetCode)

    3、实现哈希表代码, 使用哈希桶方式解决哈希冲突

    1. public class HashBucket {
    2. private static class Node {
    3. private int key;
    4. private int value;
    5. Node next;
    6. public Node(int key, int value) {
    7. this.key = key;
    8. this.value = value;
    9. }
    10. }
    11. private Node[] array;
    12. private int size; // 当前的数据个数
    13. private static final double LOAD_FACTOR = 0.75;
    14. private static final int DEFAULT_SIZE = 8;//默认桶的大小
    15. public HashBucket() {
    16. array = new Node[DEFAULT_SIZE ];
    17. size = 0;
    18. }
    19. public int put(int key, int value) {
    20. // key => int
    21. // int 合法的下标
    22. int index = key % array.length;
    23. // 2. 在链表中查找 key 所在的结点 长度一般是固定的 所以认为这里也是O(1)
    24. // 如果找到了,更新
    25. // 所有结点都不是 key,插入一个新的结点
    26. for (Node cur = array[index]; cur != null; cur = cur.next) {
    27. if (key == cur.key) {
    28. int oldValue = cur.value;
    29. cur.value = value;
    30. return oldValue;
    31. }
    32. }
    33. //头插法
    34. Node node = new Node(key, value);
    35. node.next = array[index];
    36. array[index] = node;
    37. size++;
    38. if (loadFactor() >= LOAD_FACTOR ) {
    39. resize();
    40. }
    41. return -1;
    42. }
    43. private double loadFactor() {
    44. return size * 1.0 / array.length;
    45. }
    46. private void resize() {
    47. Node[] newArray = new Node[array.length * 2];
    48. for (int i = 0; i < array.length; i++) {
    49. Node next;
    50. for (Node cur = array[i]; cur != null; cur = next) {
    51. next = cur.next;
    52. //每个节点都要进行重新计算index
    53. int index = cur.key % newArray.length;
    54. //头插法 第一次插入的时候newArray[index]为空
    55. cur.next = newArray[index];
    56. newArray[index] = cur;
    57. }
    58. }
    59. array = newArray;
    60. }
    61. public int get(int key) {
    62. // 1. key =》 int 类型
    63. // 2. 保证下标是合法的
    64. int index = key % array.length;
    65. Node head = array[index];
    66. for (Node cur = head; cur != null; cur = cur.next) {
    67. if (key == cur.key) {
    68. return cur.value;
    69. }
    70. }
    71. return -1;
    72. }
    73. }

    4、217. 存在重复元素 - 力扣(LeetCode)

    5、219. 存在重复元素 II - 力扣(LeetCode)

    6、设计一张商品表,包含以下字段:商品名称、商品价格、商品库存、商品描述

    1. drop table if exists product;
    2. create table product(
    3. name varchar(20),
    4. price decimal(11,2),
    5. storage int,
    6. description varchar(100)
    7. );

    7、设计一张老师表,包含以下字段:姓名、年龄、身高、体重、性别、学历、生日、身份证号

    1. drop table if exists teacher;
    2. create table teacher(
    3. name varchar(20),
    4. age int,
    5. height double,
    6. weight double,
    7. sex bit,
    8. birthday TIMESTAMP,
    9. id_number varchar(18)
    10. );

    8、设计一张图书表,包含以下字段:图书名称,图书作者、图书价格、图书分类

    1. drop table if exists book;
    2. create table book(
    3. name varchar(20),
    4. author varchar(20),
    5. price decimal(11,2),
    6. category varchar(20)
    7. );

    9、在图书表中新增一条记录:Java核心技术、作者“Cay S. Horstman”,价格56.43,分类为“计算机技术”

    insert into book values('Java核心技术','Cay S.Horstman',56.43,'计算机技术');

     全列都有值,直接全列插入就行了。

    10、在以上创建的商品表中插入一条数据:名称为“学生书包”、价格18.91、库存101、描述为空

    insert into product(name,price,storage) values('学生书包',18.91,101);

    可以全列插入,也可以直插需要的三列。全列插入就是写成('学生书包',18.91,101, null)。 

    11、student学生表中,字段有姓名name,年龄age,要求查询姓张,并且年龄在18到25岁之间的学生

    select * from student where name like '张%' and age between 18 and 25;

    姓张那么就是like '张%',年龄要某个区间内,用between...and...即可

    12、查询article文章表中,发表日期create_date在2019年1月1日上午10点30分至2019年11月10日下午4点2分的文章

    select * from article where create_date between '2019-01-01 10:30:00' and '2019-11-10 16:02:00';

    时间信息也是可以用between...and...的。

    13、查询article文章表中,文章标题title为空,或者满足发表日期create_date在2019年1月1日之后

    select * from article where title is null or create_date > '2019-01-01 00:00:00';

    判空可以用is null或者<=> null,发表日期可以直接用大于号比较。

    14、查询book图书表中,作者author列不为空,或者满足条件:价格price在50元以上且出版日期publish_date在2019年之后的图书信息

    select * from book where author is not null or (price >50 and publish_date>'2019-01-01 00:00:00');

    不为空用is not null或者not ... <=> null。这个条件跟后面是或关系,后两个是且关系。

    15、查询用户user表中,满足以下条件的用户数据:

    1. ID在1至200或300至500,且账号accout列不为空

    2. 充值金额amount在1000以上。

    select * from user where (id between 1 and 200 or id between 300 and 500) and accout is not null or amount>1000;

    条件1两个between...and...间是或关系,跟“accout列不为空”这个条件是且关系。条件1与条件2间是或关系。

    16、修改“Java核心技术”的图书信息,将价格修改为61

    update book set price=61 where name='Java核心技术';

    17、删除商品表中,价格大于60,或者是库存小于200的记录

    delete from product where price>60 or storage<200;

    18、修改所有库存大于30的商品记录,将价格增加50块

    update product set price=price+50 where storage>30;

    19、设计一个考勤系统

    考勤系统,包含员工表,考勤记录表

    -- 主要考虑记录表中的记录信息,是如何关联到员工表,员工与记录关系为1:m。

    1. create table emp(
    2. id int primary key,
    3. name varchar(20)
    4. );
    5. create table info(
    6. id int primary key,
    7. emp_id int,
    8. info_date timestamp,
    9. foreign key (emp_id) references emp(id)
    10. );

    20、设计一个学校宿舍管理系统 

    学校宿舍管理系统,要求包含宿舍信息,学生信息,每日的宿舍查房记录。

    -- 主要考虑学生与宿舍的关系:m:1,宿舍的查房记录是根据宿舍来查的,与宿舍有关系,一个宿舍可以多次查房,宿舍与查房记录是1:m的关系

    1. create table dormitory(
    2. id int primary key,
    3. number varchar(20)
    4. );
    5. create table student(
    6. id int primary key,
    7. name varchar(20),
    8. dormitory_id int,
    9. foreign key (dormitory_id) references dormitory(id)
    10. );
    11. create table info(
    12. id int primary key,
    13. dormitory_id int,
    14. status bit,
    15. info_date timestamp,
    16. foreign key (dormitory_id) references dormitory(id)
    17. );

    21、设计一个车辆违章系统

    车辆违章系统,包含用户表,车辆表,违章信息表。违章信息表中包含用户和车辆的违章信息

     -- 用户可以拥有多辆车,关系为1:m,题目已经说明违章信息包括用户和车辆,说明违章信息表中要记录用户和车辆,一个用户可以有多次违章记录,用户与违章记录关系为1:m,一辆车也可以有多次违章记录,车辆与违章记录关系也为1:m

    1. create table user(
    2. id int primary key,
    3. name varchar(20)
    4. );
    5. create table cars(
    6. id int primary key,
    7. name varchar(20),
    8. user_id int,
    9. foreign key (user_id) references user(id)
    10. );
    11. create table info(
    12. id int primary key,
    13. user_id int,
    14. cars_id int,
    15. foreign key (user_id) references user(id),
    16. foreign key (cars_id) references cars(id)
    17. );

    22、设计一个学校食堂管理系统 

    学校食堂管理系统,包含食堂表,食堂仓口表,仓口收费记录表

    -- 一个食堂有多个仓口卖饭,关系为1:m,每个仓口卖饭可以有很多次,仓口与收费记录也是1:m

    1. create table hall(
    2. id int primary key,
    3. name varchar(20)
    4. );
    5. create table hall_opening(
    6. id int primary key,
    7. name varchar(20),
    8. hall_id int,
    9. foreign key (hall_id) references hall(id)
    10. );
    11. create table info(
    12. id int primary key,
    13. price int,
    14. info_date timestamp,
    15. hall_opening_id int,
    16. foreign key (hall_opening_id) references hall_opening(id)
    17. );

    23、有一张员工表emp,字段:姓名name,性别sex,部门depart,工资salary。查询以下数据:

    1、查询男女员工的平均工资

    2、查询各部门的总薪水

    3、查询总薪水排名第二的部门

    4、查询姓名重复的员工信息

    5、查询各部门薪水大于10000的男性员工的平均薪水

    1:select sex,avg(salary) from emp group by sex;

    说明:平均值使用聚合函数avg,并且按照性别男女分组,group by 性别字段

    2:select depart,sum(salary) from emp group by depart;

    说明:总薪水使用聚合函数sum取薪水字段求和,并且按照部门字段分组,group by 部门字段

    3:select depart,sum(salary) from emp group by depart order by sum(salary) desc limit 1,1;

    说明:order by语句先按照总薪水排序,之后取第二条数据,可以使用分页,每一页1条数据,第二页就是该结果

    4:select name from emp group by name having count(name)>1;

    说明:名字重复,说明同一个名字有多条数据,可以先按照名字分组,分组之后再过滤行数大于1的,就表示同一个名字至少有2条记录,重复了

    5:select depart,avg(salary) from emp where salary>10000 and sex='男' group by depart;

    说明:这里需要注意题目要求是查询薪水大于10000的男性员工,这个是在按部门分组前就过滤,在过滤后的结果集中再查询各个部门的平均薪水

    24、写出以下数据库的查询条件【交大思诺2020届校招笔试题】

    有两个表分别如下:

    表A(varchar(32) name, int grade)

    数据:zhangshan 80, lisi 60, wangwu 84

    表B(varchar(32) name, int age)

    数据:zhangshan 26, lisi 24, wangwu 26, wutian 26

    写SQL语句得到如下查询结果:

    | NAME   | GRADE | AGE |

    | --------- | ----- | ---- |

    | zhangshan | 80  | 26  |

    | lisi   | 60  | 24  |

    | wangwu  | 84  | 26  |

    | wutian  | null | 26  |

    1. SELECT
    2. B.NAME,
    3. A.grade,
    4. B.age
    5. FROM
    6. B left join A
    7. ON
    8. A.NAME = B.NAME

     说明:主要考察使用关联查询时需要使用内联还是外联,这里wutian再A表中没有记录,但还是需要返回结果,所以应该将B表作为外表进行外连接查询

    25、有员工表、部门表和薪资表,根据查询条件写出对应的sql【同程艺龙2020届校招笔试题】

    现在有员工表、部门表和薪资表。部门表depart的字段有depart_id, name;员工表 staff 的字段有 staff_id, name, age, depart_id;薪资表salary 的字段有 salary_id,staff_id,salary,month。

    (问题a):求每个部门'2016-09'月份的部门薪水总额

    (问题b):求每个部门的部门人数,要求输出部门名称和人数

    (问题c):求公司每个部门的月支出薪资数,要求输出月份和本月薪资总数

    (问题a):求每个部门'2016-09'月份的部门薪水总额

    1. SELECT
    2. dep.NAME,
    3. sum( sal.salary )
    4. FROM
    5. salary sal
    6. JOIN staff sta ON sal.staff_id = sta.staff_id
    7. JOIN depart dep ON sta.depart_id = dep.depart_id
    8. WHERE
    9. YEAR ( sal.MONTH ) = 2016
    10. AND MONTH ( sal.MONTH ) = 9
    11. GROUP BY
    12. dep.depart_id

    说明:
    mysql中年和月的函数分别是year(字段),month(字段)
    查询要求的是每个部门的信息,所以要按照部门进行分组,部门和员工为1:m,员工与薪水为1:m,查询要求有部门,有薪水,所以必须关联3张表查询

    (问题b):求每个部门的部门人数,要求输出部门名称和人数

    1. SELECT
    2. dep.NAME,
    3. count( sta.staff_id )
    4. FROM
    5. staff sta
    6. JOIN depart dep ON dep.depart_id = sta.depart_id
    7. GROUP BY
    8. sta.depart_id

    说明:查询要求的信息有部门,有人数,人数只能从员工表中获取,所以关联表为部门表/员工表。按照部门id分组查询员工id的行数

    (问题c):求公司每个部门的月支出薪资数,要求输出月份和本月薪资总数

    1. SELECT
    2. dep.NAME,
    3. sal.MONTH,
    4. sum( sal.salary )
    5. FROM
    6. depart dep
    7. JOIN staff sta ON dep.depart_id = sta.depart_id
    8. JOIN salary sal ON sta.staff_id = sal.staff_id
    9. GROUP BY
    10. dep.depart_id,
    11. sal.MONTH

    说明:按照题目要求,查询信息有部门/月/每个部门每月薪资总额,其中薪水信息再薪水表中,每个员工可以有多条薪资记录(不同时间)。所以需要按照部门分组,再按照月份分组,查询分组的部门在不同月份下的总薪水

    26、编写一个SQL查询,获取Employee表中第二高的薪水(Salary)

    +-----+-------+

    | Id | Salary|

    +-----+-------+

    | 1  | 100 |

    +-----+-------+

    | 2  | 200 |

    +-----+-------+

    | 3  | 300 |

    +-----+-------+

    例如上述Employee表,SQL查询应该返回200作为第二高的薪水。如果不存在第二高的薪水,那么查询应该返回null。

    +---------------------+

    | SecondHighestSalary |

    +---------------------+

    |    200     |

    +---------------------+

    select ifnull((select Salary from Employee order by Salary desc limit 1,1),null ) as SecondHighestSalary;

     说明:先查询最高的薪水,然后适用ifnull,如果没有就返回null

    27、使用UNION语句查询

    已知T1和T2的字段定义完全相同,T1有5条不同数据,T2有5条不同数据,其中T1有2条数据存在表T2中,使用UNION语句查询这些数据,要求重复数据不出现

    SELECT * FROM T1 UNION SELECT * FROM T2

    说明:union不能出现重复,union all会出现重复数据。根据题目要求使用union

    28、有一个图书管理系统,请根据要求写出对应的sql

    有一个图书管理系统,包含学生和图书信息,且图书可以进行分类,学生可以在一个时间范围内借阅图书,并在这个时间范围内归还图书。表和表关系如下:

    DROP DATABASE IF EXISTS ebook;

    CREATE DATABASE ebook CHARACTER SET 'utf8mb4';

    USE ebook;

    -- ----------------------------

    -- Table structure for category

    -- ----------------------------

    DROP TABLE IF EXISTS category;

    CREATE TABLE category (

     id int(11) PRIMARY KEY AUTO_INCREMENT,

     name varchar(20)

    );

    -- ----------------------------

    -- Records of category

    -- ----------------------------

    INSERT INTO category VALUES (1, '历史');

    INSERT INTO category VALUES (2, '艺术');

    INSERT INTO category VALUES (3, '计算机');

    INSERT INTO category VALUES (4, '数学');

    INSERT INTO category VALUES (5, '小说');

    -- ----------------------------

    -- Table structure for student

    -- ----------------------------

    DROP TABLE IF EXISTS student;

    CREATE TABLE student (

     id int(11) PRIMARY KEY AUTO_INCREMENT,

     name varchar(20)

    );

    -- ----------------------------

    -- Records of student

    -- ----------------------------

    INSERT INTO student VALUES (1, '王昭君');

    INSERT INTO student VALUES (2, '李白');

    INSERT INTO student VALUES (3, '貂蝉');

    INSERT INTO student VALUES (4, '小乔');

    INSERT INTO student VALUES (5, '韩信');

    -- ----------------------------

    -- Table structure for book

    -- ----------------------------

    DROP TABLE IF EXISTS book;

    CREATE TABLE book (

     id int(11) PRIMARY KEY AUTO_INCREMENT,

     name varchar(20),

     author varchar(20),

     price decimal(10, 2),

     category_id int(11),

     CONSTRAINT fk_book_category_id FOREIGN KEY (category_id) REFERENCES category (id)

    );

    -- ----------------------------

    -- Records of book

    -- ----------------------------

    INSERT INTO book VALUES (1, '深入理解Java虚拟机', '周志明', 57.90, 3);

    INSERT INTO book VALUES (2, '西游记', '吴承恩', 30.68, 5);

    INSERT INTO book VALUES (3, '儒林外史', '吴敬梓', 18.80, 5);

    INSERT INTO book VALUES (4, '聊斋志异', '蒲松龄', 21.00, 5);

    INSERT INTO book VALUES (5, '史记', '司马迁', 278.20, 1);

    INSERT INTO book VALUES (6, '资治通鉴', '司马光', 524.00, 1);

    INSERT INTO book VALUES (7, 'Java核心技术 卷I:基础知识', 'Cay S. Horstmann', 92.50, 3);

    INSERT INTO book VALUES (8, 'Java核心技术卷II:高级特性', 'Cay S. Horstmann', 111.20, 3);

    INSERT INTO book VALUES (9, 'Java多线程编程核心技术', '高洪岩', 47.50, 3);

    INSERT INTO book VALUES (10, '诗经', '孔子', 22.00, 2);

    INSERT INTO book VALUES (11, '唐诗三百首', '蘅塘居士', 49.30, 2);

    INSERT INTO book VALUES (12, '唐诗三百首', '蘅塘居士', 55.00, 2);

    INSERT INTO book VALUES (13, '西游记', '吴承恩', 47.50, 5);

    INSERT INTO book VALUES (14, '唐诗三百首', '蘅塘居士', 56.50, 2);

    -- ----------------------------

    -- Table structure for borrow_info

    -- ----------------------------

    DROP TABLE IF EXISTS borrow_info;

    CREATE TABLE borrow_info (

     id int(11) PRIMARY KEY AUTO_INCREMENT,

     book_id int(11),

     student_id int(11),

     start_time timestamp null,

     end_time timestamp null,

     CONSTRAINT fk_borrow_info_book_id FOREIGN KEY (book_id) REFERENCES book (id),

     CONSTRAINT fk_borrow_info_student_id FOREIGN KEY (student_id) REFERENCES student (id)

    );

    -- ----------------------------

    -- Records of borrow_info

    -- ----------------------------

    INSERT INTO borrow_info VALUES (1, 1, 1, '2018-11-07 18:50:43', '2018-12-07 18:51:01');

    INSERT INTO borrow_info VALUES (2, 7, 1, '2019-07-10 10:21:00', '2019-09-10 10:21:00');

    INSERT INTO borrow_info VALUES (3, 8, 1, '2019-09-10 10:21:00', '2019-10-10 10:21:00');

    INSERT INTO borrow_info VALUES (4, 2, 2, '2019-03-02 16:37:00', '2019-04-02 16:37:00');

    INSERT INTO borrow_info VALUES (5, 4, 2, '2019-03-12 14:25:00', '2019-04-12 14:25:00');

    INSERT INTO borrow_info VALUES (6, 10, 2, '2019-07-13 16:21:00', '2019-10-13 16:21:00');

    INSERT INTO borrow_info VALUES (7, 11, 2, '2019-06-09 09:40:00', '2019-07-09 09:40:00');

    INSERT INTO borrow_info VALUES (8, 13, 2, '2019-01-03 15:11:00', '2019-04-03 15:11:00');

    INSERT INTO borrow_info VALUES (9, 7, 3, '2019-05-15 13:13:00', '2019-06-15 13:13:00');

    INSERT INTO borrow_info VALUES (10, 8, 3, '2019-04-27 13:53:00', '2019-05-27 13:53:00');

    INSERT INTO borrow_info VALUES (11, 9, 3, '2019-06-01 11:32:00', '2019-07-01 11:32:00');

    INSERT INTO borrow_info VALUES (12, 3, 4, '2019-07-01 09:40:00', '2019-08-01 09:40:00');

    INSERT INTO borrow_info VALUES (13, 4, 4, '2019-06-19 11:40:00', '2019-07-19 11:40:00');

    INSERT INTO borrow_info VALUES (14, 5, 4, '2019-06-25 09:23:00', '2019-09-25 09:23:00');

    INSERT INTO borrow_info VALUES (15, 10, 4, '2019-08-27 15:30:00', '2019-09-27 15:30:00');

    INSERT INTO borrow_info VALUES (16, 5, 5, '2019-01-23 14:20:00', '2019-04-23 14:20:00');

    INSERT INTO borrow_info VALUES (17, 6, 5, '2019-03-09 10:45:00', '2019-04-09 10:45:00');

    INSERT INTO borrow_info VALUES (18, 10, 5, '2019-06-17 11:32:00', '2019-09-17 11:32:00');

    要求:

    1. 新增貂蝉同学的借阅记录:诗经,从2019年9月25日17:50到2019年10月25日17:50

    2. 查询计算机分类下的图书借阅信息

    3. 修改图书《深入理解Java虚拟机》的价格为61.20

    4. 删除id最大的一条借阅记录

     1. 新增貂蝉同学的借阅记录:诗经,从2019年9月25日17:50到2019年10月25日17:50

    首先创建数据库JDBC工具类

    1. package com.bit.util;
    2. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    3. import javax.sql.DataSource;
    4. import java.sql.*;
    5. import java.text.ParseException;
    6. import java.text.SimpleDateFormat;
    7. public class Util {
    8. //使用连接池
    9. private static final DataSource DATA_SOURCE = new MysqlDataSource();
    10. static {
    11. ((MysqlDataSource) DATA_SOURCE).setUrl("jdbc:mysql://localhost:3306/book");
    12. ((MysqlDataSource) DATA_SOURCE).setUser("root");
    13. ((MysqlDataSource) DATA_SOURCE).setPassword("root");
    14. }
    15. public static void main(String[] args) {
    16. System.out.println(getConnection());
    17. }
    18. // 获取数据库连接
    19. public static Connection getConnection(){
    20. try {
    21. return DATA_SOURCE.getConnection();
    22. } catch (SQLException e) {
    23. throw new RuntimeException("获取数据库连接失败", e);
    24. }
    25. }
    26. // 释放资源
    27. public static void close(ResultSet resultSet, Statement statement,
    28. Connection connection){
    29. try {
    30. if(resultSet != null) {
    31. resultSet.close();
    32. }
    33. if(statement != null){
    34. statement.close();
    35. }
    36. if(connection != null){
    37. connection.close();
    38. }
    39. } catch (SQLException e) {
    40. throw new RuntimeException("数据库操作异常", e);
    41. }
    42. }
    43. //日期字符串转Java日期类Date和sql时间戳Timestamp
    44. public static Timestamp getTimestamp(String dateString){
    45. try {
    46. // 年-月-日 小时:分钟:秒
    47. java.util.Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateString);
    48. return new java.sql.Timestamp(date.getTime());
    49. } catch (ParseException e) {
    50. throw new RuntimeException("日期格式化错误:"+dateString, e);
    51. }
    52. }
    53. }
    54. package com.bit.book;
    55. import com.bit.util.Utill
    56. import java.sql.Connection;
    57. import java.sql.PreparedStatement;
    58. import java.sql.SQLException;
    59. public class AddBorrow {
    60. /**
    61. * 新增貂蝉同学的借阅记录:诗经,从2019年9月25日17:50到2019年10月25日17:50
    62. */
    63. public static void main(String[] args) {
    64. //1.创建数据库连接对象
    65. Connection connection = null;
    66. //2.创建操作命令对象
    67. PreparedStatement preparedStatement = null;
    68. try {
    69. connection = Util.getConnection();
    70. String sql = "insert into borrow_info(book_id, student_id," +
    71. " start_time, end_time) select b.id,s.id,?,?" +
    72. " from book b,student s where b.name=? and s.name=?";
    73. preparedStatement = connection.prepareStatement(sql);
    74. preparedStatement.setTimestamp(1, Util.getTimestamp("2019-09-25 17:50:00"));
    75. preparedStatement.setTimestamp(2, Util.getTimestamp("2019-10-25 17:50:00"));
    76. preparedStatement.setString(3, "诗经");
    77. preparedStatement.setString(4, "貂蝉");
    78. System.out.println(preparedStatement);
    79. //3.执行sql
    80. int result = preparedStatement.executeUpdate();
    81. System.out.println(result);
    82. } catch (SQLException e) {
    83. e.printStackTrace();
    84. } finally {
    85. //4.释放资源
    86. Util.close(null, preparedStatement, connection);
    87. }
    88. }
    89. }

    2. 查询计算机分类下的图书借阅信息

    1. package com.bit.book;
    2. import com.bit.util.Util;
    3. import java.sql.*;
    4. public class QueryBorrow {
    5. /**
    6. * 查询计算机分类下的图书借阅信息
    7. * @param args
    8. */
    9. public static void main(String[] args) {
    10. Connection connection = null;
    11. PreparedStatement preparedStatement = null;
    12. ResultSet resultSet = null;
    13. try {
    14. connection = Util.getConnection();
    15. String sql = "SELECT bk.NAME book_name,bk.author book_author," +
    16. "s.NAME student_name,bi.start_time,bi.end_time" +
    17. " FROM borrow_info bi JOIN book bk ON bi.book_id = bk.id" +
    18. " JOIN category c ON bk.category_id = c.id" +
    19. " JOIN student s ON bi.student_id = s.id" +
    20. " WHERE c.NAME = ?";
    21. preparedStatement = connection.prepareStatement(sql);
    22. preparedStatement.setString(1, "计算机");
    23. resultSet = preparedStatement.executeQuery();
    24. while(resultSet.next()){
    25. String bookName = resultSet.getString("book_name");
    26. String bookAuthor = resultSet.getString("book_author");
    27. String studentName = resultSet.getString("student_name");
    28. Timestamp startTime = resultSet.getTimestamp("start_time");
    29. Timestamp endTime = resultSet.getTimestamp("end_time");
    30. System.out.println(String.format("书名:%s,作者:%s,借阅者:%s," +
    31. "借阅起始日期:%s,结束日期:%s",
    32. bookName, bookAuthor, studentName, startTime, endTime));
    33. }
    34. } catch (SQLException e) {
    35. e.printStackTrace();
    36. } finally {
    37. Util.close(resultSet, preparedStatement, connection);
    38. }
    39. }
    40. }

    3. 修改图书《深入理解Java虚拟机》的价格为61.20

    1. package com.bit.book;
    2. import com.bit.util.Util;
    3. import java.math.BigDecimal;
    4. import java.sql.Connection;
    5. import java.sql.PreparedStatement;
    6. import java.sql.SQLException;
    7. public class UpdateBook {
    8. /**
    9. * 修改图书《深入理解Java虚拟机》的价格为61.20
    10. */
    11. public static void main(String[] args) {
    12. Connection connection = null;
    13. PreparedStatement preparedStatement = null;
    14. try {
    15. connection = Util.getConnection();
    16. String sql = "update book set price=? where name =?";
    17. preparedStatement = connection.prepareStatement(sql);
    18. preparedStatement.setBigDecimal(1, new BigDecimal("61.20"));
    19. preparedStatement.setString(2, "深入理解Java虚拟机");
    20. System.out.println(preparedStatement);
    21. int result = preparedStatement.executeUpdate();
    22. System.out.println(result);
    23. } catch (SQLException e) {
    24. e.printStackTrace();
    25. } finally {
    26. Util.close(null, preparedStatement, connection);
    27. }
    28. }
    29. }

    4. 删除id最大的一条借阅记录

    1. package com.bit.book;
    2. import com.bit.util.Util;
    3. import java.sql.Connection;
    4. import java.sql.PreparedStatement;
    5. import java.sql.SQLException;
    6. public class DeleteBorrow {
    7. /**
    8. * 删除id最大的一条借阅记录
    9. */
    10. public static void main(String[] args) {
    11. Connection connection = null;
    12. PreparedStatement preparedStatement = null;
    13. try {
    14. connection = Util.getConnection();
    15. String sql = "delete from borrow_info where id =" +
    16. "(select r.id from (select max(id) id from borrow_info) r)";
    17. preparedStatement = connection.prepareStatement(sql);
    18. int result = preparedStatement.executeUpdate();
    19. System.out.println(result);
    20. } catch (SQLException e) {
    21. e.printStackTrace();
    22. } finally {
    23. Util.close(null, preparedStatement, connection);
    24. }
    25. }
    26. }

    29、编写代码, 实现创建线程的五种写法

    1. 继承 Thread, 重写 run
    2. 实现 Runnable, 重写 run
    3. 继承 Thread, 重写 run, 使用匿名内部类
    4. 实现 Runnable, 重写 run, 使用匿名内部类
    5. 使用 lambda 表达式

    通过继承Thread类并实现run方法创建一个线程

    1. // 定义一个Thread类,相当于一个线程的模板
    2. class MyThread01 extends Thread {
    3. // 重写run方法// run方法描述的是线程要执行的具体任务@Overridepublic void run() {
    4. System.out.println("hello, thread.");
    5. }
    6. }
    7. /**
    8. * 继承Thread类并重写run方法创建一个线程
    9. * @author 比特就业课
    10. * @created 2022-06-20
    11. */
    12. public class Thread_demo01 {
    13. public static void main(String[] args) {
    14. // 实例化一个线程对象
    15. MyThread01 t = new MyThread01();
    16. // 真正的去申请系统线程,参与CPU调度
    17. t.start();
    18. }
    19. }

    通过实现Runnable接口,并实现run方法的方法创建一个线程

    1. // 创建一个Runnable的实现类,并实现run方法
    2. // Runnable主要描述的是线程的任务
    3. class MyRunnable01 implements Runnable {
    4. @Overridepublic void run() {
    5. System.out.println("hello, thread.");
    6. }
    7. }
    8. /**
    9. * 通过继承Runnable接口并实现run方法
    10. * @author 比特就业课
    11. * @created 2022-06-20
    12. */
    13. public class Thread_demo02 {
    14. public static void main(String[] args) {
    15. // 实例化Runnable对象
    16. MyRunnable01 runnable01 = new MyRunnable01();
    17. // 实例化线程对象并绑定任务
    18. Thread t = new Thread(runnable01);
    19. // 真正的去申请系统线程参与CPU调度
    20. t.start();
    21. }
    22. }

    通过Thread匿名内部类创建一个线程

    1. /**
    2. * 通过Thread匿名内部类的方法创建一个线程
    3. * @author 比特就业课
    4. * @created 2022-06-20
    5. */
    6. public class Thread_demo03 {public static void main(String[] args) {
    7. Thread t = new Thread(){
    8. // 指定线程任务
    9. @Override
    10. public void run() {
    11. System.out.println(Thread.currentThread().getName());
    12. }
    13. };
    14. // 真正的申请系统线程参与CPU调度
    15. t.start();
    16. }
    17. }

    通过Runnable匿名内部类创建一个线程

    1. /**
    2. * 通过Runnable匿名内部类创建一个线程
    3. * @author 比特就业课
    4. * @created 2022-06-20
    5. */
    6. public class Thread_demo04 {public static void main(String[] args) {
    7. Thread t = new Thread(new Runnable() {
    8. // 指定线程的任务
    9. @Override
    10. public void run() {
    11. System.out.println(Thread.currentThread().getName());
    12. }
    13. });
    14. // 申请系统线程参与CPU调度
    15. t.start();
    16. }
    17. }

    通过Lambda表达式的方式创建一个线程

    1. /**
    2. * 通过Lambda表达式的方式创建一个线程
    3. * @author 比特就业课
    4. * @created 2022-06-20
    5. */
    6. public class Thread_demo05 {
    7. public static void main(String[] args) {
    8. Thread t = new Thread(() -> {
    9. // 指定任务:任务是循环打印当前线程名
    10. while (true) {
    11. System.out.println(Thread.currentThread().getName());
    12. try {
    13. // 休眠1000ms
    14. Thread.sleep(1000);
    15. } catch (InterruptedException e) {
    16. e.printStackTrace();
    17. }
    18. }
    19. });
    20. // 申请系统线程参与CPU调度
    21. t.start();
    22. }
    23. }

    30、编写代码, 实现多线程数组求和.

    1. 给定一个很长的数组 (长度 1000w), 通过随机数的方式生成 1-100 之间的整数.
    2. 实现代码, 能够创建两个线程, 对这个数组的所有元素求和.
    3. 其中线程1 计算偶数下标元素的和, 线程2 计算奇数下标元素的和.
    4. 最终再汇总两个和, 进行相加
    5. 记录程序的执行时间.

    1. /**
    2. * 题目名称 :
    3. * 编写代码, 实现多线程数组求和.
    4. * 题目内容 :
    5. * 1. 给定一个很长的数组 (长度 1000w), 通过随机数的方式生成 1-100 之间的整数.
    6. * 2. 实现代码, 能够创建两个线程, 对这个数组的所有元素求和.
    7. * 3. 其中线程1 计算偶数下标元素的和, 线程2 计算奇数下标元素的和.
    8. * 4. 最终再汇总两个和, 进行相加
    9. * 5. 记录程序的执行时间.
    10. *
    11. * @author 比特就业课
    12. * @created 2022-06-20
    13. *
    14. */
    15. public class Thread_2533 {
    16. public static void main(String[] args) throws InterruptedException {
    17. // 记录开始时间
    18. long start = System.currentTimeMillis();
    19. // 1. 给定一个很长的数组 (长度 1000w), 通过随机数的方式生成 1-100 之间的整数.
    20. int total = 1000_0000;
    21. int [] arr = new int[total];
    22. // 构造随机数,填充数组
    23. Random random = new Random();
    24. for (int i = 0; i < total; i++) {
    25. int num = random.nextInt(100) + 1;
    26. arr[i] = num;
    27. }
    28. // 2. 实现代码, 能够创建两个线程, 对这个数组的所有元素求和.
    29. // 3. 其中线程1 计算偶数下标元素的和, 线程2 计算奇数下标元素的和.
    30. // 实例化操作类
    31. SumOperator operator = new SumOperator();
    32. // 定义具体的执行线程
    33. Thread t1 = new Thread(() -> {
    34. // 遍历数组,累加偶数下标
    35. for (int i = 0; i < total; i += 2) {
    36. operator.addEvenSum(arr[i]);
    37. }
    38. });
    39. Thread t2 = new Thread(() -> {
    40. // 遍历数组,累加奇数下标
    41. for (int i = 1; i < total; i += 2) {
    42. operator.addOddSum(arr[i]);
    43. }
    44. });
    45. // 启动线程
    46. t1.start();
    47. t2.start();
    48. // 等待线程结束
    49. t1.join();
    50. t2.join();
    51. // 记录结束时间
    52. long end = System.currentTimeMillis();
    53. // 结果
    54. System.out.println("结算结果为 = " + operator.result());
    55. System.out.println("总耗时 " + (end - start) + "ms.");
    56. }
    57. }
    58. // 累加操作用这个类来完成
    59. class SumOperator {
    60. long evenSum;
    61. long oddSum;
    62. public void addEvenSum (int num) {
    63. evenSum += num;
    64. }
    65. public void addOddSum (int num) {
    66. oddSum += num;
    67. }
    68. public long result() {
    69. System.out.println("偶数和:" + evenSum);
    70. System.out.println("奇数和:" + oddSum);
    71. return evenSum + oddSum;
    72. }
    73. }

    31、在子线程执行完毕后再执行主线程代码

    有20个线程,需要同时启动。每个线程按0-19的序号打印,如第一个线程需要打印0。请设计代码,在main主线程中,等待所有子线程执行完后,再打印 ok

    1. public static void main(String[] args) throws InterruptedException {
    2. Thread[] threads = new Thread[20];
    3. for(int i=0; i<20; i++){
    4. final int n = i;
    5. threads[i] = new Thread(new Runnable() {
    6. @Override
    7. public void run() {//内部类使用外部的变量,必须是final修饰
    8. System.out.println(n);
    9. }
    10. });
    11. }
    12. for(Thread t : threads){
    13. t.start();
    14. }
    15. for(Thread t : threads){//同时执行20个线程,再等待所有线程执行完毕
    16. t.join();
    17. }
    18. System.out.println("OK");
    19. }

     32、请说明Thread类中run和start的区别

    从方法的区别,及运行结果的区别分别说明

    作用功能不同:

    1. run方法的作用是描述线程具体要执行的任务;
    2. start方法的作用是真正的去申请系统线程

    运行结果不同:

    1. run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次;
    2. start调用方法后, start方法内部会调用Java 本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run 方法执行完成后线程进入销毁阶段。

    33、

    34、

    35、

    36、

    37、

    38、

    39、

    40、

    41、

    42、

    43、

    44、

    45、

    46、

    47、

    48、

    49、

    50、

  • 相关阅读:
    base64_encode()和base64_decode(),URL的加密解密详解
    帆软FineBI随时记
    Java自定义注解如何实现
    delphi技术专题---获取网卡物理地址之NetBios网络编程接口LANA介绍
    MySQL递归查询
    网络安全(黑客)自学笔记
    基于卷积神经网络实现手写数字识别
    Kafka命令行操作
    6176. 出现最频繁的偶数元素
    【深度思考】5年开发经验,不知道git rebase,是否应该被嘲笑?
  • 原文地址:https://blog.csdn.net/weixin_51912875/article/details/126000947