明天就是网易校招笔试了准备一哈!开始自闭刷题模式
1.synchronized 关键字修饰代码块,修饰静态/非静态方法,并不能修饰类的属性。
2.linux软链接可以对目录进行链接(软连接即符号链接,还有硬链接,因为linux这块实在不懂,copy一下别人大神的一些精髓)
文件在Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。
用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;
元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。
在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:
1.文件有相同的 inode 及 data block;
2.只能对已存在的文件进行创建;
3.不能交叉文件系统进行硬链接的创建;
4.不能对目录进行创建,只可对文件创建;
5.删除一个硬链接文件并不影响其他有相同 inode 号的文件。
若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:
1.软链接有自己的文件属性及权限等;
2.可对不存在的文件或目录创建软链接;
3.软链接可交叉文件系统;
4.软链接可对文件或目录创建;
5.创建软链接时,链接计数 i_nlink 不会增加;
6.删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
(转载侵删)
3.快排第一轮排序顺序,排序什么的最坑了,说一下快排原理:
选一个基准点,两个哨兵从两边出发,左哨兵就找大于基准点的,右哨兵就找小于基准点的,找到交换,一直寻找交换直到相遇,交换基准点与相遇点,此时基准点左边的数比基准点小,右边的数比基准点大,完成第一次排序。(重点:基准点在最左侧右哨兵先出发,反之相同,一般以左边第一个为基准点)
后面就是以基准点分割多个数组循环进行寻找,最后就排好序了。
时间复杂度Onlogn,以前数据结构没认真听好后悔,n即为要递归n次,logn是由二分查找所得,因为每次查找的长度为原来的一半,即为n*(1/2)^x,x代表次数,那化简x=logn。
4.二叉排序树即二叉搜索树,左子树小于根,根小于右子树。
5.无论二叉排序树的构建数组长什么样,中序遍历永远都是升序。
6.java实例化子类对象时:构建父类静态代码块→构造子类静态代码块→构造父类非静态代码块→构造父类构造函数→构造子类非静态代码块→构造子类构造函数。
7.super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。this和super不可以同时出现在一个构造函数里面,因为在子类构造函数里如果没有显示调用super则会默认先调用父类无参构造函数。
8.类中的成员变量,存放在堆区。方法中的局部变量,存放在栈区。方法区:又叫静态存储区,存放class文件和静态数据,线程共享。常量区放未经 new 的常量。在多线程环境下,每个线程拥有一个栈和一个程序计数器。栈和程序计数器用来保存线程的执行历史和线程的执行状态,是线程私有的资源。其他的资源(比如堆、地址空间、全局变量)是由同一个进程内的多个线程共享。
9.主机甲和主机乙间已建立一个TCP连接,主机甲向主机乙发送了两个连续的TCP段,分别包含400字节和500字节的有效载荷,第一个段的序列号为300,主机乙正确接收到两个段后,发送给主机甲的确认序列号是1200。
因为确认序列号=原始序列号+TCP段的长度,300即为原始序列号,第一次的确认序列号为300+400=700,第二次确认序列号为600+500=1200。
10.系统中进程的数目越多,CPU的利用率b不一定越高。进程数超过一定程度,就有由于大量进程间切换而耗费过多的cpu资源,所以利用率反而下降。同一个进程的多个线程共享状况为堆共享,栈私有。不是只有使用了多进程技术才会发生死锁问题,多线程也会。进程有独立的地址空间,线程共享进程的空间。
- 关于fork():一个现有的进程可以调用fork函数创建一个新进程。返回值:z子进程中返回0,父进程返回进程id,出错返回-1 。子进程与父进程共享代码空间,但是在创建子进程的时候会独立分配内存空间复制父进程的内存空间,且子进程从父进程创建子进程的代码后开始执行,就是不会从头再执行一遍,是跟随父进程的进度。在拷贝的时候,系统会为子进程创建一个新的进程表项。虽然父子进程共享代码空间,但是在涉及写数据时子进程有自己的数据空间,在有数据修改时,系统会为子进程申请新的页面。所有进程都是init进程直接或者间接的fork出来的。
12.在TCP/UDP传输段中,源端口地址和目的端口地址是不能相同的,否则就会建立自己到自己的连接,白白耗费资源。网络攻击中的LAND 攻击就是利用这个这一点进行攻击的。UDP是用户数据报协议,是一个简单的面向数据报的传输层协议。
TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP—用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
13.TCP连接的每一端都由一个接受缓存,一个发送缓存和几个变量组成,TCP拥塞控制机制让连接的每一端都记录一个额外的变量,即拥塞窗口。定义一个TCP发送“丢包事件”为:出现超时,或者收到来自接收方的3个冗余ACK。当拥塞发生时,会触发丢包事件。控制算法:1.加性增,乘性减;2.慢启动;3.对超时事件作出反应。
14.RTO,TCP超时重传机制(RTO:Retransmission Timeout) ,是TCP操作计时器的一种。为了防止数据报丢失,当TCP发送一个报文时,就启动重传计时器。
1.若在计时器超时之前收到了特定报文的确认,则撤消这个计时器;
2.特定数据报在计时器超时前没有收到确认,则重传该数据报,并把计时器复位。
15
.16.大表1000万条数据, 小表1000条数据, 为提高查询效率两行表关联时通常做法是大表在前。表连接查询时后面的表必然会进行全表扫描,所以数据少的放后面,提高sql语句的执行效率。
17.ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。
ThreadLocal继承Object,相当于没继承任何特殊的。
ThreadLocal没有实现任何接口。
ThreadLocal并不是一个Thread,而是Thread的局部变量。
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。 由于每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问。
18.Java中的多线程是一种抢占式的机制,而不是分时机制。wait和sleep都可以通过interrupt方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。 sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常 。
19.可以将一个LinkedList类型的对象赋值给 LinkedList 类型的变量吗?为什么?赋值给Object类型的变量呢?
copy一段大佬的解释
1.首先,二者不是父子类关系。
如果是普通的父子类关系,由于Java的多态性,底层的后期绑定机制会在运行时检索子类方法列表,从而实现多态。
2.List属于泛型。(也算是多态的一种)
Java的泛型实现是基于类型擦除的。换句话说,List与List由于类型擦除,在编译后会映射到相同的List类型上,也就是运行时实际无法区分二者,不过在取用时,编译器会进行类型还原,从而变为原来的List与List。也就是两者本质上是相同的东西,直接混用会影响类型还原的区分,因此二者不能直接转换。(List<?>)实际是将类型模糊化,然后再具体化的过程。
20.在实际编程中,在遇到输出浮点数的时候,经常会发现无法精确地按照预想的数值输出,为什么?请举例说明。
因为存在小数往往是除不尽的会存在误差
21.TCP中,客户端用Socket,服务器端用ServerSocket
22.java普通IO是面向流的,NIO是面向缓冲区的。NIO各种流是非阻塞的,如果没有数据可用也不会阻塞线程。NIO中的ServerSocketChannel可以监听tcp链接,每一个新来的链接都会创建一个SocketChannel。java NIO中 Selector,用于检查一个或多个NIO Channel状态是否处于可读、可写。
还是有一些没消化理解的继续努力学习。