JAVA相关基础知识
1.Finally,final,finalize
Finally: 释放资源(内存之外的,打开的文件、连接、屏幕上的图形,,) ①总会执行
②非后台线程结束,后台线程被强关,不会执行finally
③当try和catch中有return时,finally在return之后执行,但是返回值不会改变(finally中不会改变已保存的返回结果) ④finally中最好不要包含return,否则程序会从finally中退出,返回值不是try或catch中保存的返回值。
final: 基本数据类型:不可更改 类:不可继承
对象:引用不可变,对象内容可变
finalze:回收前调用,不适合用来清理或释放资源。对象免死最后机会!保证会被调用,但不保证会执行完(在低优先级线程中执行)
2. 数据在各个网络层之间是怎么传输的? 数据在各层之间的单位都是不一样的,
在物理层数据的单位称为比特(bit);在数据链路层,数据的单位称为(frame); 在网络层,数据的单位称为数据包(packet);传输层,数据的单位称为数据段(segment)。
3. Hashtable、HashMap
Hashtable 与 HashMap类似,但是主要有6点不同。
1.HashTable的方法是同步的,HashMap未经同步,如Vector和ArrayList一样。 2.HashTable不允许null,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许 key值只能由一个null
3.HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。
4.遍历的时候,HashTable使用Enumeration,HashMap使用Iterator。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode。
Hashtable继承自Dictionary类,实现了Map接口。而HashMap是继承自AbstractMap,实现了Map接口。
4. GET,POST区别?
答: 基础知识:Http的请求格式如下。
1、Get是从服务器端获取数据,Post则是向服务器端发送数据。
2、在客户端,Get方式通过URL提交数据,在URL地址栏可以看到请求消息,该消息被编码过;Post数据则是放在Html header内提交。
3、对于Get方式,服务器端用Request.QueryString获取变量的值;对用Post方式,服务器端用Request.Form获取提交的数据值。
4、Get方式提交的数据最多1024字节,而Post则没有限制。
5、Get方式提交的参数及参数值会在地址栏显示,不安全,而Post不会,比较安全。
5. 网游服务器用TCP还是UDP
UDP:多用,一个socket,加自己的可靠协议,延迟要求高
TCP:承载链接数多,500以上有压力,魔兽世界用TCP,1000延迟照样玩 HTTP/HTTPS:由客户端间歇性的发起无状态的查询,并且偶尔发生延迟是可以容忍
6. 关于JAVA内存模型,一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态,几个对象,几个属性,几个方法。
答: 由于JAVA中new出来的对象都是放在堆中,所以如果要实例化100次,将在堆中产生100个对象,一般对象与其中的属性、方法都属于一个整体,但如果属性和方法是静态的,就是用static关键字声明的,那么属于类的属性和方法永远只在内存中存在一份。
7. 红黑树的好处、AVL 树
红黑树性质:
根节点是黑色的;非黑即红;叶节点(空节点)是黑色的;父节 点是红色的,则其孩子节点必须是黑色的;从某一个节点到叶节 点的所有路径,其黑色节点数目相同。 红黑树好处:
红黑树是许多“平衡的”查找树中的一种,它能保证在最坏情况 下,基本的动态集合操作时间为 O(lgn)。
红黑树并不追求完全平衡,它只要求部分的达到平衡要求,降低 了对旋转的要求,从而提高了性能。由于它的设计,任何不平衡 都会在三次旋转之内解决。
红黑树的算法时间复杂度和 AVL相同, 但统计性能比 AVL 树更高。
AVL 树明显比红黑树逻辑简单的多,但应用得少,应该是增删性能 差一点,增删时需要旋转的次数可能比较多。
8. 数组和链表,遍历效率哪个高,为什么(cpu缓存与内存)
数组的效率高,因为数组是连续存储的,即内存地址是连续的, 所以在读取数组时,会将连续的内存地址的数据放入缓存中,所 以读取数组时相当于是从缓存读取。而链表遍历都是从内存读取, 缓存的读取速度要比内存块 100 倍左右。
9. 进程间通信, 怎么共享内存
i. 匿名管道:单向,只能用于具有亲缘关系的进程间通信,如父 子进程、兄弟进程等,缓冲区大小有限制。
ii. 命名管道:单向,可以用在任意的两个不同的进程间通信。 iii. 信号量:主要用于同步。
iv. 共享内存:最快的 IPC 机制,一般和信号量一起使用。一个进程创建,其他进程通过映射的形式,将共享内存加入到自己的
内存空间中。数据结构:shmid_ds,函数 shmget:可以创建或 打开一块共享内存。 v. 消息队列:是消息的链接表,有足够权限的进程可以向队列中 添加消息,被赋予读权限的进程则可以读走队列中的消息。消
息队列克服了管道只能承载无格式字节流以及缓冲区大小受 限等缺点。 vi. Socket:更为一般的进程间通信机制,可用于不同机器之间的进程间通信。
10. Fork 进程时,继承那些:
继承:进程的资格、堆栈、环境、内存、打开文件的描述符、
执行时关闭标志、信号控制设定、nice 值、进程调度类别、进程 组号、 当前工作目录、根目录、资源限制、控制终端。
独有:进程号、不同的父进程号、自己的文件描述符和目 录流的拷贝、 子进程不继承父进程的进程,正文,数据和其他锁定内存、
在 tms 结构中的系统时间、资源使用设定为 0、阻塞信号集初始化为空集、 不继承由 timer_create 函数创建的计时器、不继承异步输入和输出。
11. 1000 个超大的文件,可能每一个都超过内存,怎么对他们进 行排序和消除冲项,1 个超大怎么排序和消除重项。
读文件,计算hash(000),分成更小的文件,重复项肯定在一个文件里,归并的时候去重