面试经验总结

1、访问一个完整http请求会经历哪些问题
1.域名解析
2.发起TCP的3次握手
3.建立TCP连接后发起http请求
4.服务器端响应http请求,浏览器得到html代码
5.浏览器解析html代码,并请求html代码中的资源
6.浏览器对页面进行渲染呈现给用户

2、https和http请求的区别
1.https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4.http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议

3、tcp/ip五层协议有什么,每层的作用
1.数据链路层、网络层、传输层、应用层
数据链路层:数据链路层是负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层
网络层:负责相邻计算机之间的通信
传输层:网络层负责点到点的传输(这里的"点"指主机或路由器),而传输层负责端到端的传输(这里的"端"指源主机和目的主机)
应用层:向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等
http在应用层,负责数据的包装,tcp位于传输层负责数据传输

4、http有哪些请求方式,get和post请求有什么区别
传输方式:1)GET:获取资源 2)POST:传输实体主体 3)PUT:传输文件 4)HEAD:获得报文首部 5)DELETE:删除文件 6)OPTIONS:询问支持的方法 7)TRACE:追踪路径 8)CONNECT:要求采用隧道协议连接代理
1.get重点在从服务器上获取资源,post重点在向服务器发送数据
2.get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?“连接,多个请求数据间用”&"连接,这个过程用户是可见的;post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;
3.Get传输的数据量小,因为受URL长度限制,但效率较高,Post可以传输大量数据,所以上传文件时只能用Post方式
4.post较get安全性较高,get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等
5.get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码,post支持标准字符集,可以正确传递中文字符

5、http请求和http响应包含哪些内容
请求报文包含三部分:
1.请求行:包含请求方法、URI、HTTP版本信息
2.请求首部字段
3.请求内容实体
响应报文包含三部分:
1.状态行:包含HTTP版本、状态码、状态码的原因短语
2.响应首部字段
3.响应内容实体

7、如果一个网址无法访问,怎么排查什么原因
ping www.xx.com或者浏览器访问一般都会有返回结果502等

8、如果有正在看直播的用户,反馈太卡,有可能什么原因,怎么定位问题
自己网速慢,测速;或者内存不足,查看本机内存情况;网页缓存过多,清空;电脑中毒了;浏览器版本过低

9、cookie与session区别
1.cookie数据存放在客户的浏览器上,session数据放在服务器上;
2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
3.session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
4.单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;
5.Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用

10、持续化集成
怎么把自动化集成到Jenkins上?怎么配置一个工程?

11、写一下单例模式,考虑线程安全与线程不安全的情况
1.饿汉单例,线程不安全
public class SingletonPatternA {
private static SingletonPatternA instance = null;
private SingletonPatternA(){}
public static SingletonPatternA getInstance(){
if(instance == null)
instance = new SingletonPatternA();
return instance;
}
}

2./**

  • 单例模式 - 懒汉、线程安全
    */
    public class SingletonPatternB {
    private static SingletonPatternB instance=null;
    private SingletonPatternB() {}
    // 加入synchronized,把整个方法串行执行
    public static synchronized SingletonPatternB getInstance(){
    if(instance == null){
    instance = new SingletonPatternB();
    }
    return instance;
    }
    }

