某游戏公司Java面试八股文总结

1.值传递和引用传递区别?Java中为什么都是值传递?

值传递(Pass by Value):

  • 在值传递中,函数或方法的参数是原始数据的拷贝,而不是原始数据本身。
  • 当你将一个值传递给函数时,函数内部对该值的任何修改不会影响原始值
  • Java 中的基本数据类型(如int、float、char等)都是通过值传递传递给方法的。

引用传递(Pass by Reference):

  • 在引用传递中,函数或方法的参数是原始数据的引用或地址,而不是拷贝
  • 当你将一个引用传递给函数时,函数内部对该引用所指向的对象的任何修改都会影响原始对象。
  • Java 中的对象(除了基本数据类型之外)是通过引用传递传递给方法的。

在Java中,通常说Java是值传递,是因为所有的参数传递都是按值传递的。但是需要注意的是,对于对象类型的参数,传递的是对象引用的值(地址或者说指针),而不是对象本身。这意味着,虽然对象引用是通过值传递传递的,但仍然可以在方法内部修改对象的状态。

2.优先队列和队列?

优先队列(Priority Queue)和普通队列(Queue)是两种不同的数据结构,它们的主要区别在于元素的排列和取出顺序。

队列(Queue):

  • 队列是一种基本的数据结构,遵循先进先出(FIFO)的原则。这意味着先进入队列的元素将首先被取出。
  • 队列通常用于处理任务或数据按照顺序到达的情况,例如,打印队列中的文档或处理消息队列中的消息。
  • 常见的队列操作包括入队(enqueue)和出队(dequeue)。

优先队列(Priority Queue):

  • 优先队列也是一种队列,但它与普通队列不同,因为元素在插入时具有优先级,并且元素的取出顺序取决于它们的优先级,而不是它们进入队列的顺序。
  • 具有较高优先级的元素会在具有较低优先级的元素之前被取出。
  • 优先队列通常用于需要根据某种规则或权重来处理元素的情况,例如任务调度、最小堆或最大堆数据结构等。
  • 常见的操作包括插入元素(insert)和取出优先级最高的元素(extract-min或extract-max,取决于实现)。

在Java中,可以使用PriorityQueue类来实现优先队列,而标准队列可以使用Queue接口的不同实现类来实现,例如LinkedList或ArrayDeque。

3.git中的暂存区是什么?有什么作用?为什么要有它?SVN都没有暂存区

Git中的暂存区(Staging Area)是一个关键的概念,用于在提交更改到版本库之前,存储和准备要包含在下一次提交中的文件。暂存区充当了临时缓冲区,允许你选择性地添加、修改或删除文件,以便更好地控制提交的内容。它的主要作用包括以下几点:

  • 分离工作目录和版本库:暂存区允许你将工作目录中的更改分成多个步骤,你可以先将一部分更改添加到暂存区,然后在适当的时候提交这些更改。这使得你可以更灵活地控制提交的内容,以确保只提交了你想要的更改。

  • 检查更改:暂存区允许你仔细检查你的更改,确保它们符合你的期望,然后再将它们提交。这有助于减少错误提交的风险。

  • 分支工作:暂存区有助于处理分支工作。你可以在不同分支上进行更改,将它们分别添加到暂存区,然后根据需要切换分支并提交相应的更改。

  • 提交清晰度:暂存区提供了更清晰的提交历史。你可以通过暂存区来构建逻辑上有序的提交,将相关更改分组在一起,以便更容易追踪和理解项目的发展历史。

相比之下,SVN(Subversion)等传统版本控制系统通常不具备暂存区的概念。在这些系统中,你必须一次性提交所有更改,包括工作目录中的所有文件更改。这可能导致一些问题,如无法选择性提交、更改未准备好提交等。Git引入了暂存区,以解决这些问题并提供更多灵活性。

暂存区是Git的一个重要特性,它使版本控制更加灵活,允许开发人员更好地管理和控制他们的更改,以便构建更可靠和清晰的版本历史。

4. 数组和arraylist区别 都能装什么类型的数据?

数组(Array):

  • 数组是一个固定大小的数据结构,一旦创建,其大小通常不能更改
  • 数组可以包含基本数据类型(如int、double、char等 和包装类)以及对象类型(如自定义类的对象)。
  • 数组元素的类型必须是相同的,即数组可以存储相同类型的数据。

ArrayList:

  • ArrayList是Java集合框架中的一个类,它实现了可变大小的动态数组
  • ArrayList可以包含对象类型,而不限于基本数据类型。你可以存储任何对象(包括基本数据类型的包装类)。
  • ArrayList可以自动增长以适应添加的元素,因此不需要提前指定大小。
  • ArrayList提供了丰富的方法来操作和管理列表,例如添加、删除、查找、遍历等。
  • ArrayList是泛型容器,泛型参数需要是一个引用类型(对象类型)基本数据类型不是引用类型,而是值类型

