字节测试与开发面试

一、八股

1. http和https的区别

  • 安全性

    • HTTP:不是安全的,传输的数据不进行加密。如果攻击者尝试监听或捕获数据,他们可以容易地看到传输的内容。
    • HTTPS:提供安全的数据传输,因为它使用 SSL/TLS 协议对数据进行加密。这意味着即使数据被拦截,攻击者也难以解密它。
  • 端口号

    • HTTP:默认使用端口 80。
    • HTTPS:默认使用端口 443。
  • 证书

    • HTTP:不需要任何证书。
    • HTTPS:需要一个 SSL 证书。这些证书由认证中心 (CA) 提供,确保网站的身份得到验证并提供加密。
  • URL

    • 当你访问一个使用 HTTP 的网站时,你的浏览器的地址栏会显示“http://”作为 URL 的前缀。
    • 对于 HTTPS,地址栏会显示“https://”。
  • 性能

    • 在过去,由于需要加密和解密数据,使用 HTTPS 可能会比 HTTP 稍微慢一些。但随着技术的进步和硬件的提升,这种差异现在几乎可以忽略不计。
  • 搜索引擎优化 (SEO) 优势

    • Google 在其排名算法中考虑 HTTPS 为一个正面因素,这意味着使用 HTTPS 可能对你的网站在搜索结果中的排名有积极的影响。
  • 用户信任

    • 许多现代浏览器在地址栏中显示安全锁标志,表明网站使用 HTTPS,并且是安全的。这可以增加用户的信任感,特别是在进行在线交易或提供敏感信息时。

2. MySQL索引底层如何实现

MySQL 中的索引主要是通过数据结构来加速查询操作。最常用的数据结构是 B-Tree 和 B+Tree,尤其是 InnoDB 存储引擎中的 B+Tree。此外,有些 MySQL 存储引擎(例如 MEMORY)支持使用哈希索引。

以下是 MySQL 中常见的索引及其底层实现的简要描述:

  • B+Tree 索引

    • B+Tree 是 B-Tree 的一种变种,常用于数据库和文件系统。
    • InnoDB 存储引擎的默认索引类型就是聚集索引和辅助索引,这两者都是使用 B+Tree 结构实现的。
    • B+Tree 的特点是所有叶子节点都在同一层,并且叶子节点之间有链表连接,这使得范围查询变得非常高效。
    • 相比于 B-Tree,B+Tree 的内部节点不存储数据,只存储关键字和子节点的指针,从而能够在同样的空间里存储更多的键,提高磁盘I/O效率。
  • 哈希索引

    • MEMORY 存储引擎支持哈希索引。
    • 哈希索引基于哈希表,它使用哈希函数将键值转化为一个位置,然后在该位置存储或查找一个特定的值。
    • 哈希索引非常适合等值查找,但对于范围查找、排序操作或返回数据的顺序则不太适合。

3. 左连接和右连接的区别

左连接(LEFT JOIN)

  • 返回从第一个(左边的)表中选择的所有记录,以及第二个(右边的)表中匹配的记录。
  • 如果左表的某行在右表中没有匹配行,则该行的右表部分的结果将为空(NULL)。

右连接(RIGHT JOIN)

  • 返回从第二个(右边的)表中选择的所有记录,以及第一个(左边的)表中匹配的记录。
  • 如果右表的某行在左表中没有匹配行,则该行的左表部分的结果将为空(NULL)。

总结

  • 左连接返回左表的所有记录和右表的匹配记录。
  • 右连接返回右表的所有记录和左表的匹配记录。
  • 如果没有匹配的行,则结果集中的对应列将显示为 NULL

4.JWT的优缺点

JWT 的优点

  • 简洁和自包含:JWT 可以包含所有必要的信息,避免了每次都需要查询数据库来检索用户信息。

  • 跨域认证:由于 JWT 是自包含的,它适合跨域认证场景,特别是在移动应用中。

  • 无状态性:JWT 使得应用服务器可以完全无状态,从而简化了扩展应用服务器的复杂性。

  • 性能:JWT 提供了一种避免每次请求都访问数据库的方法,从而提高性能。

  • 适用于移动设备:由于其大小通常较小并且编码为字符串,JWT 非常适合 HTTP 头部传输,尤其在移动网络环境中。

  • 安全:使用强加密算法(例如 RS256)可以验证 JWT 的发送者、接收者和内容的完整性。

