某游戏公司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.泛型是什么?有什么作用?

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

你可能感兴趣的:(八股合集,java,面试,python)