Java 笔试选择题知识点记录【my-0905】

MySQL 如何定义函数?

MySQL的函数定义语法如下:

    CREATE  
        [DEFINER = { user | CURRENT_USER }]
        FUNCTION functionName ( varName varType [, ... ] )
        RETURNS returnVarType
        [characteristic ...] 
        routine_body
  • functionName:函数名,同MySQL内置函数一样,大小写不敏感
  • varName: 形参名
  • varType: 形参类型,其与varName配对使用。形参数量不限( $\geq 0$)
  • returnVarType: 返回值类型。函数返回值
  • characteristic:函数特性,下将详述
  • routine_body:函数体。函数体中必须含有  语句,当函数体为复合结构时,需要使用begin ... end 语句

示例如下:

  • 函数体为简单结构:
    create    
        function myfun_getAvg(num1 int, num2 int)    
        comment '计算两个数的均值'
        returns int    
        return (num1+num2)/2;

拥塞窗口,滑动窗口,发送窗口,接收窗口

主机甲与乙建立一条TCP连接,最大段长 MSS 为 1 KB,RTT 为 3 ms,拥塞窗口从 4 KB 增长到 18 KB需要的时间?

类似的题目:https://www.nowcoder.com/questionTerminal/7ce1d526229f403e83b0de2d1127d41c

滑动窗口是接受方决定的。

参考:https://www.bilibili.com/video/BV1LD4y1j7Dz/?spm_id_from=333.337.search-card.all.click&vd_source=b50fbb1da596effc98ac1228e5f6dbe3

拥塞窗口是发送方决定的。

慢启动和拥塞避免

InnoDB 的 undo log

InnoDB 存储引擎 Undo Log 的存储机制:

  1. 存储位置:Undo Log 存储在 InnoDB 的系统表空间中,通常是 ibdata1 文件中。每个事务都有其专用的 Undo Log 记录,存储在系统表空间的不同部分。
  2. Undo Segment(撤销段):Undo日志存储在称为"Undo Segment"的特殊数据结构中。每个Undo Segment对应一个事务或一个事务的一部分。这些Undo Segments通常以循环方式使用,以便在需要时覆盖旧的Undo数据。
  3. 撤销表空间:Undo Segments通常存储在称为"Undo表空间"或"撤销表空间"的独立存储区域中。这个表空间用于持久存储Undo数据,以便在数据库崩溃或回滚操作时恢复数据。
  4. 事务开始:当一个事务开始时,InnoDB 会为该事务分配一个唯一的事务 ID(Transaction ID),称为 XID。每个事务都有一个开始时间戳,用于标识事务的开始时间。
  5. 记录修改:在事务执行期间,如果对数据库中的数据进行修改,InnoDB 将记录这些修改操作,并将其存储在 Undo Log 中。Undo Log 记录了旧值(原始数据)和新值(修改后的数据)
  6. 回滚操作:如果事务需要回滚(例如,由于出现错误或事务被撤销),InnoDB 可以使用 Undo Log 中的信息来还原事务之前的状态。通过逆向应用 Undo Log 中的修改操作,可以将数据恢复到事务开始之前的状态。
  7. 并发控制:Undo Log 还用于支持事务的并发控制。当一个事务正在修改某个数据时,其他事务可能需要读取相同的数据。这时,InnoDB 使用 Undo Log 中的旧值来为其他事务提供一致性的读取视图,以确保不会读取到正在进行修改的数据
  8. 清理过程:InnoDB 定期进行 Undo Log 的清理,删除已经不再需要的 Undo Log 记录。这些记录包括已提交事务的记录和已经不再需要的活动事务记录。这个过程称为 Undo Log 的回收。

需要注意的是,InnoDB 的 Undo Log 存储机制在不同版本的 MySQL 和配置下可能会有一些变化。此外,InnoDB 还支持多版本并发控制(MVCC),这意味着每个事务可能有多个版本的 Undo Log 记录,以支持不同的读取视图。

出栈序列为 cdbos,入栈排列能得到这种序列的次数?

  • 首先,如果出栈序列为 c,入栈序列次数 1:【c】
  • 其次,如果出栈序列为 cd,入栈序列次数 2:【cd】【dc】
  • 第三,如果出栈序列为 cdb,入栈序列次数 ?算不出来了

所以,我们需要一种原理上的东西来解决这个问题。答案就是卡特兰数。

卡特兰数指的是在一个n*n的方格中,从左下角走到右上角. 每一步只能往右或者往上, 且在走的过程中不能越过从左下角到右上角的那条对角线.