JWT 的缺点

  • 大小:与简单的令牌或 cookie 相比,JWT 通常较大。当在 HTTP 头部中使用它时,这可能会增加所有请求的大小。

  • 加密复杂性:虽然 JWT 可以加密数据,但实现和维护加密需要额外的复杂性。

  • 无法从服务器端废除:由于 JWT 是无状态的,一旦颁发了一个 JWT,它会在其过期时间之前一直有效,除非客户端删除它。这意味着撤销或更改 JWT 的权限在其过期之前可能会更具挑战性。

  • 存储安全问题:JWT 在客户端存储可能遭受跨站点脚本攻击 (XSS)。攻击者可能会尝试获取存储在客户端的 JWT。

  • 过期策略:JWT 的有效性完全依赖于过期策略。如果你设置了一个很长的过期时间,攻击者可能有足够的时间利用一个窃取的令牌;如果设置得太短,用户体验可能会受到影响。

  • 依赖于签名算法:JWT 的安全性完全依赖于其使用的签名算法。一些算法,如 "none" 或弱加密算法,可能被攻击。

5. niginx负载均衡策略有哪些

  • 轮询 (Round Robin)

    • 默认的负载均衡方法。
    • 每个传入的请求按顺序轮流分配到后端的服务器。
    • 如果没有其他特定配置,所有的服务器将被视为具有相同的权重和处理能力。
  • 权重 (Weighted Round Robin)

    • 不同的服务器可能会有不同的处理能力。使用 weight 参数可以指定后端服务器的权重。
    • 权重越高的服务器会接收到更多的请求。
    • 例如:server backend1.example.com weight=3; 会使 backend1.example.com 接收到的请求是其他默认权重服务器的三倍。
  • 最少连接 (Least Connections)

    • 将新的连接分配给当前活跃连接数最少的服务器。
    • 这是一个很好的选择,当后端服务器的性能大致相同,但可能会有不同的响应时间时。
  • IP 散列 (IP Hash)

    • 使用客户端的 IP 地址来确定向哪个后端服务器转发请求。
    • 这确保了来自特定客户端 IP 的请求总是被发送到同一个后端服务器,除非该服务器不可用。
    • 这对于需要会话保持的应用程序特别有用。
  • 通用散列 (Generic Hash)

    • 基于文本字符串(如请求 URL、HTTP 头等)或变量生成散列值,根据该散列值来分配请求。
    • 这提供了一种更为灵活的方法来实现“会话保持”或基于特定请求属性的请求分配。
  • 使用第三方模块的策略

    • Nginx 社区和企业版本支持其他扩展的负载均衡策略,通过使用第三方模块实现。
    • 例如:sticky 模块可以使用户的请求在会话期间“粘滞”在同一个后端服务器。
  • 备份 (Backup) 服务器

    • 当主要的服务器不可用时,可以定义备份服务器来处理请求。
    • 这不是一个独立的负载均衡策略,而是与上述策略结合使用的。

6.数据库事务指什么

数据库事务是对数据库中数据进行管理的一个程序执行单元(可以理解为一组操作)。事务的主要目的是确保这组操作要么全部执行,要么全部不执行,从而保持数据库的完整性和一致性。简而言之,事务是一组原子性的 SQL 语句,或者说是一个原子操作序列

7. 你认为涉及到的接口有哪几种

RESTful API:

  • 使用 HTTP 协议作为通信手段。
  • 遵循 REST(代表性状态传输)原则。
  • 以资源为中心,使用标准的 HTTP 方法(如 GET、POST、PUT、DELETE)。
  • 可以返回各种数据格式,但 JSON 和 XML 最为常见。

gRPC:

  • 由 Google 开发,基于 Protocol Buffers(一种高效的数据序列化工具)。
  • 支持多种语言,支持双向流、流控制、块头压缩、身份验证等功能。
  • 使用 HTTP/2 作为传输协议,提供更低的延迟和更高的吞吐量。

