Java面试题—2023年8月22日—HRCT

  • 2023-08-22 14:13:52
  • 北京
  • huá ruǎn chāo tōng


 答案仅供参考,博主仅记录发表,没有实际查询,不保证正确性。


一、选择题(单选)

1、Java 语盲中,方法的重写(Overriding)和(Overloading)是多态性的不同表现下边哪些说法是对的?( )

A、重写是父类与子类之间多态性的一种表现
B、重写是一个类中多态性的一种表现
C、重载是一个类中多态性的一种表现
D、重载是父类与子类之间多态性的一种表现

2、Java 中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)( 西城区),截取结果为:北京市。正则表达式为( )

A、*.*?(?=W)*
B、*.*?(?=U0)*
c、*.*(?=W0)*
D、*.*(?=V)*

3、下列关于 Java 并发的说法中正确的是( )

A、CopyOnWriteArrayList 适用于写多读少的并发场景
B、ReadWriteLock 适用于读多写少的并发场景
C、ConcurrentHashMap 的写操作不需要加锁,读操作需要加锁
D、只要在定义 int 类型的成员变量i的时候加上 volatile 关键字,那么多线程并发执行 i++这样的操作的时候就是线程安全的了

4、什么是 Hibernate一级缓存? ( )

A、Hibernate 一级缓存是 Session 的缓存
B、Hibernate 一级缓存是 SessionFactory 的缓存
C、第一级缓存为必需,不允许且事实上也无法被卸除
D、第一级缓存可以设置

答案:

        1、A、重写是父类与子类之间多态性的一种表现

        2、B、.?(?=U0)*

        3、B、ReadWriteLock 适用于读多写少的并发场景

        4、A、Hibernate 一级缓存是 Session 的缓存

解析:

  1. 方法的重写(Overriding)是父类与子类之间多态性的一种表现,因为它涉及到子类重写父类的方法,从而实现运行时多态性。
  2. 正确的正则表达式应该是能匹配左括号前的内容,而不是匹配出现U0等字母的位置。所以答案应该是 B,.?(?=U0)* 是错误的。
  3. ReadWriteLock 是适用于读多写少的并发场景,它允许多个线程同时读取数据,但只允许一个线程写入数据,这有助于提高并发性能。
  4. Hibernate 一级缓存是 Session 的缓存,它存储从数据库中检索出的对象,以减少频繁的数据库访问,提高性能。第一级缓存在 Session 范围内有效,不同的 Session 之间不共享缓存。

  

二、问答题

1. 代码里有时可以看到 `extern "C"`,这语句是做什么用的?

   `extern "C"` 是用于在 C++ 代码中指定使用 C 链接约定的关键字。C++ 支持函数重载,即可以有不同参数的同名函数,而函数重载在编译后会产生不同的符号名,这会导致 C++ 代码和其他语言(如 C 语言)在链接时出现问题。通过在 C++ 代码中使用 `extern "C"`,可以使特定的函数按照 C 语言的链接约定进行编译和链接,从而与其他语言的代码能够正确链接。

2. 同步方法和同步块,哪个是更好的选择?

   同步方法和同步块都是用于处理多线程并发访问共享资源时的同步问题,但选择哪个取决于具体的情况。
   
   - 同步方法:使用 `synchronized` 关键字修饰方法,可以确保整个方法在同一时间只能被一个线程执行,从而保证了方法内部的代码块的原子性。但是,同步方法的粒度较大,可能会导致性能问题,特别是在方法内部包含多个不需要同步的代码块时。
   
   - 同步块:使用 `synchronized` 关键字修饰代码块,可以选择性地同步代码的部分区域,从而提高代码的并发性。同步块可以更细粒度地控制同步范围,但需要注意避免死锁等问题。
   
   更好的选择取决于需求。如果整个方法都需要同步,那么同步方法可能更方便。如果只需要同步方法中的某一部分代码,那么同步块可能更合适。