5.p2p 是什么?

P2P,或点对点(Peer-to-Peer)是一种网络架构,其中每个节点(或计算机)在网络中扮演相同的角色,与其他节点直接通信,而不依赖于中央服务器或中心节点。在P2P网络中,节点之间可以充当客户端和服务器,允许它们相互交换数据、资源或服务。

主要特点和优点包括:

  • 去中心化:P2P网络不需要中央服务器来协调节点之间的通信。每个节点都可以直接与其他节点通信,从而减少单点故障的风险。

  • 分布式:数据和资源可以在网络中分布存储,从而提高了数据冗余性和可靠性。这有助于降低网络中断的风险。

  • 自扩展性:P2P网络通常具有自扩展性,允许新节点加入网络并贡献资源,从而扩大网络的规模和性能。

  • 隐私和安全:P2P网络可以提供更好的隐私和安全,因为数据不需要通过中央服务器传递,而是在节点之间直接交换。

  • 分担负载:P2P网络分散了数据传输的负担,因此可以减轻服务器的负载,提高整体性能。

P2P网络在许多领域都有应用,包括文件共享(如BitTorrent)、区块链、语音通信、在线游戏、视频流媒体等。然而,P2P网络也可能面临一些挑战,如安全性、管理、数据一致性等问题,需要仔细考虑和处理。

6.堆排序实现过程?时间复杂度?

  • 建立初始堆:将待排序的数组视为一个完全二叉树,并构建一个初始的最大堆(或最小堆),其中根节点的值大于(或小于)子节点的值。构建堆的过程可以从最后一个非叶子节点开始,自底向上,通过不断调整堆的结构来实现。这确保了根节点是最大(或最小)元素。

  • 交换堆顶和末尾元素:将堆顶元素(根节点)与数组的最后一个元素交换位置,这将最大(或最小)元素移至数组的末尾。

  • 调整堆:将堆的大小减一,然后对新的堆顶元素执行一次堆调整(sift down)操作,将次大(或次小)元素移到堆顶。重复这个过程直到整个数组有序。

  • 重复步骤2和3,直到整个数组排序完成。

堆排序的时间复杂度是O(n * log n),其中n是要排序的元素数量。堆排序是不稳定的排序算法,因为在交换堆顶元素的过程中,相等元素的相对顺序可能会改变。堆排序在最坏、平均和最好情况下的时间复杂度都是一样的,因此具有稳定的性能。尽管堆排序的时间复杂度相对较高,但它具有原地排序的特点,不需要额外的内存空间来存储数据,因此对于大规模数据集来说,它仍然是一个有效的排序算法。

为什么堆排序在最坏、平均和最好情况下的时间复杂度都是一样的?

因为堆排序的主要时间消耗在两个方面:建立初始堆和进行堆调整(Heapify)操作。不管数组的初始状态如何,这两个过程都具有相同的时间复杂度。

  • 建立初始堆:在最坏、平均和最好情况下,建立初始堆所需的时间都是O(n),因为我们可以通过从最后一个非叶子节点开始,自底向上逐个进行堆调整操作,以线性时间构建初始堆。

  • 堆调整操作:堆调整操作的时间复杂度是O(log n),因为在每次调整过程中,我们将堆的高度减小1。

7.http和tcp关系?

TCP(Transmission Control Protocol):

  • TCP是一种面向连接的、可靠的传输层协议,它负责确保数据可靠地传输。它处理数据的分割、重组、流控制、错误检测和纠正等任务
  • 在进行数据通信时,客户端和服务器之间首先建立TCP连接,然后可以在连接上进行数据传输。
  • TCP是一种基于字节流的协议,它提供了有序的、可靠的数据传输,并在通信结束时关闭连接。

HTTP(Hypertext Transfer Protocol):

  • HTTP是一种应用层协议,用于在Web上传输超文本文档,如网页。它建立在TCP之上,利用TCP的可靠性和连接功能
  • HTTP定义了客户端和服务器之间的请求和响应的消息格式,以便获取和传递Web资源。
  • HTTP是一种无状态协议,每个HTTP请求都是独立的,服务器不会保留关于之前请求的信息,除非使用会话或Cookie等机制来维护状态信息。

HTTP使用TCP作为其传输层协议,这是因为TCP提供了可靠的、面向连接的通信,适合于需要确保数据完整性和可靠性的Web通信。在HTTP通信中,客户端(通常是Web浏览器)向服务器发送HTTP请求,服务器接收并处理请求,然后返回HTTP响应。这些HTTP请求和响应都被封装在TCP连接中,以便安全可靠地传输数据。

8.操作系统局部性原理是什么?有什么作用?

操作系统的局部性原理是一种关于计算机性能优化的原则,它包括两个重要概念:时间局部性(Temporal Locality)和空间局部性(Spatial Locality)。这些原理描述了在程序执行期间,计算机系统访问数据和指令的方式,以便更有效地利用计算机的存储系统和缓存,从而提高性能。

时间局部性(Temporal Locality):

  • 时间局部性指的是在短时间内,如果程序访问了某个数据或指令,那么在不久的将来它可能会再次访问相同的数据或指令
  • 这意味着一旦数据被加载到计算机的高速缓存或寄存器中,它在接下来的指令中可能会被多次使用,从而减少了内存访问的开销。

空间局部性(Spatial Locality):

  • 空间局部性指的是如果程序访问了某个数据或指令,那么它可能会在附近的位置上访问其他数据或指令
  • 这意味着程序往往在内存中访问一块连续的数据,从而可以从内存中读取较大块的数据,以满足未来的需求。

局部性原理的作用包括:

  • 提高性能:局部性原理有助于减少内存访问的延迟,从而提高计算机程序的性能。通过减少缓存未命中和内存访问次数,可以大幅降低程序的执行时间。

  • 更好地利用缓存:局部性原理有助于更好地利用计算机的高速缓存。缓存是一种存储子系统,可以加速数据访问,而局部性原理可以最大限度地减少缓存的未命中率。

  • 减少I/O开销:对于磁盘和网络访问,局部性原理同样适用。减少磁盘和网络访问次数可以显著减小I/O开销,提高整体系统性能。

9.泛型是什么?有什么作用?

所谓泛型,就是允许在定义类、接口时通过 一个标识 表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时确定。
泛型

10.Java序列化、serialVersionUID什么作用?如果序列化时serialVersionUID不一致会怎么样?

  • Java序列化是将对象转换为字节流,以便在网络传输或保存到磁盘上。它允许对象的状态在不同应用程序和平台之间进行传输和重建。
  • serialVersionUID 是一个序列化版本号,用于标识类的不同版本。它在类的序列化和反序列化过程中用于检查类的版本是否匹配,以确保反序列化的对象与序列化时的类版本兼容。如果版本不一致,反序列化会失败并抛出 InvalidClassException。

11.Java泛型中的类型擦除:

  • 类型擦除是Java泛型的特性之一。它意味着在编译时泛型类型信息会被擦除,编译后的字节码中不再包含泛型类型信息。这是为了保持Java的向后兼容性和减少运行时开销。
  • 例如,List 和 List 在运行时都被视为 List<Object&gt;泛型类型参数被擦除为它们的上界(通常是 Object)。

类型擦除的特征

  • 所有泛型类的类型参数在编译时都会被擦除,虚拟机运行时中没有泛型,只有普通类和普通方法,从这一点上来说,Java中的泛型从某种程度上是一种语法糖
  • Java泛型不支持基本类型 例如: short int double等
  • 在泛型代码内部,无法获得任何有关泛型参数类型的信息,如果传入的类型参数为T,那么在泛型代码内部你不知道T有什么方法,属性,关于T的一切信息都丢失了
  • 创建泛型对象时请指明类型,让编译器尽早的做参数检查
  • 不要忽略编译器的警告信息,那意味着潜在的ClassCastException等着你
  • Java的泛型类型不能用于new构建对象(也不能用于初始化数组).泛型不能用于显性地引用运行时类型的操作之中,例如转型,instanceof和new操作(包括new一个对象,new一个数组),因为所有关于参数的类型信息都在运行时丢失了,所以任何在运行时需要获取类型信息的操作都无法进行工作。

12.MYSQL的时间类型:

  • MySQL支持多种时间类型,常见的有 DATE、TIME、DATETIME、TIMESTAMP、YEAR 等。
  • 选择哪种时间类型取决于需求,一般建议使用 DATETIME 或 TIMESTAMP,它们提供了日期和时间的完整信息。
  • TIMESTAMP 和 DATETIME 都占用8字节的存储空间。
  • TIMESTAMP 的优点是自动更新时间戳,适合存储记录的创建和修改时间。缺点是其范围有限,从1970年到2038年。
  • DATETIME 不受时间戳范围限制,但需要手动设置时间值。

13.MYSQL聚簇索引(索引分类)

在InnoDB存储引擎中,根据索引的存储形式,可以分为以下两种:
在这里插入图片描述
二级索引细分:
单列索引:即一个索引只包含单个列。

联合索引:即一个索引包含了多个列。