8. MySQL的四大特性

  • 原子性 (Atomicity):
    • 指的是一个事务(transaction)中的所有操作要么都被执行,要么都被中止,不可能停滞在中间环节。事务执行过程中出错会被回滚(Rollback)到事务开始前的状态,就像这个事务从未被执行过一样。
  • 一致性 (Consistency):
    • 在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑。
  • 隔离性 (Isolation):
    • 通常来说,一个事务所做的修改在最终提交之前,对其他事务是不可见的。这个特性确保并发的事务之间不会互相影响。
  • 持久性 (Durability):
    • 一旦事务被提交,它所做的修改将会永久保存到数据库中。即使在事务提交后系统崩溃,修改的数据也不会丢失。

9. ACID怎么实现

  • 原子性 (Atomicity):

    • 日志记录:数据库系统记录所有修改操作的日志。如果事务失败(例如,因为系统崩溃或其他错误),这些日志可用于撤消或回滚未完成的事务,从而确保操作的原子性。
    • 两阶段提交:在分布式系统中,两阶段提交协议确保分布在不同节点的事务部分要么都提交,要么都回滚,从而保证原子性。
  • 一致性 (Consistency):

    • 约束:数据库系统实施一系列的完整性约束(如主键约束、外键约束和检查约束),确保所有事务将数据库从一个一致状态转移到另一个一致状态。
    • 触发器:数据库可以使用触发器来自动执行某些操作,以保持数据的一致性。
  • 隔离性 (Isolation):

    • 锁定:为了防止多个事务同时修改同一数据项,数据库系统引入了各种锁机制,如共享锁、排他锁和意向锁。
    • 多版本并发控制 (MVCC):某些数据库(如 PostgreSQL)使用 MVCC,允许多个事务同时读取同一个数据版本,而不会互相阻塞。
    • 序列化:确保事务按顺序执行,从而避免并发引发的问题。这是最高级别的隔离,但通常对性能有很大影响。
  • 持久性 (Durability):

    • WAL (Write-Ahead Logging):在更改实际数据之前,首先将更改写入持久日志。这确保即使系统崩溃,事务的持久性也可以通过日志恢复。
    • 检查点 (Checkpoints):定期的检查点操作将内存中的数据刷新到硬盘,确保数据的持久性。
    • 备份和恢复:通过定期备份数据库和提供灾难恢复机制,增强数据的持久性。

10. Redis内存穿透击穿雪崩

  • 内存穿透

    • 问题描述:指的是查询一个不存在的数据,由于缓存和数据库中都不会有这个数据,所以每次查询都会“穿透”到数据库。
    • 解决方案
      • 布隆过滤器:使用布隆过滤器可以快速判断一个元素是否存在于集合中,从而避免无效查询到数据库。
      • 缓存空值:如果查询不到数据,也将这个空结果进行缓存,但设置较短的过期时间。
  • 缓存击穿

    • 问题描述:指的是一个热点 key 在缓存过期的瞬间,大量的请求同时涌入,这些请求都会击中数据库。
    • 解决方案
      • 设置不同的过期时间:使得每一个热点数据都有不同的过期时间,从而避免同时过期。
      • 互斥锁:当缓存失效的时候(只有第一个请求需要重新加载数据并写入缓存,其他请求等待),使用互斥锁或分布式锁,防止多个请求同时去加载数据。
  • 缓存雪崩

    • 问题描述:指的是在某一时刻缓存中大量的数据都失效,导致所有请求都去请求数据库,可能会导致数据库瞬时压力过大乃至宕机。
    • 解决方案
      • 预热数据:系统上线前,先将需要的数据加载到缓存中。
      • 设置不同的过期时间:同上,可以避免大量数据同时过期。
      • 数据持久化:Redis 支持 RDB 和 AOF 形式的持久化,可以在服务重启后,快速地从持久化文件中恢复数据。
      • 双层缓存:使用两层缓存,一层的过期时间较短,另一层较长,当第一层失效而第二层数据仍然有效时,可以先返回第二层的数据,同时异步地更新第一层的数据。