12、字符串倒转,以空格为间隔,倒转一句字符串内容,例如“I am a girl”->“girl a am I”
方法一:
public String reverseWords1(String s) {
String[] strlist = s.trim().split(" +");//split的参数是正则表达式
//用StringBuffer的效率要比String高一些,这里用String也是可以的
StringBuffer sb = new StringBuffer();
for(int i = strlist.length-1; i>=0; i–){
sb.append(strlist[i] + " “);
}
return sb.toString().trim();
}
方法二:
public String reverseWords(String s) {
String[] words = s.trim().split(” +");
Collections.reverse(Arrays.asList(words));
return String.join(" ", words);
}

13、Java IO是怎么操作的?写一下给一个文件地址,读/写.txt文件
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IODemo {
public void writeToFile(String path) throws IOException{
File file = new File(path);
file.createNewFile();
FileWriter writer = new FileWriter(file,true);
writer.append(“yes”);
writer.flush();
writer.close();
}
public void readFromFile(String path) throws IOException{
File file = new File(path);
BufferedReader reader = new BufferedReader(new FileReader(file));
String content ="";
String tmp = “”;
while((tmp = reader.readLine()) != null){
content += tmp;
}
System.out.println(content);
reader.close();
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String path = “.\test.txt”;
IODemo demo = new IODemo();
demo.writeToFile(path);
demo.readFromFile(path);
}
}

14、在操作系统中,进程之间是如何通信的?
常用的进程间通信方式:
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
有名管道 (named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( message queue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 ( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字( socket ) :套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

15、TCP协议中,Client和Server是如何通信的?三次握手中第一次发送的内容是什么?
https://blog.csdn.net/cczz598/article/details/45206399
第一次握手:客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,序号为X=0
第二次握手:服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号Y=0,将确认序号(Acknowledgement Number)设置为客户的序列号加1,即X+1 = 0+1=1
第三次握手:客户端收到服务器发来的包后检查确认序号(Acknowledgement Number)是否正确,即第一次发送的序号加1(X+1=1)。以及标志位ACK是否为1。若正确,服务器再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号(Acknowledgement Number)=Y+1=0+1=1,发送序号为X+1=1。客户端收到后确认序号值与ACK=1则连接建立成功,可以传送数据了。
第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN和ACK置为1,序号为X=1,确认序号为Z=1。
第二次挥手:服务器收到FIN后,发回一个ACK(标志位ACK=1),确认序号为收到的序号加1,即X=X+1=2。序号为收到的确认序号=Z。
第三次挥手:服务器关闭与客户端的连接,发送一个FIN。标志位FIN和ACK置为1,序号为Y=1,确认序号为X=2。
第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认序号为收到的序号加1,即Y+1=2。序号为收到的确认序号X=2。
17、在符串中找出连续最长的数字串,并把这个串的长度返回,譬如“abcdabce" 最长串为abcd或者abce,长度为4
unsigned int Continumax(char** pOutputstr, char* inputstr)
{
int size = 0;//记录当前数字串的长度
int i = 0;//用来遍历inputstr
int maxsize = 0;//保存最长数字串的长度
int end = 0;//记录最大数字串的结束位置
while (inputstr[i] != ‘\0’)
{
size = 0;//每一趟先把size置0
//若是数字,则累加size
while (‘0’ <= inputstr[i] && inputstr[i] <= ‘9’)
{
size++;
i++;
}
//比较判断最大数字串的长度和结束位置
if (size >= maxsize)
{
maxsize = size;
end = i - 1;
}
i++;
}
if (0 == maxsize)//如果没有数字或者输入字符串为空
{
pOutputstr = (char)malloc(sizeof(char));
*pOutputstr = ‘\0’;
return 0;
}
else
{
pOutputstr = (char)malloc(sizeof(char) * (maxsize));
pOutputstr = inputstr + end - maxsize + 1;
return maxsize;
}
}
int main()
{
char
a = “123abc12”;
char
b;
int i = Continumax(&b, a);
//free(b);
return 0;
}

18、上楼梯每次只能一步或者两步,有多少走法,这个主要是递归,列出来其实很简单,当时没想起来
public static int f(int n){
if(n<=2) return n;
int x = f(n-1)+f(n-2);
return x;
}

19、java类的题目是字符串数组排序,譬如 a[] = {“sbg”,“dyh”,“yhjjjj”},进行排序
import java.util.Arrays;
public class xulie {
public static void main(String[] args) {
String []str = {“abc”,“bca”,“cab”,“cba”,“aaa”,“111”,“232”,“112”,“ABC”};
Arrays.sort(str);
for(int i=0;i System.out.println(str[i]);
}
}
}

20、讲一下http请求从在浏览器中输入到到达服务端,以及服务端返回页面给浏览器的全过程(这个滴滴的不同面试官都很喜欢问),http常见的一些错误码有哪些什么含义
1.查询DNS(域名解析),获取域名对应的IP地址
2.浏览器与服务器建立tcp连接(三次握手)
3.浏览器向服务器端发送http请求(请求和传输数据)
4.服务器接受到这个请求后,根据路径参数,经过后端的一些处理生成html页面代码返回给浏览器
5.浏览器拿到完整的html页面代码开始解析和渲染,如果遇到引用的外部css、图片等静态资源,他们同样也是一个个htpp请求,重复上面的步骤。
6.浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现给用户。
1、400 – 无法解析此请求。
2、403 – 禁止访问:访问被拒绝。
3、404 – 找不到文件或目录。
4、405 – 用于访问该页的HTTP动作未被许可。
5、410 – 文件已删除。
6、500 – 服务器内部错误。
7、501 – 标题值指定的配置没有执行。
8、502 – Web服务器作为网关或代理服务器时收到无效的响应。

22、linux下怎么查看http的80端口被谁占用,怎么查看进程,怎么查看cpu、内存
netstat -apn|grep 80
查看内存:$ top -u oracle

23、子类不能继承父类里的哪些东西
1.继承Thread类创建线程
2.实现Runnable接口创建线程
父类的构造方法不用继承,我们可以用super来调用;被private修饰的成员不能被子类继承;被final修饰的类,不可以被继承;

24、Java中的collection
collection是集合类的上级接口,继承与他的接口主要有Set和List;Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

25、Java中常用的一些类、包、接口

32、内存泄露,内存溢出
1.内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
2.内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
34、linux基本命令,Linux如何找出10天内修改过的文件,ps的参数和作用
比如按名字查找一个文件,可以用 find / -name targetfilename
find . -name “*.h” -mtime -10 -type f -print

35、数组和链表的区别?

36、堆和栈的区别?
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
堆内存用来存放由new创建的对象和数组。
37、数据库索引作用?有哪几种
数据库索引是对数据库表中一列或多列的值进行排序的一种结构,它是用于提高数据库表数据访问速度的数据库对象。
唯一索引、非唯一索引、主键索引和聚集索引
唯一索引:
唯一索引是不允许其中任何两行具有相同索引值的索引。 当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在 employee 表中职员的姓 (lname) 上创建了唯一索引,则任何两个员工都不能同姓。
非唯一索引:
非唯一索引是相对唯一索引,允许其中任何两行具有相同索引值的索引。 当现有数据中存在重复的键值时,数据库是允许将新创建的索引与表一起保存。这时数据库不能防止添加将在表中创建重复键值的新数据。
主键索引:
数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
聚集索引(也叫聚簇索引):
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。 如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

38、SQL语句找出班级成绩排名50-100的同学姓名
Select name from class order by chengji desc limit 49,50;
39、200个数存在数组里,数字大小在1-100以内,如何找到出现频率最高的一个,不能用辅助内存

42、java实现多态的主要手段有三种:1.重载 2.接口 3. 抽象方法

44、Sleep与wait的区别

45、GC什么时候回收

46、创建线程两种方式的区别
1.扩展Thread类
2.实现Runnable接口

47、异常的分类、sql中的异常有哪些?
一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException。
①Checked异常
只有java语言提供了Checked异常,Java认为Checked异常都是可以被处理的异常,所以Java程序必须显示处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种
1 当前方法知道如何处理该异常,则用try…catch块来处理该异常。
2 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。
②RuntimeException
Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。

48、string、stringbuffer、stringbuilder的异同,底层实现。为什么把string设置为final类型
String:字符串是不变的, 它们的值在创建后无法更改。因为String对象是不可变的,所以它们可以共享。
StringBuffer: 字符串缓冲区支持可变字符串。是一个线程安全的,可变的字符序列。方法在必要时进行同步,这可以通过调用者在操作调用期间持有锁定,通过使用不可变源序列或不通过线程共享源序列来满足。
StringBuilder:一个可变的字符序列。 该类提供了一个API与StringCuffer}兼容,但不保证同步。
在String类中,主要是对字符串进行比较,和提取。如(equals(), substring(),indexof()等等)。
在StringBuffer中,主要操作append和insert方法,它们被重载以接受任何类型的数据。 每个都有效将给定的数据转换为字符串,然后将该字符串的符附加或插入到字符串缓冲区中。 append方法总是在缓冲区的末尾添加这些字符; insert方法在指定的点处添加字符。StringBuffer 类没有定义equals方法 !
StringBuilder:主要方法和StringBuffer一样,但是由于线程不安全,所以适用于单线程下在字符缓冲区进行大量操作的情况。

49、死锁产生的条件,写一个死锁程序。
/**

  • @Author: Usher
  • @Description:
  • 现在有线程1和线程2。线程1执行过程中,
  • 先锁定了对象a,然后需要再锁定b才能继续执行代码;
  • 而线程2正巧相反,先锁定了b,需要再锁定a才能继续执行代码。
  • 这时,两个线程都等着对方解锁,才能继续执行,
  • 这时,两个线程就进入等待状态,
  • 最终不会有线程执行。这就变成了死锁。
    */
    class DeadLock implements Runnable{
    boolean lockFormer;
    static Object object1 = new Object();
    static Object object2 = new Object();
    DeadLock(boolean lockFormer){
    this.lockFormer = lockFormer;
    }

/**
sleep()方法,实现主线程持有a的对象锁并请求b的对象锁、副线程持有b的对象锁并请求a的对象锁的场景,即发生死锁。
*/
@Override
public void run() {
if (this.lockFormer){
synchronized (object1){
System.out.println(“t1 locked object1 require to lock object2”);
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (object2){
System.out.println(“t1 locked object2”);
}
}
}else {
synchronized (object2){
System.out.println(“t2 locked object2 require to lock object1”);
try {
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (object1){
System.out.println(“t2 locked object1”);
}
}
}
}
}

50、同步sync的几种用法,这几种用法的不同之处。
1.作用于实例方法,当前实例加锁,进入同步代码前要获得当前实例的锁;
2.作用于静态方法,当前类加锁,进去同步代码前要获得当前类对象的锁;
3.作用于代码块,这需要指定加锁的对象,对所给的指定对象加锁,进入同步代码前要获得指定对象的锁。
51、java重载和重写的区别
重载overloading 多个方法、方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同
重写overwrite 子类继承父类,如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)
53、java有几种数据类型
8种
int、short、long、byte、char、float、double、boolean
54、抽象类的概念
包含一个抽象方法的类 关键字abstract
接口只能存在对方法的声明;抽象类可以添加对方法的实现
57、查看某进程被占用:
pa aux | grep java
59、请写出冒泡排序。

public class MaoPaoTest
{
/**
*冒泡排序从小到大
*
*/
public static void smallToLarge()
{
int test[]={10,5,2,15,9,20,3};

	for(int i=0;itest[i+1])
		{
			int temp=test[i];
			test[i]=test[i+1];
			test[i+1]=temp;
		}
	}

	for(int i=0;i

}
62、讲下Java多线程的使用。
在一个高并发的网站中,多线程是必不可少的。下面先说一下多线程在程序中的作用。
1、提高前端请求的响应速度。当我们执行一个比较耗时的方法时,http请求得不到响应甚至会超时,这时如果业务上允许数据的延迟,我们可以使用多线程来进行处理比较耗时的方法。这样前端发送了请求,后端令开启了一个线程去处理任务,就不会阻塞主线程了。
2、减清服务器的压力。包括我们的web容器,如tomcat、jetty等,还有数据库服务器等。因为我们使用了多线程,并且线程池大小有限制,如30,那么同时请求数据库的链接就限制为30了,也就是说能够同时执行方法的线程只有30个,其余的任务都放在我们线程的任务队列了,这样数据库就不会被突然上来的请求给压垮了。当然对于缓解数据库压力来说,更建议使用消息队列,使用消息队列我们可以攒数据进行批量提交,而仅仅使用多线程,则不好实现攒数据的过程。
3、提高处理能力,增加性能,充分利用服务器资源。如我们要将三个表里的数据加载到缓存,最简单的我们一个表开启一个线程,共用三个线程去加载缓存则比用一个线程去挨着遍历三个表的数据高效的多。
当然,多线程给我们带来好处的同时,也有许多要注意的地方
1、既然我们使用了多线程,那我们就对数据的实时性不那么严格,包括方法的返回值、数据的入库操作等。所以说,使用多线程的方法一定要做好日志记录,因为发生了异常,前端是反馈不到的。当然,多线程也是可以有返回值的,可以返回Future,里面的get方法可以阻塞到该线程执行完毕。
2、我觉得最烦人的是,为了提高性能,程序必须使用多线程或者其他异步操作,但还必须保证用户体验,如用户进行修改操作,这个修改操作我们是异步的,要求用户在前端还必须立刻看到修改的结果。这样就需要前后端同时去努力了。
3、非常重要的一点就是线程安全的问题了,如我们对一个集合的数据进行修改,在多线程高并发情况下,如果处理不好,可能会出现些我们意想不到的结果。即使我们没有使用多线程,在高并发情况下,线程安全问题也是我们必须要重视的。举个例子说吧,在我们进行压力测试的时候,当登陆人数压到10w的时候,读取分页列表的时候老是抱些奇怪的异常,但压得人数少了,或者说我们自己单独测试,则不会出现异常。检查一看,原来是我们使用的某个分页插件里有一个判断某个集合是否为空,如果为空则初始化的操作,因为这个集合是全局变量,所以人一多,就会出现线程安全问题。
4、对于自己不确定有多少线程的操作,一定要使用线程池,不然不但提高不了性能,反而会降低性能,甚至会导致jvm内存满了。
5、对于线程池大小的问题,也有很多说明这些问题的文章,什么区分是io还是cpu密集型的,我认为也不必非要那么严格去计算出那么一个数,测试达到自己的要求即可
63、有三个线程T1,T2,T3,怎么确保它们按顺序执行?
1.
public class JoinTest2 {
2.
3. // 1.现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行
4.
5.
6. public static void main(String[] args) {
7.
8. final Thread t1 = new Thread(new Runnable() {
9.
10. @Override
11. public void run() {
12. System.out.println(“t1”);
13. }
14. });
15. final Thread t2 = new Thread(new Runnable() {
16.
17. @Override
18. public void run() {
19. try {
20. //引用t1线程,等待t1线程执行完
21. t1.join();
22. } catch (InterruptedException e) {
23. e.printStackTrace();
24. }
25. System.out.println(“t2”);
26. }
27. });
28. Thread t3 = new Thread(new Runnable() {
29.
30. @Override
31. public void run() {
32. try {
33. //引用t2线程,等待t2线程执行完
34. t2.join();
35. } catch (InterruptedException e) {
36. e.printStackTrace();
37. }
38. System.out.println(“t3”);
39. }
40. });
41. t3.start();
42. t2.start();
43. t1.start();
44. }
45. }

64、Thread 类中的start() 和 run() 方法有什么区别?
在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡:
  创建:当new出线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
  就绪:当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,只是告诉CPU我已经进入了等待被调用的状态了,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
  运行:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
  阻塞:线程正在运行的时候,被暂停,通常是为了等待某个事件的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
  死亡:如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
start()只是让线程处于就绪状态。告诉CPU我已经准备好了,可以调用我了。而run()则是直接按顺序执行
public class Test {
public static void main(String[] args) {
Runner1 runner1 = new Runner1();
Runner2 runner2 = new Runner2();
// Thread(Runnable target) 分配新的 Thread 对象。
Thread thread1 = new Thread(runner1);
Thread thread2 = new Thread(runner2);
//执行start,thread1与thread2交叉执行
/thread1.start();
thread2.start();
/
//执行run,thread1与thread2顺序执行
thread1.run();
thread2.run();
}
static class Runner1 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(“进入Runner1运行状态——————————” + i);
}
}
}

static class Runner2 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("进入Runner2运行状态==========" + i);
        }
    }
}

}
65、介绍下什么是数据库索引
索引是一种特殊的查询表,可以被被数据库引擎加速检索的查询,简单的说索引就是指向表中数据的指针地址。
语法: create index index_name on tablename
索引的建立可以加快查询速度,修改数据,会增加时间开销,一下几点是避免使用索引
a、小数据量的表
b、需要频繁大批量的更新操作或者插入数据
c、如果列中有大量null
d、频繁操作的列不宜做索引
索引失效:
a. 使用 <> 、not in 、not exist、!=
b. like “%_” 百分号在前(可采用在建立索引时用reverse(columnName)这种方法处理)
c. 单独引用复合索引里非第一位置的索引列.应总是使用索引的第一个列,如果索引是建立在多个列上, 只有在它的第一个列被where子句引用时,优化器才会选择使用该索引。
d. 字符型字段为数字时在where条件里不添加引号.
e. 当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。

