1.Python 中方法的参数是值传递还是引用传递?
答:如果参数是常量则为值传递,如果参数是变量则为引用传递
2.Python 中元组和列表的区别
答:1.元祖不可修改。2.元祖不可删除
3.Linux 中查找某个文件并删除它
答:find / -name “*filename” |xargs rm -rf
4.Linux 查询 CPU、内存的指令
答:top
cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc -l ;查看物理CPU个数
free -h,
vmstat
5.Java 中的容器有哪些?它们的区别和特性?
答:
一.Collection类
1.一个独立元素的序列,这些元素都服从一条或多条规则.List必须按照插入的顺序保存元素,而Set不能有重复元素.Queue按照队列规则来确定对象产生的顺序(通常与它们被插入的顺序相同).
2.在实际编程中,Collection类一般不会被使用,通常使用其三个子类.
二.Map类
1.一组成对的"键值对"对象,允许你使用键来查找值.又被称为"关联数组"或者"字典".
三.List类:
1.子类包括ArrayList和LinkedList.
2.基本的ArrayList,它长于随机访问元素,但在List的中间插入和移除元素时比较慢.
3.LinkedList:它通过代价较低的在List中间进行的插入和删除操作,但对于随机访问元素操作比较慢.
6.Java 多线程的创建
答:Thread和Runnable
7.性能测试关注哪些指标?
答:cpu 的iowait,内存的实际内存与虚拟内存。硬盘的读写,数据库的读写速度
8.算法:快排的实现
答:(java,python自行查找)
9.算法:数组中查找出现次数过半的数
答:给出一种解法:
class Solution:
def MoreThanHlafNum_Solution(self,numbers):
dict={}
for i in numbers:
if not dict.has_key(i):
dict[i]=1
else:
dict[i]+=1
if dict[i]>len(numbers)/2.0:
return i
return 0
10.算法:查找链表的倒数第三个数
答:
public class LastKNode {
public static void main(String[] args) {
Node head=ListNode.getSingleList();
ListNode.printList(head);
int k=3;
head=new LastKNode().getLastKNode(head,k);
System.out.println(head.data);
}
public Node getLastKNode(Node head, int k){
Node node=head;
while(node. next!= null&&k>0){
node=node. next;
k--;
}
while(node!= null){
node=node. next;
head=head. next;
}
return head;
}
}
11.登录页面怎么测?
答:用例设计参考:
功能测试:
1>输入正确的用户名密码,点击提交按钮,验证能否正确登录
2> 输入错误的用户名或者密码,点击提交按钮,验证登录失败,提示相应的错误信息
3 >登录成功后能否跳转到正确的页面
4>账号名或者密码长度过长或者过短,应该怎么处理(安全性,密码太短是否有提示)
5>账号和密码有特殊字符(空格),是否做了过滤
6>密码是否加密显示
7>输入密码 ,大写键盘开启的时候要有提示信息
8>什么都不输入,直接点击提交(非空检查)
9>登录失败后,不能记住密码的功能
10>登录页面中忘记密码等等链接跳转是否正确
11>牵扯到验证码,还要考虑文字是否扭曲过度导致辨认难度大
UI测试:
1>布局是否合理,两个textbox和一个按钮是否对齐
2>textbox的长度和高度是否符合要求
3>界面设计风格和UI设计风格是否一致
4>界面中的文字简洁易懂,没有错别字
性能测试:
1>打开登录界面,需要几秒
2>输入正确的用户名和密码,登录成功跳转到新页面,需要几秒
安全性测试:
1>登录成功后的cookie是否有HttpOnly(降低脚本风险)
2>账号和密码是否通过加密的方式,发送给web服务器
3>账号和密码的验证,应该是用服务器验证,而不单单是在客户端用javaScript验证
4>账号和密码的输入框,应该屏蔽SQL注入攻击
5>账号和密码的输入框,应该禁止输入脚本(防止XSS攻击)
6>错误登录的次数限制(防止暴力破解)
7>是否支持多用户在同一台机器上登录
8>一用户在多台机器上登录
可用性测试:
1>输入框是否可以用tab键切换
2>输入账号,密码后按回车,是否可以登录
3>是否可用全用键盘操作,是否有快捷键
兼容性测试:
1>主流的浏览器下能否显示正常已经功能正常
2>不同的平台是否能正常工作,eg:windows,mac
3>移动设备上是否正常工作,比如iphone,android
4>不同的分辨率
12.搜索框怎么测试?
答:测试搜索框,需从以下几个方面进行考虑:
一、功能实现
输入字符,有匹配的就展示出来,没有匹配的,会进行处理
1.对输入进行测试
正常输入存在的内容,查看搜索结果展示的数据是否完整
正常输入不存在的内容,查看搜索返回的结果
输入为空
超长输入
特殊符号,包含空格,特别要注意英文单引号
各种字符,如数字、字母、中文
反复输入相同的数据,如5次以上,看处理是否正确
输入正则表达式
验证搜索框的功能是否与需求一致,如模糊搜索或完全搜索
是否有忽略空格的功能,忽略前置空格和忽略后置空格,但是不能忽略中间空格
2.快捷键:
在输入结束后,按回车键,看系统如何处理
使用Tab键 ,ctrl+c /v/xz
3.光标和鼠标:
在光标停留的地方进行输入,看光标和输入的字符位置是否正确,会否跳转到别的地方
在输入框中,左键单击鼠标,双击鼠标,三击鼠标,如百度输入框,单击是插入,双击选中两个字符,三击选中输入的所有字符
输入框中,鼠标右键,会否有菜单栏,菜单栏下是否有常用的项,并且各项可用
4.其它功能
如百度的即搜即得,随着用户的输入,下面会列出好多实时变化的选项,类似于智能搜索
二、用户友好与易用性
三、不同平台的兼容性
浏览器,操作系统,分辨率
13.TCP 和 UDP 的区别?如何保证 TCP 的可靠性?
答:区别在于:
是否连接:TCP是面向连接的,UDP是无连接的,TCP的发送发要确认接收方是否收到数据段(3次握手协议)
传输可靠性:TCP是可靠的,UDP是不可靠的;TCP在数据包接收无序、丢失或在交付期间被破坏时,负责数据恢复,它通过为每个数据报提供一个序号来完成此恢复,为确保正确收到数据,TCP要求目标计算机成功收到数据时发回一个确认(即ACK),如果在某个时限内未收到相应的ACK,将重新传送数据包。如果网络拥塞,这种重新传送将导致发送的数据包重复,但是接收计算机可使用数据包的序号来确定它是否为重复数据包,并在必要时丢弃它。UDP协议不能保证数据准确无误的到达目的地,并不是说UDP就完全无法知道是否发生了错误,一个16位的UDP包包含了一个字节长的头部和数据的长度,校验码域使其可以进行整体校验,如:多媒体数据流,不产生任何额外的数据,即使知道有破坏的包也不进行重发。
TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式
TCP是面向字节流的,UDP是面向报文的(流模式和数据报模式)
TCP拥有拥塞控制机制,UDP没有拥塞控制,适合媒体通信
TCP要求系统资源较多,UDP较少
可靠性:
校验和:检验数据是否损坏
定时器:分组丢失则重传
序号:用于检测丢失的分组和冗余的分组
确认:接收方告知发送方正确接收分组已经期望的下一个分组;否定确认:接收方通知发送方未被正确接收的分组
窗口和流水线:用于增加信道的吞吐量
14.算法:二叉树的深度计算
答:代码过长,请自行百度
15.算法:一亿个无序数找出 Top 100
答:参考代码如下
package cn.usst.tophundred.quicksort;
import java.util.Random;
/**
获取一亿数据获取前100个最大值
1. 假设数组为 array[N] (N = 1 亿),首先利用quicksort的原理把array分成两个部分,左边部分比 array[N - 1] (array中的最后一个值,即pivot) 大, 右边部分比pivot 小。然后,可以得到 array[array.length - 1] (即 pivot) 在整个数组中的位置,假设是 k.
2. 如果 k 比 99 大,我们在数组[0, k - 1]里找前 100 最大值。 (继续递归)
3. 如果 k 比 99 小, 我们在数组[k + 1, ..., N ]里找前 100 - (k + 1) 最大值。(继续递归)
4. 如果 k == 99, 那么数组的前 100 个值一定是最大的。(退出)
*/
public class TopHundredQuickSort {
public static void main(String[] args) {
// the size of the array
int number = 100000000;
// the top k values
int k = 100;
// the range of the values in the array
int range = 1000000001;
// input for minHeap based method
int[] array = new int[number];
Random random = new Random();
for(int i=0; i<number; i++){
array[i] = random.nextInt(range);
}
TopHundredQuickSort topHundred = new TopHundredQuickSort();
// start time
long t1 = System.currentTimeMillis();
topHundred.tophundred(array, 0, array.length-1, k);
// end time
long t2 = System.currentTimeMillis();
System.out.println("The total execution time of quicksort based method is" + (t2-t1) + " millisecond");
// print out the top k largest values in the top array
System.out.println("The top " + k + " largest values are:");
for(int i=0; i<k; i++){
System.out.println(array[i]);
}
}
private void tophundred(int[] array, int start, int end, int k) {
int switchPointer = start;
// array最后一个值作为pivot
int pivot = array[end];
for(int i=start; i<end; i++){
if(array[i] >= pivot){
swap(array, switchPointer, i);
switchPointer++;
}
}
// 交换后 array左边的值比pivot大 右边的值比pivot小
swap(array, end, switchPointer);
if(switchPointer < k-1){
tophundred(array, switchPointer+1, end, k);
}else if(switchPointer == k-1){
return;
}else{
tophundred(array, 0, switchPointer-1, k);
}
}
private void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
16.索引类型和优缺点
答:索引分类如下:
0、查看索引 show index from 数据库表名
1.普通索引
特点:是最基本的索引,它没有任何限制。
2.唯一索引
特点:与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
3.主键索引
特点;是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引
4.组合索引
特点:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循**最左前缀**集合
如:`ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )`
这个表结构,每次使用索引的时候必须带上最左侧的索引值'column1',不然将会索引无效。
5.全文索引
从3.23.23版开始支持全文索引和全文检索,FULLTEXT,可以在char、varchar或text类型的列上创建。
索引的优缺点:
1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存一下索引文件。
2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。
索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
17.Redis 中有哪些数据结构
答:
redis提供五种数据类型:string,hash,list,set及zset(sorted set)。
string(字符串)
string是最简单的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。
list(双向链表)
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。
Redis 哈希(Hash)
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
集合(Set)
set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。
zset(排序set)
zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。
18.数据库的加锁,比如乐观锁、悲观锁?
答:悲观锁–>
MySql的悲观锁就是打开事务,当启动事务时,如果事务中的sql语句涉及到索引并用索引进行了条件判断,那么会使用行级锁锁定所要修改的行,否则使用表锁锁住整张表
乐观锁–>
我们在使用乐观锁时会假设在极大多数情况下不会形成冲突,只有在数据提交的时候,才会对数据是否产生冲突进行检验。如果数据产生冲突了,则返回错误信息,进行相应的处理。
19.Java 的接口与抽象类的区别(问的比较多,逢面试基本必问)
答:
抽象类:抽象类是无法实例化的特殊类。所以问题是为什么我们需要一个不能被实例化的类,抽象类只能是子类(继承自)。换句话说,它只允许其他类继承它,但不能实例化。优点是它为所有子类执行特定的层次结构。简而言之,它是一种契约,它强制所有子类执行相同的层次或标准。
接口:接口不是类,由Interface关键词定义,接口只有方法签名,没有方法实现(8之后支持默认方法)。与抽象类类似,它也是一种契约,用于定义所有子类的层次结构,或者它定义了特定的方法集和它们的参数。它们之间的主要区别是,一个类可以实现多个接口,但只能继承一个抽象类。
20.面向对象的特征有哪些方面?
答:
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类 继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或 增加新的方法使之更适合特殊的需要。
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
21.int 和 Integer 有什么区别?
答:Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类:
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
22.String 和StringBuffer的区别?
答:JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数 值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型 地,你可以使用StringBuffers来动态构造字符数据。
23.HashMap和Hashtable的区别
答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
24.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
答:方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现, 重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方 法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
25.启动一个线程是用run()还是start()?
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
26.char型变量中能不能存贮一个中文汉字?为什么?
答:能够定义成为一个中文的,因为java中以unicode编码,一个char占16个位,所以放一个中文是没问题的。
27.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
28.List, Set, Map是否继承自Collection接口?
答:List,Set是,Map不是。
29.数组有没有length()这个方法? String有没有length()这个方法?
答:数组没有length()这个方法,有length的属性。String有有length()这个方法
30.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和 ==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值
31.是否可以继承String类?
答:String类是final类故不可以继承。
32.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答:会执行,在return前执行
33.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,
参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
35.线程的基本概念、线程的基本状态以及状态之间的关系
答:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。Java中的线程有四种状态分别是:运行、就绪、挂起、结束。
36.List、Map、Set三个接口,存取元素时,各有什么特点?
答:List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值
37.HTTP有没有状态,怎么解决HTTP无状态
答:
1、通过Cookies保存状态信息Server通过Cookies,服务器就可以清楚的知道请求2和请求1来自同一个客户端。
2、通过Session保存状态信息
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id;
如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个);
如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中通过Cookie返回给客户端保存。
38.基于WEB B/S系统测试时应考虑的因素有哪些?
答:
一、功能测试
1、链接测试
2、表单测试
3、Cookies测试
4、设计语言测试
5、数据库测试
二、性能测试
1、连接速度测试
2、负载测试
3、压力测试
三、可用性测试
1、导航测试
2、图形测试
3、内容测试
4、整体界面测试
四、客户端兼容性测试
1、平台测试
2、浏览器测试
五、安全性测试
40.什么是兼容性测试?兼容性测试侧重哪些方面?
答:兼容性是指协调性,
1.硬件上就是说你的电脑的各个部件,CPU,显卡等等组装到一起以后的情况,会不会相互有影 响,不能很好的运作.
2.软件上就是说你的电脑的软件之间能否很好的运做,会不会有影响啊?还有软件和硬件之间能否发挥很好的效率工作,会不会影响导致系统的崩溃.
1、平台兼容性:市场上有很多不同的操作系统类型,最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。
2、浏览器兼容性:浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、JavaScript、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,JavaScript是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。