11. 抽象类和接口的区别

抽象类(Abstract Class)和接口(Interface)都是面向对象编程中用于实现抽象性和多态性的高级结构。尽管它们在某些方面有相似之处,但在设计和使用上存在几个关键的差异。以下是它们之间的主要区别:

  • 基本定义

    • 抽象类:是一种不能被实例化的类,它可能包含一些抽象方法(没有具体实现的方法)和一些具体的方法。
    • 接口:是一个完全抽象的结构,它只包含抽象的方法(在某些编程语言中,如 Java 8 之后,接口可以有默认方法和静态方法)。
  • 继承和实现

    • 一个类可以继承一个抽象类,并需要提供抽象方法的具体实现。
    • 一个类可以实现多个接口,必须为每个接口提供所有抽象方法的具体实现。
  • 访问修饰符

    • 在抽象类中,可以有公共、受保护和私有方法。
    • 接口中的方法默认都是公共的,且不能被修改。
  • 成员变量

    • 抽象类可以包含数据成员,并可以有构造方法。
    • 接口不能包含数据成员(除非是静态和最终的常量)。
  • 多继承

    • 大多数 OOP 语言(如 Java)不支持多继承,也就是说,一个类不能继承多个类,但可以实现多个接口。
  • 添加新方法

    • 在抽象类中添加新方法可能会破坏所有继承该抽象类的子类。
    • 在接口中添加新方法可能会破坏实现该接口的所有类,除非提供了默认实现或该方法是静态的。
  • 构造函数和静态块

    • 抽象类可以有构造函数和静态代码块。
    • 接口不能有构造函数或静态代码块。
  • 状态和行为

    • 抽象类除了行为(方法)之外,还可以维护状态(变量)。
    • 接口只描述行为,不描述状态。

当你在设计时决定使用抽象类还是接口时,考虑以下几点:

  • 如果你要创建一个对象的基本版本,并允许其他开发者通过继承来扩展其功能,则使用抽象类。
  • 如果你想指定一个类必须遵循的特定合约(行为),则使用接口。
  • 如果你需要多继承,则使用接口。

12. 索引的作用

  • 提高查询速度:索引允许数据库系统不必扫描整个表,可以直接定位到相关的数据行,大大减少查询时间。

  • 加速表连接:对于多表查询(例如使用 JOIN 操作),索引可以极大地加速表间的连接操作。

  • 确保数据的唯一性:通过为表中的某列或列组合创建唯一索引,可以确保每行数据在这些列上的值是唯一的。

  • 提高数据排序和分组速度:索引可以加速 ORDER BYGROUP BY 操作。

  • 辅助数据库优化器:数据库优化器使用索引统计信息来选择最有效的查询执行计划。

13. 如何确保你的sql用到索引

  • 使用 EXPLAIN:大多数关系数据库管理系统提供了 EXPLAIN 命令或相似的工具,允许你看到查询执行计划。这可以帮助你确定查询是否使用了索引。

  • 避免使用非索引列进行计算:例如,WHERE year(birth_date) = 1990 这样的查询可能不会利用 birth_date 上的索引。

  • 使用索引列的前缀:如果有一个多列的复合索引,那么查询条件应至少使用索引的第一列。

  • 避免使用OR:例如,WHERE col1 = value1 OR col2 = value2。除非两个列都已经被索引,否则该查询可能不会使用索引。

  • 确保数据类型匹配:确保查询中的数据类型与表中的数据类型(以及索引的数据类型)相匹配,以避免隐式数据类型转换,这可能会导致索引不被使用。

  • 使用参数化查询:这不仅可以帮助避免 SQL 注入,还可以使数据库更容易地识别并重用执行计划。

  • 定期维护和重新组织索引:随着时间的推移,索引可能会碎片化,导致其效率降低。定期优化或重建索引可以确保它们的效率。

  • 避免使用 SELECT *:尽量只查询你需要的列,这样可以更有效地使用覆盖索引。

  • 避免使用 NOT、LIKE 以%开头的查询:这些查询往往无法有效地使用索引。

  • 更新统计信息:数据库通常维护关于数据分布的统计信息,这有助于优化器选择最佳的执行计划。确保这些统计信息是最新的。