和入栈出栈问题对比可以发现, 这里的往右走就相当于入栈, 往上走就相当于出栈, 对角线上的点就相当于栈为空的时候, 不能越过对角线就是说在栈为空的时候不能执行弹栈操作。

C0 = 1,         
C1 = 1,         C2 = 2,          C3 = 5,          C4 = 14,          C5 = 42,
C6 = 132,       C7 = 429,        C8 = 1430,       C9 = 4862,        C10 = 16796,
C11 = 58786,    C12 = 208012,    C13 = 742900,    C14 = 2674440,    C15 = 9694845,
C16 = 35357670, C17 = 129644790, C18 = 477638700, C19 = 1767263190, C20 = 6564120420, ...

所以,我们可以记住前几项的卡特兰数,快速选择。

记不住的可以看我画的图,最下面的点都是 1,对角线上的点表示卡特兰数,上面的点数就是下面的点数和左边的点数相加得到的,空白的表示 0。

BIO v.s. NIO

BIO 的读写操作是阻塞的,线程的整个生命周期和连接的生命周期是一样的,而且不能够被复用。

就单个阻塞 I/O 来说,BIO 的效率并不比 NIO 慢。但是当服务的连接增多,考虑到整个服务器的资源调度和资源利用率等因素,NIO 就有了显著的效果,NIO 非常适合高并发场景。

总结:BIO 适合简单、低并发的情况,NIO 适合高并发场景。

线程的饥饿状态和死锁状态

线程的饥饿状态和死锁状态是多线程编程中常见的问题。

  1. 线程的饥饿状态:线程饥饿是指某个线程无法获取它所需的资源,因此无法继续执行。这可能是因为其他线程一直占用着该资源,或者资源被分配得不合理。解决线程饥饿问题的方法包括使用合适的调度算法,避免资源独占,或者使用信号量等同步工具来协调线程之间的资源访问。
  2. 死锁状态:死锁是指多个线程或进程互相等待对方释放资源,从而导致所有线程都无法继续执行的情况。典型的死锁情况包括互斥锁、资源竞争和循环等待。解决死锁问题的方法通常包括谨慎地设计资源分配策略、使用超时机制、以及避免循环等待。

HOST 和 COOKIE

"HOST" 和 "COOKIE" 都是与网络通信和Web开发相关的重要概念:

  1. HOST:
  2. HTTP HOST 头部:在HTTP请求头部中,"HOST" 是一个必需的字段,它指示了请求的目标主机(服务器)的域名或IP地址。这是因为同一个服务器可能托管多个域名,通过HOST字段,服务器可以确定请求应该交由哪个域名的虚拟主机来处理。这允许多个域名共享同一个IP地址。
  3. 虚拟主机:HOST头部使得在同一台服务器上托管多个网站或应用成为可能,这被称为虚拟主机。服务器根据HOST字段将请求路由到正确的虚拟主机,以便正确地处理请求。
  4. 示例:如果你在浏览器中输入 "http://example.com",那么HOST字段将包含 "example.com",服务器将使用这个信息来确定响应应该来自 "example.com" 这个网站。
  5. COOKIE:
  6. HTTP Cookie:Cookie是一种用于在Web浏览器和服务器之间存储状态信息的小文本文件。它通常由服务器发送给浏览器,然后浏览器将其存储,并在以后的请求中将其发送回服务器。Cookie用于跟踪用户的会话、记住用户首选项、购物车内容等。
  7. 会话管理:Cookie通常用于会话管理,以便在用户与网站交互时保持状态。例如,当用户登录时,服务器可以发送一个包含会话ID的Cookie,然后在以后的请求中使用该ID来识别用户。
  8. 隐私和安全性:Cookie也引发了隐私和安全性方面的考虑。如果不正确使用,Cookie可能被滥用来跟踪用户的活动,因此有一些安全性和隐私规则来控制Cookie的使用。
  9. 示例:网站可以使用Cookie来存储用户的语言首选项,以便在用户下次访问时显示正确的语言;它还可以用于存储购物车中的商品,以便用户在浏览和结账时保留选定的商品。

总之,"HOST" 是HTTP请求头的一部分,用于指示目标主机,而"COOKIE" 是用于在浏览器和服务器之间传递状态信息的机制,通常用于用户会话管理和存储用户首选项。这两个概念都在Web开发中起到关键作用。

Java 后端笔经 文章被收录于专栏

Java 后端笔试经验

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务