3. 什么是“依赖注入”和“控制反转”?

   - 依赖注入(Dependency Injection,DI):依赖注入是一种设计模式,它通过将依赖关系从一个对象传递给另一个对象,来降低耦合度并提高可测试性。在依赖注入中,组件不负责创建它所依赖的对象,而是由外部容器负责创建和注入这些依赖。这有助于松耦合,使得组件更加可复用和可测试。

   - 控制反转(Inversion of Control,IoC):控制反转是依赖注入的概念,它强调了控制的转移。传统上,程序中的控制流程由程序员直接控制,而在控制反转中,控制流程由外部容器或框架来控制。这样,程序员不再需要显式地创建和管理对象的依赖关系,而是将这些控制权交给外部容器。

   总结:依赖注入是实现控制反转的一种方式,它通过将对象的依赖关系从程序代码中剥离出来,从而实现松耦合和可维护的代码。


 

 一、Sql 语句编写

1、学生表:

1)创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话
2)向学生表添加如下信息:
学号 姓名 年龄 性别 联系电话 学历
1 A 22 男 123456 小学
2 B 21 男 119 中学
3 C 23 男 110 高中
4 D 18 女 114 大学
3) 修改学生表的数据,将电话号码以 11 开头的学员的学历改为“大专”
4) 删除学生表的数据,姓名以C开头,性别为“男’的记录删除
5) 查询学生表的数据,将所有年龄小于 22 岁的,学历为“大专”的,学生的姓名和学号示出来
6) 查询学生表的数据,查询所有信息,列出前 25%的记录
7) 查询出学生表所有学生的姓名,性别,年龄降序排列
8) 按照性别分组查询学生表所有学生的平均年龄 

答案:

1) 创建学生表:

CREATE TABLE Student (
    学号 INT PRIMARY KEY,
    姓名 VARCHAR(50),
    年龄 INT,
    性别 VARCHAR(10),
    家庭住址 VARCHAR(100),
    联系电话 VARCHAR(20)
);

2) 向学生表添加信息:

INSERT INTO Student (学号, 姓名, 年龄, 性别, 联系电话, 学历)
VALUES
    (1, 'A', 22, '男', '123456', '小学'),
    (2, 'B', 21, '男', '119', '中学'),
    (3, 'C', 23, '男', '110', '高中'),
    (4, 'D', 18, '女', '114', '大学');

3) 修改学生表数据:

UPDATE Student
SET 学历 = '大专'
WHERE 联系电话 LIKE '11%';

4) 删除学生表数据:

DELETE FROM Student
WHERE 姓名 LIKE 'C%' AND 性别 = '男';

5) 查询学生表数据:

SELECT 学号, 姓名
FROM Student
WHERE 年龄 < 22 AND 学历 = '大专';

6) 查询学生表数据:

SELECT *
FROM Student
ORDER BY 学号
LIMIT (SELECT COUNT(*) FROM Student) / 4;

7) 查询学生表数据:

SELECT 姓名, 性别, 年龄
FROM Student
ORDER BY 年龄 DESC;

8) 按照性别分组查询学生表数据:
 

SELECT 性别, AVG(年龄) AS 平均年龄
FROM Student
GROUP BY 性别;

请注意,以上 SQL 语句只是示例,博主仅记录发表,不保证正确性。


2、购物车表

1.购物车表:cartdetail

序号SpdmysJe
商品编码金额
14103100
24103200
34105200
44071125
54103100
64105100


2.返券规则表:view_info_fq_new

OzdmDqdmSpdmFqbzFqjeKsrqJsrqQssdZzsd
券种编码 档期代码商品代码满足金额返券金额开始日期结束日期开始时间结束时间
AA00000003202305010141032002002023-5-12023-5-30 00:0023:58
AA00000004202305010141052001002023-5-12023-5-30 00:0023:58

要求:

1.请根据返券规则写出上面购物车中每个商品的返券金额,同时写出通过返券规则计算购物车中商返券的关联 sql 语句 

答案:

  • 写法一
SELECT
    cd.Spdm,
    cd.ysJe,
    COALESCE(vifn.Fqje, 0) AS 返券金额