14. Java有哪些锁

  • Synchronized:Java 中的关键字,它提供的锁是非公平的可重入锁。可以同步代码块或方法。

  • ReentrantLock:从 java.util.concurrent.locks 包中的一个类。它是一个互斥锁,并且是完全可重入的。ReentrantLock 允许选择公平性,也提供了更多的功能,如中断的锁获取操作、超时的锁获取等。

  • ReadWriteLock:它包含两个锁,一个是读锁,另一个是写锁。读锁可以由多个线程同时持有,写锁是互斥的。ReentrantReadWriteLock 是其常用实现。

15. linux:如何从一个文件中,删除重复行?

使用 sortuniq 命令是一个常见的方法。以下是如何删除文件中的重复行:

sort filename | uniq > newfile

其中 filename 是你要处理的文件名,newfile 是输出的文件名。这将会把 filename 中的行排序,并使用 uniq 命令删除连续的重复行。 

二、测试用例设计

1. 关于抖音视频推荐,想要把http切换为https

(1)功能性测试:

  • 正常流程:

    a. 访问抖音应用,查看视频推荐页面是否正常加载。

    b. 检查所有外部链接和资源(例如,视频、图片、脚本、CSS)是否都是https。

    c. 在视频推荐中点击一段视频,确保视频正常播放。

    d. 进行一些常规的操作,如点赞、评论和分享,确保这些功能在https下正常工作。

  • 异常处理:

    a. 当使用http URL尝试访问时,应自动重定向到https版本。

    b. 使用过期或无效的SSL证书访问,应显示警告。

(2)安全性测试:

a. 验证所有数据传输是否加密。

b. 在浏览器中检查是否有任何http内容泄露到https页面。

c. 检查中间人攻击的可能性。

d. 使用安全扫描工具检查应用的安全性。

(3)性能测试:

a. 比较http和https下的页面加载时间。

b. 在多用户并发访问的情况下,检查服务器的响应时间。

c. 在不同的网络环境中(如WiFi, 4G, 3G)检查性能差异。

(4)兼容性测试:

a. 使用各种浏览器(如Chrome、Firefox、Safari、Edge等)访问,确保页面正常显示。

b. 在不同的设备上(如手机、平板、桌面)测试功能。

c. 在旧的浏览器版本上,检查是否提示用户升级或显示警告。

(5)持续集成/部署测试:

a. 确保在部署新代码时,所有资源仍然是https。

b. 在新代码部署后,自动执行上述所有测试用例。

(6)用户体验测试:

a. 与http版本相比,评估https版本的用户体验。

b. 从用户角度,提供有关https迁移的反馈。

(7)回滚测试:

a. 在遇到任何关键问题时,确保有回滚到http的策略。

b. 在必要时测试这一回滚策略。

2. 微信点赞朋友圈功能

a. 正常流程:

  • 点击朋友圈消息的点赞按钮,确认状态更新为“已赞”。
  • 再次点击,确保取消点赞。

b. 异常情况:

  • 在网络中断或不稳定时尝试点赞,检查错误处理。
  • 超过点赞数的上限。

c. 并发:

  • 同时从多个设备点赞同一条消息。

3. 秒杀场景

(1)功能性测试:

  • 正常流程:

    a. 在秒杀开始时,检查特定的秒杀商品是否显示为可用。

    b. 成功选购秒杀商品并完成结账流程。

    c. 一旦商品被秒杀完,检查是否显示“已售罄”或类似提示。

    d. 确保购买的商品在用户的订单历史中正确显示。

  • 异常处理:

    a. 尝试在秒杀开始前和结束后购买商品,应得到一个提示或错误消息。

    b. 当商品卖完但用户仍在购买流程中时,应当给予适当的提示。

    c. 在结账过程中,尝试更改商品价格或数量,确保系统不允许这种行为。

(2)并发和性能测试:

