1.HashMap和HashTable的区别,及其实现原理。
HashTable底层是用HashMap实现的,与HashMap的区别是,HashTable是按存入顺序排序的,而HashMap不是。HashMap的原理是有一个大的table数组组成,每个数组元素是一个Entry。为了处理冲突,通常会将Entry用链表实现。
ArrayList,LinkedList 和Vector的区别和实现原理。
ArrayList是基于数组的可变长数组,因为这个特性,所以它更适合实现get和set;LinkedList是基于双向链表的,所以比较适合实现插入和删除等操作;但以上两个都是非线程安全的,Vector的实现和ArrayList差不多,改进的地方是使用synchronized实现了线程安全。
TreeMap和TreeSet区别和实现原理。
其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常用实现类。TreeSet 底层是通过 TreeMap 来实现的(如同HashSet底层是是通过HashMap来实现的一样),因此二者的实现方式完全一样。而 TreeMap 的实现就是红黑树算法。
相同点:
- TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的。
- TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之间共享,不过可以使用方法Collections.synchroinzedMap()来实现同步
- 运行速度都要比Hash集合慢,他们内部对元素的操作时间复杂度为O(logN),而HashMap/HashSet则为O(1)。
不同点:
- 最主要的区别就是TreeSet和TreeMap非别实现Set和Map接口
- TreeSet只存储一个对象,而TreeMap存储两个对象Key和Value(仅仅key对象有序)
- TreeSet中不能有重复对象,而TreeMap中可以存在
- TreeMap的底层采用红黑树的实现,完成数据有序的插入,排序。
ConcurrentHashMap实现原理(锁分离技术)。String和StringBuffer,StringBuilder区别和联系,String为啥不可变,在内存中的具体形态。
String:字符串常量,字符串长度不可变。
StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法。
StringBuilder:字符串变量(非线程安全)。在内部,StringBuilder对象被当作是一个包含字符序列的变长数组。
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。
2.java中多线程机制,实现多线程的两种方式(继承Thread类和实现Runnable接口)的区别和联系。
3.java线程阻塞调用wait函数和sleep区别和联系,还有函数yield,notify等的作用。
wait是Object的方法,sleep是Thread类的方法;
wait让出CPU资源的同时会放弃锁,sleep让出CPU资源的同时不会释放锁;
wait需要notify或者notifyall来唤醒,sleep在沉睡指定时间后,会自动进入就绪状态;
4.java中的同步机制,synchronized关键字,锁(重入锁)机制,其他解决同步的方volatile关键字ThreadLocal类的实现原理要懂。
5.java中异常机制
Throwable是Error和Exception的父类,Error一般是指JVM抛出的错误,不需要捕获,Exception是程序错误,需要捕获处理;
6.comparable接口和comparator接口实现比较的区别和用法,Arrays静态类如下实现排序的。
7.问快排的优化,怎么选基准,我就说随机化,防止退化。谈谈快排,于是3种快排4种优化方式,以及partition函数的应用。
3种快排,是指3中基数的选择方法:固定位置、随机、三数取中;
4种优化:(1)当待排序序列的长度分割到一定大小后,使用插入排序;
(2)在一次分割结束后,可以把与Key相等的元素聚在一起,继续下次分割时,不用再对与key相等元素分割;
(3)优化递归操作;
(4)使用并行或多线程处理子序列;
随机化可以解决当数组有序或者部分有序时的退化,但是当数组元素全部重复的时候,时间复杂度依然很高;
三数取中:对待排序序列中low、mid、high三个位置上数据进行排序,取他们中间的那个数据作为枢轴,并用0下标元素存储枢轴。这个方法还是无法解决重复数组的问题。
在一次分割结束后,可以把与Key相等的元素聚在一起,继续下次分割时,不用再对与key相等元素分割,可以明显提高重复数组的效率。
STL中的Sort函数:当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。STL采用的做法称为median-of-three,即取整个序列的首、尾、中央三个地方的元素,以其中值作为枢轴。
8.在栈上为什么不能用变量做数组的长度,堆上可以吗?
9.问了我的项目,QQ聊天系统,怎么实现的,客户端为什么要用TCP和UDP结合,用UDP协议有什么好处,消息是怎样定义的,怎样区分不同的 消息,怎么知道使用锁的。我给他说了epoll、线程池,Reactor模式,以及自己实现的哈希表,线程之间怎样同步等
---------------------------------------------腾讯-----------------------------------------------------
1.TCP/UDP区别,TCP三次握手,SYN攻击
TCP是面向连接的可靠传输,需要三次握手,保证可靠通信;有重传机制;
UDP是无连接的不可靠传输,但是速度快,适用于视频和电话会议等实时应用场景;
TCP三次握手是:SYN=x(SYN_SEND)、ACK=x+1,SYN=y(SYN_RECV)、ACK=y+1(ESTABLISHED);
SYN攻击是:SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。
检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。
一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范。过滤网关防护主要包括超时设置,SYN网关和SYN代理三种。调整tcp/ip协议栈,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等。
但一般服务器所能承受的连接数量比半连接数量大得多
2.SHA,MD5
SHA(安全哈希算法):该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。可以对任意长度的数据运算生成一个160位的数值。SHA将输入流按照每块512位(64个字节)进行分块,并产生20个字节的被称为信息认证代码或信息摘要的输出。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。
MD5(信息-摘要算法5):MD5将任意长度的“字节串”映射为一个128bit的大整数。MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
原理参见:
两者比较:
(1)对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
(2)对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
(3)速度:在相同的硬件上,SHA-1的运行速度比MD5慢。
3.了解的网络攻击手段,可以怎么预防
拒绝服务攻击:
(1)SYN拒绝服务攻击:目标计算机如果接收到大量的TCP SYN报文,而没有收到发起者的第三次ACK回应,会一直等待,处于这样尴尬状态的半连接如果很多,则会把目标计算机的资源(TCB控制结构,TCB,一般情况下是有限的)耗尽,而不能响应正常的TCP连接请求。
(2)ICMP洪水:。这样如果攻击者向目标计算机发送大量的ICMP ECHO报文(产生ICMP洪水),则目标计算机会忙于处理这些ECHO报文,而无法继续处理其它的网络数据报文,这也是一种拒绝服务攻击(DOS)。
(3)UDP洪水;
(4)死亡之PING:TCP/IP规范要求IP报文的长度在一定范围内(比如,0-64K),但有的攻击计算机可能向目标计算机发出大于64K长度的PING报文,导致目标计算机IP协议栈崩溃。
(5)IP地址欺骗:如果一个攻击者向一台目标计算机发出一个报文,而把报文的源地址填写为第三方的一个IP地址,这样这个报文在到达目标计算机后,目标计算机便可能向毫无知觉的第三方计算机回应。这便是所谓的IP地址欺骗攻击。
4.10亿条短信,找出前一万条重复率高的
(1)首先将文本导入数据库,再利用select语句某些方法得出前10条短信。(索引)但是这个时间效率很低;
(2)使用hash计算并存储次数,然后遍历一次找出top10;
5.对一万条数据排序,你认为最好的方式是什么
申请长度为一千万位的位向量bit[10000000],所有位设置为0,顺序读取待排序文件,每读入一个数i,便将bit[i]置为1。当所有数据读入完成,便对bit做从头到尾的遍历,如果bit[i]=1,则输出i到文件,当遍历完成,文件则已排好序。本机运行耗时9秒49毫秒。
(这种方法要求数组中的数据没有重复,且都不超过最大值)
1、10w行数据,每行一个单词,统计出现次数出现最多的前100个。
(1)可以使用小根堆;
(2)在linux中实现:cat words.txt | sort | uniq -c | sort -k1,1nr | head -10
uniq -c: 显示唯一的行,并在每行行首加上本行在文件中出现的次数
sort -k1,1nr: 按照第一个字段,数值排序,且为逆序
2、一个文本文件,给你一个单词,判断单词是否出现。
grep -wq "fail" 123.txt && echo "no"||echo "yes"
新手推荐看
http://www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf
进阶推荐看
http://www.tldp.org/LDP/abs/abs-guide.pdf
3、两个线程如何同时监听一个端口。
多个线程可以监听同一个端口,但我们通常不这样做。
多个进程也可以同时监听一个端口,比如nginx。
----------------------------------------百度-----------------------------------------------------
一面:
1.怎样设计实现一个高效的线程安全的hashmap 。
方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的。 这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现。
方法二:重新改写了HashMap,具体的可以查看java.util.concurrent.ConcurrentHashMap. 这个方法比方法一有了很大的改进。(锁分离)
方法一使用的是的synchronized方法,是一种悲观锁.在进入之前需要获得锁,确保独享当前对象,然后做相应的修改/读取.
方法二使用的是乐观锁,只有在需要修改对象时,比较和之前的值是否被人修改了,如果被其他线程修改了,那么就会返回失败.锁的实现,使用的是 NonfairSync. 这个特性要确保修改的原子性,互斥性,无法在JDK这个级别得到解决,JDK在此次需要调用JNI方法,而JNI则调用CAS指令来确保原子性与互斥性.
重写和重载
(1)重写:需要继承;方法吗和参数、返回值必须相同,权限修饰符必须大于等于父类;不可以重写父类的private方法;不可以抛出父类没有抛出的异常;
(2)重载:方法名必须相同;参数个数、类型有一个不相同;返回值可以相同也可以不同;可以有不同的访问修饰符;可以抛出不同异常。
2.用过的设计模式。写单例模式代码,各种情况下比如去掉某一句会怎样。
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。
单例模式:
工厂模式:程序在接口和子类之间加入了一个过渡端,通过此过渡端可以动态取得实现了共同接口的子类实例化对象。
代理模式:指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理。
观察者模式:
适配器模式:如果一个类要实现一个具有很多抽象方法的接口,但是本身只需要实现接口中的部分方法便可以达成目的,所以此时就需要一个中间的过渡类,但此过渡类又不希望 直接使用,所以将此类定义为抽象类最为合适,再让以后的子类直接继承该抽象类便可选择性的覆写所需要的方法,而此抽象类便是适配器类。
3、介绍同步锁,使用情景;
synchronized
4、假如有两个线程,一个线程A,一个线程B都会访问一个加锁方法,可能存在并发情况,但是线程B访问频繁,线程A访问次数很少,问如何优化。(然后面试官说有了解过重度锁和轻度锁吗)
5、进程间都有哪些通信方式;
1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
2.高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
3.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
4.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
5.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
7.共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
8.套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
6、有一个整数,转换为二进制,请找出所有的1的数量;
只计算1的个数使用:
while(n>0)
count++;
n = n & (n-1);
7、你觉得Java是完全面相对象的语言吗?
8、讲解下你对抽象,多态的理解;
抽象就是将实际事物特征抽象出来,用一个类表示,类中的属性就表示事物的不同特征。
抽象类和接口就是抽象的一种表象。
多态
①使用父类类型的引用指向子类的对象;
②该引用只能调用父类中定义的方法,不能调用子类中独有的方法;
③如果子类中重写了父类中的一个方法,那么在调用该方法的时候,将会调用子类中的这个方法;
④在多态中,子类可以调用父类中的所有方法;
⑤多态主要体现为方法重载和方法重写,相同的行为,不同的实现方式;
⑥多态的主要应用是多态参数和多态集合
⑦如果一个方法中有父类作为参数类型,就意味着可以给该方法传递任何一个子类对象。
9、讲解下http请求里的header有什么作用;
10.Get和post区别。
(1)get用于获取数据,而且应该是安全的和幂等的。post用于提交数据。(多用于新建)。
(2)GET请求的数据会附在URL之后,最多只能是1024字节;POST把提交的数据则放置在是HTTP包的包体中,理论上数据大小没有限制。
(3)POST的安全性要比GET的安全性高。
11.Http协议相关。
HTTP 是基于 TCP/IP 协议的。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。
HTTP/1.0不支持连接保持,所以后来HTTP/1.1增加了Connection:keep-alive以及管道,管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序。
HTTP/2.0是一个彻底的二进制协议;实现双向的、实时的通信(多工),避免了队头阻塞;用ID来区分数据流,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数;可以取消数据流;客户端还可以指定数据流的优先级。优先级越高,服务器就会越早回应;引入了头信息压缩机制和信息表;允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送;
12.Java有没有多继承,接口和抽象类区别。jvm 理解
接口可以多继承,类不可以。
(1)抽象类是由abstract关键字修饰,允许包含未实现的方法。
接口是方法声明和常量值定义的集合,不允许包含变量。
(2)接口是绝对抽象的,不可以被实例化。抽象类不能被实例化。
(3)定义接口时可以使用继承,而且可以使用多继承。抽象类只能单继承。类可以实现很多个接口,但是只能继承一个抽象类;
(4)接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
(5)Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
public是在不同包中也可以访问;protected是必须在同一个包中或者子类才能访问;default是不允许子类访问,可以在类内部或者同一个包中访问;private是只能在类内部访问。
13.JDK和JRE的区别是什么?
Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包(JDK) 是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程 序。
JDK中包含JRE,JRE中包含JVM。
JDK中包含的JRE主要是为JDK自带的开发工具提供运行环境,与JDK并列的那个JRE是为用户编写的JAVA代码提供运行环境的。
classpath配置的是JDK的lib目录,path配置的是JDK的bin目录。
14.数据库四个范式的区别。在设计数据库的时候如何考量。
第一范式(1NF)属性不可拆分 或 无重复的列(保证列唯一)
第二范式(2NF)要求实体的属性完全依赖于主关键字。存在一个列被定义为唯一主键的表就是第二范式。(保证行唯一)
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。(外键关系)
第四范式(4NF)禁止主键列和非主键列一对多关系不受约束用复合列做主键的表。
15.64个马有8个跑道,没有计时工具,最少需要多少次跑,如何找到跑最快的1个和4个马?
先分为8组,找出每组第一再跑一次,一共9次就可以找到第一名;
第九次的第一名的那组的二(1)、三(2),四(3),第二名(4)那组的第二名(5),第三名(6),第三名(7)的第二名(8)再跑一次就可以找到前4名。
16.正则表达式
\s表示所有空白字符;\S表示非空白字符;*表示匹配零次或多次;+表示匹配一次或多次;. 表示除换行符外的任意字符;?匹配零次或一次。
1.如何停止运行一个线程
interrupt
2.如何实现一个hashmap,需要考虑哪些问题
hashcode
3.equal和==的区别
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
String s2 = new String("Monday").intern();会放入缓冲池。
4.如何判断一个对象已经被回收
5.为什么四次挥手比三次握手多一次
因为三次握手是要建立和确认客户端和服务器之间的通信线路;而四次挥手是为了关闭两方之间的数据传递,因为是双工的,所以被动方和主动方两个流向都需要关闭和确认,所以是四次。
4. linux相关指令,把能记得的说一下,出了个小功能,用shell实现;
5. sql中replace和update的区别;
update是SQL中的数据更新命令,replace是VF中的数据更新命令;
update不需要打开表,repl命令需要先打开表;
update不加条件是更新表中所有记录,repl不加条件是更新当前记录,要加上all短语才是更新所有记录。
9. 接触过哪些软件测试的方法。
黑盒,白盒测试;
性能测试,压力测试,冒烟测试;
3. 如何拦截5分钟前恶意登录(用户名密码不正确)超多一定次数的ip
6.介绍一下信号量和互斥锁
信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。
互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section)。因此,在任意时刻,只有一个线程被允许进入这样的代码保护区。
对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
7.问了问项目,让画一下其中一个项目的系统架构图,和其中一个功能的流程图。
——————————————————————————-——————————
二面:
输入字符流,找第一个重复的字符串。
1、Linux下的一些指令,$$(进程id),$?(上一条命令退出时状态),怎么查看进程,按照内存大小,CPU占用排序等等。
(大写M和大写P)
2、项目中遇到的问题,自己咋解决的等等。
多数据库,使用Mybatis的拦截器。
3、介绍一下hash,怎么解决冲突。(链地址法)
4、进程间的通信,共享内存方式的优缺点。
环境变量/文件描述符:子进程接受父进程环境数据的拷贝以及所有文件描述符。
管道:用于相关和无关进程间的通信,而且形成两个进程间的一个通信通道,通常使用文件读写程序访问。
共享内存:使用客户机/服务器模型(C/S),服务器对客户的数据或动作请求作出反应。
动态数据交换:动态数据交换使用消息传递、共享内存、事务协议、客户/服务器范畴、同步规则以及会话协议来让数据和控制信息在进程间流动。动态数据交换对话( dynamic data exchange session, DDE )的基本模型是客户、服务器。服务器对来自客户的数据或动作作出反应。客户和服务器可以以多种关系来通信。
针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点。但是的通信方式是通过将共享的内存缓冲区直接附加到进程的空间中来实现的.因此,这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其他同步工具解决。另外,由于内存实体存在于中.所以只能由处于同一个计算机系统中的诸进程共享,不方便。
共享内存块提供了在任意数量的进程之间进行高效双向通信的机制。每个使用者都可以读取写入数据,但是所有程序之间必须达成并遵守一定的协议,以防止诸如在 读取信息之前覆写内存空间等竞争状态的出现。不幸的是,Linux无法严格保证提供对共享内存块的独占访问,甚至是在您通过使用IPC_PRIVATE创 建新的共享内存块的时候也不能保证访问的独占性。 同时,多个使用共享内存块的进程之间必须协调使用同一个键值。
5.讲下堆的作用。
6.堆的垃圾回收对象选择原则。
所谓根集就量正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法。垃 圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对象。而根 集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。下面介绍几个常用的算法。
7 进程间通信详细叙述
8 tcp udp 区别 UDP应用场景
UDP一般用于即时通信(QQ聊天 对数据准确性和丢包要求比较低,但速度必须快),在线视频(RTSP 速度一定要快,保证视频连续,但是偶尔花了一个图像帧,人们还是能接受的),网络语音电话(VoIP 语音数据包一般比较小,需要高速发送,偶尔断音或串音也没有问题)等等。
9 linux中文件名存储在哪里? 改变文件名之后 MD5会不会变
只有两项数据存放在目录项中:文件名和i节点编号。不会的,只有文件内容发生改变MD5才会变化。一般对文件求MD5值只取文件内容部分,像文件名、保存目录、创建时间、修改时间、权限等等的元信息都是不进行计算的。
7 linux命令相关 问用过哪些 然后展开
9 crontab 怎么设置一个每小时、每3小时的定时任务
6. 求一个struct的大小
7.Linux命令相关,问有一个文件A.txt,里面有许多行,找出其中带关键字'B'的行,并统计重复度。我问了下重复度是指啥,他说,这样吧,假设每一行都是由空格分隔开的若干字符,若整个文件中,有2行的最后一个字符都是'10',你就输出 “10” : 2。
8.假如在服务器上执行一个进程时,你发现服务器很卡顿,你会怎么查找原因。
9.time_wait 是TCP四次握手哪个阶段的状态,为什么要有这个状态。这个状态带来的好处和坏处是什么。在网络中,什么与这个状态相似