66、linux如何查找一个文件大小超过5M的文件
find . -type f -size +5M
查询大于5M小于10M文件:# find / -size +5M -size -10M
70、给你一个字符串:“aabb cccg h iii”, 如何遍历一遍输出相邻字符不相同的字符串。
答:放进 STL的容器
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.SynchronousQueue;
public class FilterCode2 {
public static void main(String[] args) {
String str1 = “aabbbcccabcccc”;
System.out.println(FilterCode2.filterCode2(str1));
}
public static String filterCode2(String str) {
List list = new ArrayList();
for (int i = 0; i < str.length(); i++) {
list.add(str.charAt(i) + “”);// 这里就是使用字符串存入到list中,
}
for (int m = 0; m < list.size() - 1; m++) {
if (list.get(m).equals(list.get(m + 1))) {
list.remove(m+1);
m–;
}
}
StringBuffer sb=new StringBuffer();
String str3="";
for(int j=0;j str3=sb.append(list.get(j)).toString();
}
return str3;
}
}

71、给出一种检测内存泄露的方案
MAT(Memory Analyzer Tools)是一个 Eclipse 插件
72、TestNG的配置参数化等等,TestNG的注解

73、怎么将字符串转换为数字(怎么用代码实现的)
public class Solution {
public int StrToInt(String str) {
if (str == null || str.length() == 0 || hasNonNumerical(str)) {
// 如果字符串为空并且包含非数字字符
return 0;
}
// 此时的字符串肯定是数字字符串
// 因为返回值限定为int型,所以无需考虑大数问题
char firstChar = str.charAt(0);
// 先将除第一位的数字转换成整数
int sumExcludeFirst = 0;
int sum = 0;
for (int i = 1; i < str.length(); i++) {
// 拿出当前字符
char c = str.charAt(i);
// 将当前字符转换为整数
int convert = c - ‘0’;
if (firstChar == ‘+’ && sum <= Integer.MAX_VALUE) {
sum += convert * Math.pow(10, str.length() - 1 - i);
}
if (firstChar == ‘-’ && sum >= Integer.MIN_VALUE) {
sum -= convert * Math.pow(10, str.length() - 1 - i);
}
if (firstChar >= ‘0’ && firstChar <= ‘9’ && sum <= Integer.MAX_VALUE) {
sum += convert * Math.pow(10, str.length() - 1 - i);
}
}
int first = firstChar - ‘0’;
if (firstChar >= ‘0’ && firstChar <= ‘9’) {
sum += first * Math.pow(10, str.length() - 1);
}

	if (sum > Integer.MAX_VALUE || sum < Integer.MIN_VALUE) {
		return 0;
	}
	return sum;

}

// 判断一个字符串除第一个字符外是否包含非数字字符,第一个字符可以是+或者是—
private boolean hasNonNumerical(String str) {

	int length = str.length();

	// 取出第0位,若第0位如果是数字或者是+,—则继续遍历,否则直接返回false
	char c = str.charAt(0);
	if ((c >= '0' && c <= '9') || (c == '+') || (c == '-')) {
		// 有必要进行之后的遍历
		for (int i = 1; i < length; i++) {
			// 取出当前字符
			c = str.charAt(i);
			if (c < '0' || c > '9') {
				// 证明包含非数字字符,直接跳出循环,返回false
				return true;
			}
		}

	} else {
		// 首位就包含除正负号外的非数字字符
		return true;
	}

	return false;

76、字符串string类和stringbuffer的区别

77、有哪些常用的输入输出流
举例 字节流 字符流 字节流:InputStream OutputStream 字符流:Reader Writer
流按照传输方向可以分为哪些
输入输出是相对程序而言,输入流InputStream读入文件;输出流OutputStream写文件。
常用的io流
InputStream,OutputStream,
FileInputStream,FileOutputStream,
BufferedInputStream,BufferedOutputStream
Reader,Writer
BufferedReader,BufferedWriter

结合多线程和输入输出流,开启三个线程同时读取A B C文件,并且写入D文件(考虑线程同步的情况)
79、怎么检测死锁
1.资源分配图
每个进程、每个资源制定唯一编号
设定一张资源分配表,记录各进程与占用资源之间的关系
设置一张进程等待表,记录各进程与要申请资源之间的关系
2.死锁定理
3.死锁检测中的数据结构

80、多线程有几种实现方法?同步有几种实现方法?

  1. 压力测试和负载测试的区别
    压力测试是在高负载情况下对系统的稳定性进行测试。是在高负载(大数据量、大量并发用户等)下的测试,观察系统在峰值使用情况下的表现,从而发现系统的功能隐患。
    负载测试:多用户,用户数渐增,持续同时发同一业务请求,产出最大TPS
    压力测试:多用户,资源使用饱和,持续同时发同一业务请求,产出系统瓶颈或使用极限

  2. 假设系统A调用系统B,我把B的接口都mock了,进行性能测试,这样有什么好处和坏处?
    好处:
    mock一方面加挡板,一方面可模拟返回数据。
    测试驱动开发(TDD)在接口实现之前可以写接口测试。在开发过程中把测试添加到自动化测试环境中。
    防止系统B出错引起测试错误
    不会因系统B的开发进度影响测试,只要定义好了接口mock后即使B未开发完成仍能进行测试
    一些速度较慢的操作处理复杂逻辑的接口,mock后可以快速返回,提升测试效率
    模拟在应用中不容易构造的对象或比较复杂的对象,从而使测试顺利进行
    mock的坏处在于很多情况下无法完全模拟出服务器的所有可能的返回情况,另外,mock掉了关联方之后,整个环境的连通性可能测试的不到位。
    mock的使用场合和时机:
    (1)单元测试/接口测试中测试对象依赖其他对象,这些被依赖的对象构造复杂或耗时或根本无法构造(未交付)
    (2)我们只测试对象内部逻辑的质量,不关心依赖对象的逻辑正确性和稳定性
    基于以下两个原则去做mock。这样mock的投入产出比是最高的。
    (1)不需要对所有的依赖对象进行mock,只对那些构造复杂、构造比较耗时的依赖进行mock
    (2)若是分层自动化,高层的测试设计可以基于以下假设:
    低层的测试已保证低层对象的质量,高层对低层的依赖可以mock

  3. 服务器中一般要监控哪些数据,如何监控的,怎么从监控数据中发现问题?
    基础监控和应用监控。基础监控包括机器是否死机,cpu,内存,磁盘使用率等
    应用监控包括日志监控、端口监控、进程数监控等。

84.有一天早上打车高峰,滴滴服务端挂了大概30分钟,工程师抢修之后,马上上线,之后又挂了,请问有哪些原因会造成这个情况?
服务器内存不够
服务器超出负载
并发量太大
遇到恶意攻击

84.自动化测试并发主要哪些点?
性能,1000以内并发时小于3s

  1. 写一段程序,删除字符串a中包含的字符串b,举例 输入a = “asdw”,b = “sd” 返回 字符串 “aw”,并且测试这个程序。
    public static void main(String args[]){
    String test=test(“sahsjkshabshwkiixab”,"");
    System.out.println(test);
    }
    public static String test(String str,String targetstr) {
    StringBuffer bf = new StringBuffer();
    if (str==null||str.length()0||targetstrnull||targetstr.length()==0) {
    return bf.toString();
    }
    if (str.length()>=targetstr.length()){
    for(int i=0;i if(i+targetstr.length()>str.length()){
    bf.append(str.substring(i,str.length())); break;
    }
    if(!str.substring(i,i+targetstr.length()).equals(targetstr)){
    bf.append(str.substring(i,i+1));
    }
    else{
    i=i+targetstr.length()-1;
    }
    }
    return bf.toString();
    }
    else {
    bf.append(str);
    return bf.toString();
    } } }

87、jenkins配置
http://blog.sina.com.cn/s/blog_68f262210102vp64.html
88、写一个链表倒叙
89、编写一个二叉树最近的公共祖先
90、1~9999数列中数字3出现的次数。用递推方法解出。
91、从一个数组中找出前4个最大的数,用最优解。
//给定一个长度为n的数组,寻找其中最大的k个数
public class FindKthElements {

//算法一:排序,时间复杂度O(nlogn),空间复杂度O(1)
public ArrayList findKthElements(int[] arr, int k) {
	
	ArrayList res = new ArrayList();
	if(arr.length <= 0 || arr == null || arr.length < k) {
		return res;
	}
	
	Arrays.sort(arr);
	for(int i = arr.length - 1;i > arr.length - 1 - k;i --) {
		res.add(arr[i]);
	}
	return res;
}

}
92、二叉树后序遍历的递归和非递归,有什么区别;static关键字的作用

94、怎么做的接口自动化,工具有哪些,你自己怎么写的
接口框架开发:java+HttpClient+testNG
公司平台大黄蜂:测试case维护
自动化脚本对比:jmeter+java
public class FirstTest {
private HttpClient httpClient = new DefaultHttpClient();
private HttpPost httppost;
private HttpResponse response;
private HttpEntity entity;
private String postResult = null;

@Test
public void loginJDTest() {
    String loginURL = "https://passport.jd.com/uc/loginService?uuid=ac394a05-05c0-4667-9940-2848f0c03809&&r=0.8636558873495089&version=2015";
    //创建一个httppost请求
    httppost = new HttpPost(loginURL);
    //创建Post请求参数
    List formparams1 = new ArrayList();
    formparams1.add(new BasicNameValuePair("uuid", "ac394a05-05c0-4667-9940-2848f0c03809"));
    formparams1.add(new BasicNameValuePair("eid", "Z6RZKBBPUUOORPHGELPNEZE6QHFEIE2IS4EQEBWOKH7VJAPDRIYUCSERJ3DLPNXRINL2ON3JC3IWHIG6L6PQMINSRY"));
    formparams1.add(new BasicNameValuePair("fp", "4d981fbd1f0cf45fc497eac85348c0f3"));
    formparams1.add(new BasicNameValuePair("_t", "_nthEAWj"));
    formparams1.add(new BasicNameValuePair("loginType", "c"));
    formparams1.add(new BasicNameValuePair("loginname", "test"));
    formparams1.add(new BasicNameValuePair("nloginpwd", "test"));
    formparams1.add(new BasicNameValuePair("chkRememberMe", ""));
    formparams1.add(new BasicNameValuePair("authcode", ""));
    formparams1.add(new BasicNameValuePair("pubKey", ""));
    formparams1.add(new BasicNameValuePair("sa_token", "B68C442B"));
    formparams1.add(new BasicNameValuePair("seqSid", "3845068114278942000"));
    try {
        httppost.setEntity(new UrlEncodedFormEntity(formparams1, "UTF-8"));
        response = httpClient.execute(httppost);
        entity = response.getEntity();
        // 在这里可以用Jsoup之类的工具对返回结果进行分析,以判断创建是否成功
        postResult = EntityUtils.toString(entity, "UTF-8");
        System.out.println("查看登录接口请求返回的结果:" + postResult);
    } catch (Exception e) {
        e.printStackTrace();
    }
    httppost.releaseConnection();
}

95、单元测试mock框架的使用
说明:PowerMockito.when().thenReturn()用于为mock对象的方法指定返回值。
@RunWith 用于指定PowerMockRunner作为Junit的runner
@PrepareForTest 在Mock静态、final、私有方法 时需要使用

@RunWith(PowerMockRunner.class)
public class FlySunDemoTest {

@Test
public void callArgumentInstance() {
    File file = PowerMockito.mock(File.class);
    FlySunDemo flySunDemo = new FlySunDemo();
    PowerMockito.when(file.exists()).thenReturn(true);
    Assert.assertTrue(flySunDemo.callArgumentInstance(file));

}

}

96、白盒测试内容及测试方法
单元测试、review代码
单元测试当用注解:
@Test:将一个方法修饰成一个可测试的方法
@Test(expected=XXException.class):表示这个方法一定会抛出某个异常
@Test((timeout=XX):表示这个方法执行的超时时间,单位毫秒
@Before:会在每一个测试方法被运行前执行一次
@After:会在每一个测试方法运行后被执行一次
@BeforeClass:它会在所有的方法运行前执行,static修饰
@AfterClass:它会在所有的方法运行结束后执行,static修饰
@Ignore:所修饰的测试方法会被测试运行器忽略
@RunWith:可以更改测试运行器 org.junit.runner.Runner
98、工作中遇到的什么困难,怎么解决?
问题:测试工作量大,没有测试资源,任务有deadline,
解决方法:寻找产品协助测试
99、你有什么优点和缺点?
优势:业务熟悉度和测试功底比较扎实,执行力、推动力、沟通协作能力比较强
缺点:太好说话了
100. 请问你们公司是如何做性能测试的?请讲诉性能测试的相关指标?
TPS(QPS):如果每次都需要访问数据库的业务,一般100-500之间,低于100有优化的空间;不需要访问数据库,都是内存访问的,500-1500都有可能;访问磁盘和其他模块有交互的服务,就介于这两者之间了。
平均响应时间:还是分情况,如果访问数据库等,100-500ms之间;不访问数据库,根据业务的复杂程度,在30-300ms之间了。
CPU使用率、可用内存、I/O,网络,数据库资源使用
101、测试的过程中印象最深的bug?
查询功能,翻页后第二页的内容与第一页的内容完全相同。
原因是翻页的时候刷新了页面触发了查询语句。
印象最深原因:发生过两次,同时知道原因所在

102、为什么想要换工作?
自己住的地方搬了,上班的过程中要花很多时间和各种不方便,因此想找一个较近的地方上班和稳定下来
103、测试工作流程
需求评审阶段开始介入,与产品及开发一起制定测试目标。根据项目计划制定测试计划,了解开发的概要设计及详细设计,书写测试用例。发起case评审,提供准入测试用例给开发。提测后先进行准入测试,不通过打回,通过则进入story测试,集成测试,系统测试,性能测试,稳定性测试,安全测试,(uat:客户在测试环境验收),生产验证,发布。

104、如何看待自动化和手动测试?怎样的一个比例才是健康的?
项目较成熟时自动化比例可适当提高。开发并维护自动化case成本较高,所以不是自动化比例越高越好。要根据具体的项目及项目所处的阶段来定。投入产出比要先评估好。
105、接口自动化时上一次执行的数据如何清理掉?(如开户或注册,同一个账号只能使用一次,如何清洗数据能让case下次继续跑?提供新的数据?mock?mock的层级,mock过多的话等同于未做测试)
https://blog.51cto.com/6183574/2350978
106、你们公司的自动化投入产出比怎样?效益怎样?
自动化和业务测试人力1:5
107、自动化测试用例的覆盖率多少?
50%
拿金融产品的自动化来讲,大概覆盖33%左右
110、如何测试一个应用的登录场景?
常规登录账户密码的字符类型校验、长度校验、匹配性校验
性能:响应时间、并发量
安全性:加密传输
各种登录方式优先级
不同设备之间切换登录方式
登录的有效时长

111、如果让你来测试扫码支付,你会考虑哪些场景?
卡的类型(一类户:借记卡、信用卡、各个开户行)
二类户:虚拟账户如微信里的零钱账户、支付宝的余额宝、电子账户
二维码的商户类型(微信、支付宝、汇宜、银联)
支付限额(单笔限额、累计限额、日累计、月累计、支付笔数)
退款(退款入口、退款进度、退款结果)
对账
资金流动(我方扣款数额正确,对方收款数额正确)数额及时效
支付结果展示、交易明细
支付接口安全性、接口的性能
异常情况(卡异常、余额不足)
连续扫码支付,每天的扫码支付次数限制及数额限制
二维码有效期
有无相机权限
前后置摄像头
像素低端的手机能否扫码成功
兼容性(不同手机厂商自带相机功能实现不一致)

112、自我介绍
面试官好,我叫马维东,来自河北邯郸,之前做过一段时间的开发,现在在京东做的测试开发岗,负责的是京东联盟相关产品测试,主要负责的是联盟跟单计佣的服务端测试,常用测试方法是白盒测试、单元测试、接口测试等,日常工作及618或双11期间也会使用jmeter进行接口性能测试,我平常喜欢看看书,有的时候也喜欢打打游戏,这个是我一个简单的自我介绍,您看,我这边还需要做什么补充吗?
113、介绍下你负责的公司项目
现公司:互联网金融业务、银行核心、理财、保险

114、你有什么优点和缺点?
优势:业务熟悉度和测试功底比较扎实,执行力、推动力、沟通协作能力比较强
在同一个项目组内,你认为你怎么做会比另外一名测试更加优秀?
业务熟悉度更高
架构理解更深入
代码能力要更好
个人影响力更强
测试话语权更大
协调推动能力更强

docker常用命令:
1、docker kill 杀死一个或多个指定容器进程。
2、docker start|stop|restart 启动、停止和重启一个或多个指定容器。
3、docker history 查看指定镜像的创建历史。
4、docker rm
-f 强行移除该容器,即使其正在运行;
-l 移除容器间的网络连接,而非容器本身;
-v 移除与容器关联的空间
5、docker ps 列出所有运行中容器
6、docker images 列出本地所有镜像。其中 [name] 对镜像名称进行关键词查询
7、docker pull -a 拉取所有 tagged 镜像
8、docker search从 Docker Hub 中搜索符合条件的镜像
9、docker top查看一个正在运行容器进程,支持 ps 命令参数。
10、docker pause暂停某一容器的所有进程
11、docker push将镜像推送至远程仓库,默认为 Docker Hub
12、docker logs获取容器运行时的输出日志。

Redis常用命令:
1、判断一个键值是否存在exists key
2、可以删除一个或多个键,返回值是删除的键的个数
del key [key…]
3、获得键值的数据类型 type key
赋值与取值
set key value 赋值
get key 取值
4、递增数字
incr key
当存储的字符串是整数形式时,redis提供了一个使用的命令 incr 作用是让当前的键值递增,并返回递增后的值
incr num
当要操作的键不存在时会默认键值为 0 ,所以第一次递增后的结果是 1 ,当键值不是整数时 redis会提示错误
5、增加指定的整数
incrby key increment
incrby 命令与 incr 命令基本一样,只不过前者可以通过 increment 参数指定一次增加的数值如:
incrby num 2
incrby num 3
6、减少指定的整数
decr key
decrby key increment
desc 命令与incr 命令用法相同,只不过是让键值递减
decrby 命令与 incrby命令用法相同

redis支持的数据类型:
Redis的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)等多种数据结构组成

Linux:
显示目录和文件的命令
Ls:用于查看所有文件夹的命令。
Dir:用于显示指定文件夹和目录的命令 Tree: 以树状图列出目录内容
Du:显示目录或文件大小
修改目录,文件权限和属主及数组命令
Chmod:用于改变指定目录或文件的权限命令。
Chown:用于改变文件拥有属性的命令。
Chgrp:用于改变文件群组的命令。
Chattr:用于设置文件具有不可删除和修改权限。
Lsattr:用于显示文件或目录的隐藏属性。
创建和删除目录的命令
Mkdir:用于创建目录
Rmdir:用于删除空的目录
Rm -f:用于删除不为空的目录
创建和删除,重命名,复制文件的命令
Touch:创建一个新的文件
Vi:创建一个新的文件
Rm:删除文件或目录
Mv:重命名或移动文件的命令
Cp:复制命令
Scp:用于将本地的文件或目录复制到远程服务器
Wget:用于下载ftp或http服务器文件到本地。

显示文件内容的命令
Cat:用于显示指定文件的全部内容
More:用分页的形式显示指定文件的内容
Less:用分页的形式显示指定文件的内容,区别是more和less翻页使用的操作键不同。
Head:用于显示文件的前n行内容。
Tail:用于显示文件的后n行内容。
Tail -f:用于自动刷新的显示文件后n行数据内容。
查找命令
Find:查找指定目录或文件的命令。
Whereis:查找指定的文件源和二进制文件和手册等
Which:用于查询命令或别名的位置。
Locate:快速查找系统数据库中指定的内容。
Grep:在指定的文件或标准输出,标准输入内,查找满足条件的内容。
关机和重启计算机的命令
Shutdown:-r 关机后立即重启
-k 并不真正的关机,而只是发出警告信息给所有用户
-h 关机后不重新启动
Poweroff:用于关机和关闭电源
Init:改变系统运行级别
0级用于关闭系统
1 级用于单一使用者模式
2级用来进行多用户使用模式(但不带网络功能)
3级用来进行多用户使用模式(带网络全功能)
4级用来进行用户自定义使用模式
5级表示进入x windows时的模式
6级用来重启系统
Reboot: 用于计算机重启
Halt:用于关闭计算机系统
压缩和打包命令
Tar:用于多个文件或目录进行打包,但不压缩,同时也用命令进行解包
Gzip:用于文件进行压缩和解压缩命令,文件扩展名为.gz结尾。
Gunzip:用于对gzip压缩文档进行解压缩。
Bzip2:用于对文件或目录进行压缩和解压缩
Bzcat:用于显示压缩文件的内容。
Compress/un compress: 压缩/解压缩.Z文件
Zcat:查看z或gz结尾的压缩文件内容。
Gzexe:压缩可执行的文件
Unarg:解压缩.arj文件
Zip/unzip:压缩解压缩.zip文件

用户操作命令
Su:切换用户命令
Sudo:一系统管理员的身份执行命令
Passwd:用于修改用户的密码
改变目录和查看当前目录命令
Cd:进入工作目录
Cd …:会退到上一级命令
Pwd:显示当前用户所在工作目录位置
文件连接命令
Ln:为源文件创建一个连接,并不将源文件复制一份,即占用的空间很小。
可以分为软件连接和硬链接。
软连接:也称为符号连接,即为文件或目录创建一个快捷方式。
硬链接:给一个文件取多于一个名字,放在不同目录中,方便用户使用。
Ln命令参数如下:
-f:在创建连接时,先将与目的对象同名的文件或目录删除。
-d:允许系统管理者硬链接自己的目录。
-i:在删除与目的对象同名文件或目录时先询问用户。
-n:在创建软连接时,将目的对象视为一般的文件。
-s:创建软连接,即符号连接。
-v:在连接之前显示文件或目录名。
-b:将在连接时会被覆盖或删除的文件进行备份。
帮助命令-----man
其他命令
Who:显示系统中有那些用户在使用。
-ami 显示当前用户
-u:显示使用者的动作/工作
-s:使用简短的格式来显示
-v:显示程序版本
Free:查看当前系统的内存使用情况
Uptime:显示系统运行了多长时间
Ps:显示瞬间进程的动态
Pstree:以树状方式显示系统中所有的进程
Date:显示或设定系统的日期与时间。
Last:显示每月登陆系统的用户信息
Kill: 杀死一些特定的进程
Logout:退出系统
Useradd/userdel:添加用户/删除用户
Clear:清屏
Passwd:设置用户密码
vi编辑器
首先用vi命令打开一个文件
末行模式命令:
:n,m w path/filename 保存指定范围文档( n表开始行,m表结束行)
:q! 对文件做过修改后,强制退出
:q 没有对文件做过修改退出
Wq或x 保存退出
dd 删除光标所在行
: set number 显示行号
:n 跳转到n行
:s 替换字符串 ?/test/test2/g /g全局替换 /也可以用%代替
/ 查找字符串
网络通信常用的命令
Arp:网络地址显示及控制
ftp:文件传输
Lftp:文件传输
Mail:发送/接收电子邮件
Mesg:允许或拒绝其他用户向自己所用的终端发送信息
Mutt E-mail 管理程序
Ncftp :文件传输
Netstat:显示网络连接.路由表和网络接口信息
Pine:收发电子邮件,浏览新闻组
Ping:用于查看网络是否连接通畅
Ssh:安全模式下远程登陆
Telnet:远程登录
Talk:与另一用户对话
Traceroute:显示到达某一主机所经由的路径及所使用的时间。
Wget:从网路上自动下载文件
Write:向其它用户终端写信息 Rlogin:远程登录

你可能感兴趣的:(java,面试经验总结)