2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
ArrayList底层是基于数组实现的。它通过动态地扩容或者缩小数组的大小来实现。当容量不够时,它会新建一个更大的数组,然后将原来的数据复制过来,最后再将新数据添加进去。
ArrayList扩容的机制是:当添加第一个元素时,ArrayList的容量为10;每次添加新的元素时,如果超过了容量,就会将原来的容量加倍,即原来的容量*2,如果原来的容量是0,则新的容量为1。
ArrayList 内部实现是基于数组,当多线程同时访问同一个ArrayList是可能出现数据不一致的情况,比如,当一个线程正在读取ArrayList的数据,而另外一个线程正在向ArrayList中添加/删除数据,可能会使ArrayList中的数据发生变化,这样一来,读取ArrayList数据的线程就可能读取到不正确的数据,从而导致程序出错。
栈是一种特殊的线性表,其特点是数据只能在一端进行插入和删除操作,先进后出,后进先出的原则。它是一种存储结构,可以用来存储函数的参数值、局部变量等。
堆是一种特殊的树形结构,其特点是所有节点的值都大于或等于其子节点的值,其根节点的值最大或最小。堆是一种动态的存储结构,可以用来存储大量的数据,如排序、搜索等。
协程的本质是一个轻量级的线程,每个协程都有一个栈,用来存储函数及其参数、局部变量等,协程可以被挂起、恢复、切换,这是实现协程的基础。
状态同步是指在每个控制周期中,将多机系统中的每台机器的状态(如位置、速度、加速度等)传输给其他机器,使得每台机器都保持同步。状态同步可以实现多机协同控制的实时性,但是由于每个控制周期中都需要传输大量的数据,它的精度可能比较低。
帧同步是指在每个控制周期中,将多机系统中的每台机器的控制命令传输给其他机器,使得每台机器都保持同步。帧同步可以实现多机协同控制的精度,但是由于每个控制周期中只传输少量的控制命令,它的实时性可能比较低。
HashMap 底层采用数组 链表(红黑树)实现,它根据键的 hashCode 值存储数据,根据哈希码能够计算出数据在数组中的位置(哈希冲突),用链表(红黑树)来存储冲突的数据。HashMap 在 Java 8 中,当链表长度超过阈值(默认为 8)时,会转化为红黑树,提高查询效率。当容量不够时会自动扩容,默认的负载因子是 0.75,扩容的方式是容量的 2 倍
栈和队列的使用场景?
浏览器的前进后退功能:浏览器访问过的网页可以通过栈的数据结构来实现前进和后退功能。
TCP粘包问题是指由于TCP协议在传输数据时没有对数据进行分片处理,导致接收端收到的数据量大于发送端发送的数据量。
首先,UDP数据报可以帮助实现TCP/IP协议中的三次握手过程。在第一次握手中,一个客户端发送一个UDP数据报,其中包含一个握手请求。当服务器收到这个报文,就会回复一个确认报文,表示服务器已经收到客户端的握手请求,并准备好提供服务。在第二次握手中,客户端会再次发送一个UDP数据报,这次的报文中包含了一些有用的信息,比如客户端的IP地址、端口号等,以便服务器可以识别客户端。在第三次握手中,服务器会发送一个UDP数据报,表示连接已经建立,客户端可以开始发送数据了。
其次,UDP数据报还可以帮助实现TCP/IP协议中的数据传输过程。当客户端需要向服务器发送数据时,会将数据封装成一个UDP数据报,并发送给服务器;服务器收到这个UDP数据报后,会解析报文中包含的数据,并进行相关处理。
最后,UDP数据报还可以帮助实现TCP/IP协议中的结束连接过程。当客户端不再需要和服务器进行通信时,可以发送一个UDP数据报,表示客户端要结束连接了,服务器收到这个报文后,就会释放相应的资源,从而完成整个TCP/IP协议的连接过程
协程允许程序在不同任务之间切换,从而提高程序的效率,减少程序的运行时间。协程可以让程序在多个任务之间切换,而不是等待一个任务完成之后才能开始另一个任务。它还可以在不同的线程之间共享变量,从而减少程序的运行时间。对于多任务应用来说,使用协程可以显著 提高性能,从而带来更快的运行速度。
数组更快,因为数组每个元素的地址都是连续固定的,可以快速取得下一个元素的地址,而链表每个元素地址都是不连续的,需要遍历指针取得下一个元素的地址,所以数组遍历更快。
虚函数是一种特殊的函数,它与普通函数的区别在于它由编译器自动定义,在编译时就可以被调用。虚函数的特点就是它的实现是在运行时决定的,而不是在编译时决定的。
虚函数的主要目的是为了达到多态性,一个抽象类可以定义多个虚函数,然后由其子类实现这些函数,
不一定要是虚函数,但是一般建议使用虚函数,因为虚函数可以被派生类覆盖,这样派生类的析构函数能够正确执行,若不使用虚函数,则派生类的析构函数不会被调用,可能会导致内存泄漏等问题。
渲染管线是一系列的步骤,用于将游戏场景的数据从输入信息转换为屏幕显示的图像。
渲染管线的过程分为三个主要阶段:准备阶段、几何阶段和光照阶段。
在准备阶段,游戏引擎将游戏场景的模型和纹理加载到图形处理器(GPU)中,并组织数据以 便在后续阶段使用。
在几何阶段,将使用矩阵变换将模型置于三维空间中,并将模型转换为可被屏幕上的像素支持的形式。
在光照阶段,将使用光源和光照模型来计算每个像素的颜色值,最终将生成的图像显示在屏幕上。
贪心算法取得最优解的条件是“最优子结构”和“贪心选择性质”: