java开发问题
一 概率问题
(1)条件概率计算公式:P(A|B) = P(AB) / P(B),即为在事件B发生的条件下事件A发生的概率。
(2)扑克牌6张背面朝上放在桌上,其中有3张有效牌,3张无效牌。在不知有多少张有效牌的情况下,A随机抽取N张牌,求N张牌恰好都是有效牌没有无效牌的概率是多少?
答:首先,N刚好是3的概率为 1 / 6,这3张牌刚好是有效的,概率是 1 / C(6,3)。因此,所求概率为 1 / 120。
(3)7张扑克牌,全部背面朝上,每次翻3张且必须翻3张,问至少翻几次可以使得所有牌正面朝上?答:3次。
二 网络问题
(1)两地相距1500km,ping通需要的时间是多少?4ms,8ms,16ms,32ms
答:
(2)移动端click有300ms的延迟,是什么原因?
答:双击缩放问题。源于苹果设计浏览器的操作时,定义了双击缩放功能。所以,当用户在页面上click后,浏览器不能断定用户的操作是单击打开某个文档,还是要双击缩放。因此,要在click后等待300ms来判断用户是否再次点击了屏幕。
(3)Http默认端口是80,Https默认端口是443,FTP协议的端口是21,Telnet默认端口23,SMTP(简单邮件传输协议)默认端口25. DNS默认端口号53.
(4)TCP的协议号是6,UDP的协议号是17。
(5)netstat命令:netstat的功能是用来显示网络连接、路由表和网络接口信息,可以让用户得知哪些网络连接正在运作。使用时如果不带参数,netstat显示活动的TCP连接。
netstat -an显示所有连接的端口并用数字表示。ifconfig显示本地ip地址等信息。
(6)分层?
(7)IP地址分类。ip地址的分类:A,B,C,D类,点分十进制,ipv4使用32位IP地址
(8)给定一个ip地址,求子网掩码:
(9)合并两个子网:
(10)DNS:DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,
而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
DNS协议运行在UDP协议之上,使用端口号53。在服务器上默认缓存1小时。
(11)计算机网络各层协议
三 操作系统
(1)使用临界区,需要切换到内核态吗?
答:不需要。临界资源是指每次只允许一个进程访问的资源。属于临界资源的硬件有打印机、磁带机,软件有缓冲队列、变量、数组、缓冲区。
诸进程间应该采用互斥的方式,对临界资源进行共享。每个进程中访问临界资源的代码称为临界区。显然,若能保证诸进程互斥地进入自己的临界区,
就能实现对临界资源的互斥访问。
(2)互斥量与信号量,可以安全的进行资源共享。
答:a)互斥量用于线程的互斥,信号量用于线程的同步。b)互斥量只能是0 / 1,信号量可以是非负整数。
c)互斥具有唯一性和排他性,但互斥无法限制访问者对资源的访问顺序,是无序的。
d)同步是在互斥的基础上(大多数情况下),通过其他机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥。
e)信号量可以用来实现互斥量的功能。f)互斥量的加锁和解锁必须由同一个线程分别对应使用。信号量由一个线程释放,另一个线程得到。
(3)实现一个消息队列的数据结构是如何设计的?
(4)请求分页的内存管理方式,如何求内存大小?
(5)磁盘存取信息的最小单位:扇区(簇 > 扇区)
答:a)从应用程序的角度来看,存取信息的最小单位是Byte(字节);
b)从磁盘的物理结构来看存取信息的最小单位是扇区,一个扇区是512字节;
c)从操作系统对硬盘的存取管理来看,存取信息的最小单位是簇。(操作系统一次访问磁盘的最小单位是簇)
d)簇是一个逻辑概念,一个簇可以是2、4、8、16、32或64个连续的扇区。
e)一个簇只能被一个文件占用,哪怕是只有一个字节的文件,在磁盘上存储时也要占用一个簇,这个簇里剩下的扇区是无用的。
例如NTFS文件系统格式化的时候默认是8个扇区组成一个簇,即4096个字节。所以“簇”也可以理解为磁盘存取信息的最小单位。
(6)子进程与父进程:一个进程创建子进程之后,进程与产生的进程之间的关系是父子关系,分别称为父进程和子进程。
a)子进程一旦产生就与父进程并发执行。
b)子进程共享父进程的正文段和已经打开的文件。
c)在父进程打开的文件,那么在子进程中也会打开,继承了打开的文件描述符。
d)但是子进程与父进程共享文件表,所以,有一个进程中的文件偏移量发生变化就会直接影响到另外一个进程。
四 数据结构
(1)根据先序、中序遍历,求后序遍历结果。
答:已知二叉树的先序和中序序列分别为:acfedh,fceahd,则该二叉树的后序遍历序列为fechda。
(2)哪些是平衡二叉树:红黑树、完全二叉树。哪些是平衡树:红黑树,完全二叉树,B-树,B+树。
答:a)红黑树,是一种平衡二叉查找树,具有较高的性能。可以在O(logn)时间内进行查找、删除、插入操作,n是二叉树中元素的数目。
b)完全二叉树。若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,
这就是完全二叉树。所以,完全二叉树一定是平衡二叉树。
(3)二叉查找树,又称二叉排序树、二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(7)堆排序的时间复杂度是O(nlogn),只存在一个元素的交换,因此,空间复杂度是O(1)。
(8)取n个无序数组的前k大元素,最快时间复杂度是多少?答:若允许修改数组结构,则最快时间复杂度是O(n);若不允许修改数组,则为O(nlogk)。
(9)图的最短路径算法??
(10)二叉树的对称遍历序列?
答:二叉树的对称遍历序列,即中序序列。
(11)数据结构中的线性表有哪些?
答:索引数组(即常说的数组)、栈、队列、链表;关联数组不是线性表。
(12)struct是值类型还是引用类型?值类型不进行垃圾回收?
答:a)struct结构是值类型。b)值类型不需要进行GC收集。c)值类型是存储在栈上,而GC只作用在堆上。
(13)64位系统中,一个结构体中定义了char,short,int的变量,次序不定,问结构体的sizeof是多少?
答:a)为了提高CPU的效率,VC对一些变量的起始地址做了“对齐”处理。
b)默认情况下,VC规定各成员变量存放的起始地址相对于结构体的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
例如:下面定义的结构体data,则sizeof(data) = 16,而不是sizeof(double) + sizeof(char) + sizeof(int) = 13。正是“对齐”处理的结果。
struct data{ double a; // 8 bytes char b; // 1 byte int c; // 4 bytes }
c)对齐方式:各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照下面的对齐方式调整位置。空缺的字节VC自动填充。
变量的起始地址相对于结构体的起始地址的偏移量:
char 偏移量必须为sizeof(char)即1的倍数;int 偏移量必须为sizeof(int)即4的倍数;float 偏移量必须为sizeof(float)即4的倍数;
double 偏移量必须为sizeof(double)即8的倍数;short 偏移量必须为sizeof(short)即2的倍数。
五 java
(1)Integer的自动拆箱、装箱的陷阱。原来Integer赋值调用的是Integer.valueOf方法,查看该方法源码可知。
Integer i1 = 127,i2 = 127, i3 = 128,i4 = 128; i1 == i2; i1.equals(i2); i3 = i4; i3.equals(i4); 输出结果:true true false true
原因分析:
public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }
原来在装箱时,将-128<=i1<=127范围之内的数据打包成缓存里的Integer对象了,由于不用new,所以这个区间里的值用直接=赋值方法得到的变量地址就是同一个,而超出这个范围的数值就会new一个Integer对象出来,用==运行符来计算,怎么也不可能为true。
(2)栈与堆的区别。
java内存空间分为栈内存和堆内存。
(3)面向对象的五大基本原则
a)单一职责原则;b)开放封闭原则;c)里氏替换原则;d)依赖倒置原则;e)接口隔离原则。
(4)java中如何释放掉一个指定占据的内存空间?
答:在《java虚拟机》一书中明确讲了,释放掉占据的内存空间是由gc完成,但是程序员无法明确强制其运行。
另外,该空间在不被引用的时候不一定会立即被释放,这取决于GC本身,无法由程序员通过代码控制。
(5)String、StringBuffer、StringBuilder
答:a)java中的字符串存储在字符串常量区,不会改变,发生改变时会新创建一个对象;b)StringBuffer是线程安全的StringBuilder;
c)StringBuffer和StringBuilder底层都是以字符数组存放的,可以修改内容。
(6)GC回收
答:a)垃圾回收线程在JVM中优先级相当相当低。b)垃圾回收机制只回收不再使用的JVM内存,如果程序有严重bug,照样内存溢出。
c)程序员不能控制GC何时回收,回收哪些内容。d)进入DEAD的线程,它还可以恢复,GC不会回收。
(7)java中的String是值传递。传递过程中改变的不会影响原来值。
(8)jdk1.5环境下,有如下程序:则:i01 == i02; i01 == i03; i03 == i04; i02 == i04; 哪个为false?
Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integer i04 = new Integer(59)。
答:i03 == i04为false。JVM中一个字节以下的整型数据在JVM启动时就加入内存,除非用new Integer显式地创建对象,否则都是同一个对象。
i02是基本数据类型,比较的是数值。
(9)servlet的init(),service(),destroy()方法。
答:servlet在多线程下其本身并不是线程安全的。
a)init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法。
b)service方法处理客户机发出的所有请求
c)destroy方法表明servlet生命周期的结束。
(10)子类与父类
答:下面的程序,运行时报“编译错误”。因为父类中没有无参构造方法,在子类中应该显式调用super(id);
class Person { String name = "No name"; public Person(String nm) { name = nm; } } class Employee extends Person { String empID = "0000"; public Employee(String id) { empID = id; } } public class Test { public static void main(String args[]) { Employee e = new Employee("123"); System.out.println(e.empID); } }
(11)java中字符都占用2个字节,不管是中文字符还是英文字符。
(12)java中接口与抽象类的比较:
答: a)抽象类可以有构造方法,接口中不能有;b)抽象类可以有普通成员变量,接口中不能有;
c)抽象类可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的。
d)抽象类中的抽象方法的访问类型可以是public、protected和默认,接口中的方法只能是public。
e)抽象类中可以包含静态方法,接口中不能包含静态方法。
f)抽象类和接口中都可以包含静态成员变量,但是接口中定义的变量只能是public static final类型
六 数据库
(1)主键。a)主关键字是表中的一个或多个字段;b)用于唯一的标识表中的某一条记录;c)主键是唯一的;d)主键不能为NULL。
设计原则:e)主键应该是对用户没有任何意义的;f)永远不要更新主键(虽然主键是可以被修改的);
g)主键不应包含动态变化的数据;h)主键应由计算机自动生成。
(2)候选码。若k是关系模式R(U,F)中的属性或属性组,U是关系中的所有属性,F是数据之间的依赖关系。
k'是k的任一子集,若不存在k',使得k'->u,则k称为关系模式的候选码。
若候选码多于一个,则选其中的一个作为主码。包含在任一候选码中的属性,称为主属性。
(3)外键。a)外键一定是另一个表的主键。b)为两个表的关联字段创建外键。设计原则:c)避免使用复合键(虽然可以使用复合键)。
(4)关系数据库的范式。目前关系数据库有6种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、
第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多规范要求的称为第
二范式(2NF),其余范式依次类推。
1NF:数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。1NF是关系模式设计的基本要求。
2NF:在1NF的基础上,非主属性必须完全依赖于主键(在1NF的基础上,消除非主属性对主键的部分函数依赖)。即非主属性要完全依赖于主键。
3NF:在1NF的基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)。
BCNF:在1NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖)。一般关系型数据库设计中,达到BCNF就可以了!
(5)数据库事务:事务(transaction)是由一系列操作序列构成的程序执行单元。它有4个特性:ACID。
a)atomicity 原子性,事务中所包含的操作要么都做,要么都不做。
b)consistency 一致性,在事务开始之前,数据库处于一致性的状态,事务结束后,数据库也必须处于一致性状态。拿银行转账来说,
一致性要求事务的执行不应改变A、B 两个账户的金额总和。
c)isolation 隔离性,事务隔离性要求系统必须保证事务不受其他并发执行的事务的影响。
d)durability 持久性,一个事务一旦成功完成,它对数据库的改变必须是永久的,即便是在系统遇到故障的情况下也不会丢失。
数据的重要性决定了事务持久性的重要性。
(6)连接查询。a)join(又称inner join,内连接)同 “,”的效果一样。又叫等值连接,只返回两个表中连接字段相等的行。
b)left join(左连接)。返回左表中所有的记录以及右表中连接字段相等的记录。
c)right join(右连接)。返回右表中所有的记录以及左表中连接字段相等的记录。
d)full join(全连接)。返回两个表中的行:left join + right join。
e)cross join,结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
f)关键字on,on后面是连接条件。
(7)连接查询中,on与where的区别。inner join,等值连接,查询条件放在on与where中执行结果相同。但是,使用left join、right join、full join时结果不同。
(8)select,join,where的执行顺序:join->where->select,先得到连接查询的临时表,然后进行where条件的过滤,最后select选取。
(9)select,limit,order by的执行顺序:select->order by->limit,先查询结果集,然后进行排序,最后获得limit的行。
(10)from,where,group by,having,select,order by的执行顺序:每个步骤都会产生一个虚拟表,该虚拟表用作下一个步骤的输入。
from:需要从哪个数据表检索数据
笛卡尔积
on:连接条件。
outer join:外连接:left join,right join,full join。
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列或列的计算结果
order by:按照什么样的顺序来查看返回的结果
top/limit:取结果集的部门数据
(11)Group by的用法。select指定的字段要么就要在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。
Having是对分组后的结果进行过滤,通常含有聚合函数。Where是对分组前的数据进行过滤,不可以包含聚合函数。
select class, SUM(count) from A where count > 8 group by class having SUM(count) > 10 order by class
七 java web开源架构
(1)model是什么,只能是数据库表吗
(2)view是什么,必须是页面上的吗?
(3)model发生变化,必须通过controller来进行渲染。。。?
(4)struts1与struts2的区别
答:从Action分析:a).Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
b). Struts2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。
Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,
任何有execute标识的POJO对象都可以用作Struts2的Action对象。
从Servlet 依赖分析: a). Struts1 Action 依赖于Servlet API ,
因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 b). Struts 2 Action不依赖于容器,
允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,
其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
从action线程模式分析: a). Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。
单例策略限制了Struts1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
b). Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
(5)优化hiberate采用的措施
答:1.尽量使用双向一对多,避免使用单向一对多;2.灵活使用单向one-to-many;3.不用一对一,使用多对一代替一对一;
4.配置对象缓存,不使用集合缓存;5.一对多使用Bag 多对一使用Set;
6.继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对象;7.消除大表,使用二级缓存;
(6)session
答:session是在客户端浏览器第一次访问服务器时,在服务器端生成的,当程序中调用HttpServletRequest.getSession(true)时,生成session。
存储在服务器的内存中,每个session对应一个sessionid。客户端仅将sessionid存储在cookie中。
session不会因为浏览器的关闭而删除,只能通过超时、HttpSession.invalidate()、关闭程序来删除。