a. 模拟高并发场景,例如使用多个用户同时尝试购买同一商品。

b. 检查系统在高流量下的响应时间。

c. 使用压力测试工具模拟大量用户在秒杀开始时同时访问网站。

d. 检查数据库和服务器资源使用情况,确保没有明显的瓶颈或资源耗尽。

(3)安全性和抗攻击测试:

a. 检查是否可以通过脚本或自动化工具进行购买。

b. 尝试使用SQL注入、XSS攻击或其他常见的Web攻击技巧。

c. 确保支付过程安全,数据传输加密。

(4)用户体验和界面测试:

a. 确保所有关于秒杀的信息、时间和提示都清晰可见。

b. 在不同的设备和浏览器上测试用户界面,确保兼容性。

c. 检查是否有明确的错误和成功消息供用户参考。

(5) 稳定性和恢复测试:

a. 模拟服务器或数据库故障,看看系统如何响应。

b. 在高压力情况下重启服务器,检查恢复时间。

(6)数据一致性测试:

a. 确保所有成功的购买都正确记录。

b. 检查商品库存和实际销售数量是否匹配。

(7)网络和基础设施测试:

a. 模拟网络延迟和中断,查看系统的反应。

b. 检查CDN和负载均衡器是否正确配置和工作。

4. 根据微信发红包

a. 正常流程:

  • 发送不同金额和数量的红包,确保接收方能正确领取。

b. 异常情况:

  • 发送金额超过账户余额或单次上限的红包。
  • 未添加银行卡或实名认证时尝试发送红包。

5. 两个栈实现队列 并设计测试用例

a. 正常流程:

  • 通过一个栈输入数据,通过另一个栈输出数据,确保遵循队列的FIFO原则。

b. 异常情况:

  • 当队列为空时尝试出队。
  • 当队列已满时尝试入队。

6.如何给《更改用户名》设置测试场景。

a. 正常流程:

  • 输入新的用户名并保存,确保在各个显示用户名的地方都更新了。

b. 输入验证:

  • 尝试使用空用户名、特殊字符、超过长度限制的用户名等。

c. 异常情况:

  • 在网络中断或不稳定时尝试更改。
  • 更改为已存在的用户名。

d. 安全性:

  • 确保旧用户名和其他相关数据在更改后被正确处理,不会被恢复或泄露。

三、算法

1. 未出现的最小的正整数,要求时间O(n),空间O(1)

public int firstMissingPositive(int[] nums) {
    int n = nums.length;
    for (int i = 0; i < n; i++) {
        while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
            int temp = nums[nums[i] - 1];
            nums[nums[i] - 1] = nums[i];
            nums[i] = temp;
        }
    }
    for (int i = 0; i < n; i++) {
        if (nums[i] != i + 1) {
            return i + 1;
        }
    }
    return n + 1;
}


2. 手撕sql 删除表中重复数据,仅保留id最小那条记录

DELETE t1 FROM mytable t1
JOIN mytable t2 
ON t1.name = t2.name 
WHERE t1.id > t2.id;


3. 两个链表的相交点

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    if (headA == null || headB == null) return null;

    ListNode a = headA, b = headB;

    while (a != b) {
        a = (a != null) ? a.next : headB;
        b = (b != null) ? b.next : headA;
    }
    
    return a;
}

4. 判断回文串,找出最大子回文串

public String longestPalindrome(String s) {
    if (s == null || s.length() < 1) return "";
    int start = 0, end = 0;
    for (int i = 0; i < s.length(); i++) {
        int len1 = expandAroundCenter(s, i, i);
        int len2 = expandAroundCenter(s, i, i + 1);
        int len = Math.max(len1, len2);
        if (len > end - start) {
            start = i - (len - 1) / 2;
            end = i + len / 2;
        }
    }
    return s.substring(start, end + 1);
}

private int expandAroundCenter(String s, int left, int right) {
    while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
        left--;
        right++;
    }
    return right - left - 1;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 4、String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。 5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 7、说出ArrayList,Vector, LinkedList的存储性能和特性 ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean、Message Driven Bea

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

金州饿霸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值