FROM
    cartdetail cd
LEFT JOIN
    view_info_fq_new vifn ON cd.Spdm = vifn.Spdm
    AND cd.ysJe >= vifn.Fqbz
    AND CURDATE() BETWEEN vifn.Ksrq AND vifn.Jsrq
    AND CURTIME() BETWEEN vifn.Qssd AND vifn.Zzsd;

        解:使用了左连接来将购物车商品与返券规则进行匹配。条件包括购物车商品的商品编码与返券规则的商品代码匹配,购物车商品金额大于等于返券规则的满足金额,以及当前日期和时间在返券规则的生效日期范围内。使用 `COALESCE` 函数可以保证如果没有匹配到返券规则,则返券金额为 0。 

  • 写法二
SELECT cd.序号, cd.Spdm, vifn.Fqje AS 返券金额
FROM cartdetail cd
LEFT JOIN view_info_fq_new vifn ON cd.Spdm = vifn.Spdm AND cd.ysJe >= vifn.Fqbz

        解:使用左连接(LEFT JOIN),将购物车表(cartdetail)与返券规则表(view_info_fq_new)进行关联。通过商品编码(Spdm)和满足金额(ysJe)进行匹配,并筛选出购物车中每个商品对应的返券金额(Fqje)。如果购物车中某个商品无法匹配到返券规则,则返券金额为 NULL。

执行结果:

序号Spdm返券金额
1004103200
2004103200
3004105100
4004071NULL
5004103200
6004105100

以上是购物车中每个商品对应的返券金额。购物车中的商品编码(Spdm)与返券规则表中的商品代码(Spdm)进行匹配。购物车中的满足金额(ysJe)与返券规则表中的满足金额(Fqbz)进行比较,只有当购物车中商品的金额大于等于返券规则中的满足金额时,才会获得对应的返券金额。

  • 写法三

 根据购物车表cartdetail和返券规则表view_info_fq_new,可以写出如下SQL语句计算每个商品的返券金额:

SELECT 
    c.Spdm,
    SUM(c.ysJe) total,
    MAX(CASE WHEN c.Spdm = r.Spdm AND SUM(c.ysJe) >= r.Fqbz THEN r.Fqje ELSE 0 END) fqje
FROM cartdetail c
LEFT JOIN view_info_fq_new r
    ON c.Spdm = r.Spdm
GROUP BY c.Spdm;

SQL操作:
1. 从购物车表cartdetail中分组查询每个商品的总金额SUM(ysJe)。
2. 左连接返券规则表view_info_fq_new,匹配商品代码和满足返券条件。
3. 使用CASE WHEN判断:
   - 商品代码匹配并且总金额大于等于满足返券金额Fqbz时,返回返券金额Fqje
   - 其他情况返回0
4. GROUP BY分组,最终可以得到每个商品的总金额和对应的返券金额。
5.一次性根据购物车数据和返券规则计算出每个商品的返券情况。

二、问答题

1、说出以下聚合数的含义:avg ,sum,max,min,count,count(*)

  • avg:计算一组数的平均值。
  • sum:计算一组数的总和。
  • max:找出一组数中的最大值。
  • min:找出一组数中的最小值。
  • count:计算一组数据的数量,不包括 NULL 值。
  • count(*):计算一组数据的数量,包括 NULL 值。

2、左向外联接,右向外联接,全联接的关健字如何写?

  • 左外联接(Left Outer Join):关键字是 `LEFT JOIN` 或 `LEFT OUTER JOIN`。
  • 右外联接(Right Outer Join):关键字是 `RIGHT JOIN` 或 `RIGHT OUTER JOIN`。
  • 全外联接(Full Outer Join):不同的数据库系统可能有不同的关键字,例如在 PostgreSQL 中使用 `FULL JOIN` 或 `FULL OUTER JOIN`,在 SQL Server 中使用 `FULL OUTER JOIN`。


 请注意,以上答案仅供参考,博主仅记录发表,不保证正确性。


 原题:

 

 

 


下课。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别晃我的可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值