14.JPA和MyBatis的区别、优缺点:

  • JPA(Java Persistence API)和 MyBatis 是两种不同的持久化框架。
  • JPA 是一种ORM(对象关系映射)框架,它将Java对象映射到数据库表,提供了对象级的数据访问。它具有标准化的API,例如Java EE标准中的JPA规范。
  • MyBatis 是一种SQL映射框架,将SQL语句映射到Java方法,并提供了更直接的数据库访问控制。
  • JPA的优点包括标准化、面向对象、自动化查询生成等。MyBatis的优点包括更灵活的SQL控制、性能调优能力、SQL可读性。
  • JPA适用于需要标准化和对象级别映射的应用,MyBatis适用于需要更细粒度控制SQL的应用。

15.MYBATIS中#和&(除了预防SQL注入,还有什么区别)

#(井号):预编译参数:

  • #用于预编译参数,它将参数值安全地填充到SQL语句中,并可以防止SQL注入攻击。
  • #在传递参数值之前会将参数值转义,使之成为SQL语句的一部分。
  • #通常用于传递参数值,如 SELECT * FROM table WHERE column = #{value}。

&(和号):直接替换参数:

  • & 用于直接替换参数,它将参数值不加处理地插入SQL语句中。
  • & 不会进行预编译,因此需要小心防止SQL注入攻击,应确保参数值是安全的。
  • & 通常用于传递SQL片段、表名、列名等不需要转义的部分,如 SELECT * FROM t a b l e N a m e W H E R E c o l u m n = ′ {tableName} WHERE column = ' tableNameWHEREcolumn={value}'。

除了预防SQL注入之外,这两种参数处理方式还有其他区别和使用场景:

  • #适用于传递参数值,如数字、字符串等。它可以确保参数值的安全性,并且不需要手动处理引号等问题。
  • & 适用于传递SQL片段表名、列名等需要直接插入SQL语句的情况。在使用 & 时,需要特别小心,确保传递的内容是受信任且不会引发SQL注入问题。
  • 总的来说,选择 # 还是 & 取决于你要传递的内容和是否需要防止SQL注入。通常,建议尽量使用 # 来确保安全性,只有在特殊情况下使用 & 并小心防范潜在的风险。

16.HTTP常见状态码、302和301的区别

在这里插入图片描述
1xx 信息

  • 100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。

2xx 成功

  • 200 OK
  • 204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
  • 206 Partial Content :表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。

3xx 重定向

  • 301 Moved Permanently :永久性重定向

  • 302 Found :临时性重定向

    • 当客户端发送一个请求后,服务器可以返回 302 响应,同时提供一个新的URL,客户端会被重定向到新的URL来获取资源。
    • 302 是一种临时性重定向,客户端应该继续使用原始URL
    • 与 302 不同,301 表示资源的重定向是永久的,客户端应该将原始URL更新为新的URL,并在以后的请求中使用新URL。
    • 301 对于搜索引擎优化(SEO)很重要,因为它告诉搜索引擎新的URL是永久性的,应该更新索引。
  • 303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。

  • 304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码。

  • 307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。

4xx 客户端错误

  • 400 Bad Request :请求报文中存在语法错误。
  • 401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。
  • 403 Forbidden :请求被拒绝。
  • 404 Not Found

5xx 服务器错误

  • 500 Internal Server Error :服务器正在执行请求时发生错误。
  • 503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java面试八股文是指在准备Java面试时需要重点掌握的一些核心知识和常见问题。下载Java面试八股文是为了将这些知识和问题整理成一份文档,方便学习和准备。这份文档通常包含Java基础知识、Java集合框架、多线程、IO流、数据库、设计模式、网络编程等各个方面的问题和答案。 Java面试八股文的下载对于准备面试的候选人来说非常重要。因为Java面试的问题种类繁多,面试官可能会选择任意一个方面进行提问。同时,面试官一般会倾向于问一些经典的问题,以便评估候选人对于基础和核心知识的掌握程度。如果候选人能够提前下载并学习这份八股文,不仅可以提高回答问题的准确性和流利度,还能够帮助候选人在面试中更好地展示自己的能力和优势。 当然,光有Java面试八股文还远远不够,候选人还需要结合自己在实际项目中的经验、对于面试岗位的理解以及对于技术的持续学习来进行综合准备。另外,面试本身也不是仅仅靠死记硬背答题,更重要的是能够准确理解问题的本质,提出合理的解决思路和方案,并能够清晰地表达自己的观点和思考过程。 总的来说,下载Java面试八股文是为了提高面试准备的效率和质量,但准备八股文只是面试准备的一部分,更重要的是掌握基础知识、理解问题本质,发展自己的解决问题的能力。希望以上回答对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值