《java初级面试题》由会员分享,可在线阅读,更多相关《java初级面试题(11页珍藏版)》请在金锄头文库上搜索。
1、JAVA 相关基础知识相关基础知识1.Finally,final,finalizeFinally: 释放资源(内存之外的,打开的文件、连接、屏幕上的图形,) 总会执行 非后台线程结束,后台线程被强关,不会执行 finally 当 try 和 catch 中有 return 时,finally 在 return 之后执行,但是返回值 不会改变(finally 中不会改变已保存的返回结果) finally 中最好不要包含 return,否则程序会从 finally 中退出,返回值不 是 try 或 catch 中保存的返回值。 final: 基本数据类型:不可更改 类:不可继承 对象:引用不可变,
2、对象内容可变 finalzefinalze:回收前调用,不适合用来清理或释放资源。对象免死最后机会!保证 会被调用,但不保证会执行完(在低优先级线程中执行)2. 数据在各个网络层之间是怎么传输的? 数据在各层之间的单位都是不一样的,在物理层数据的单位称为比特(bit);在数据链路层,数据的单位称为(frame);在网络层,数据的单位称为数据包(packet);传输层,数据的单位称为数据段(segment)。 3. Hashtable、HashMap Hashtable 与 HashMap 类似,但是主要有 6 点不同。1.HashTable 的方法是同步的,HashMap 未经同步,如 Vec
3、tor 和 ArrayList 一样。2.HashTable 不允许 null,key 和 value 都不可以,HashMap 允许 null 值,key 和value 都可以。HashMap 允许 key 值只能由一个 null3.HashTable 有一个 contains(Object value)功能和 containsValue(Object value)功能一样。4.遍历的时候,HashTable 使用 Enumeration,HashMap 使用 Iterator。5.HashTable 中 hash 数组默认大小是 11,增加的方式是 old*2+1。HashMap 中has
4、h 数组的默认大小是 16,而且一定是 2 的指数。6.哈希值的使用不同,HashTable 直接使用对象的 hashCode。Hashtable 继承自 Dictionary 类,实现了 Map 接口。而 HashMap 是继承自AbstractMap,实现了 Map 接口。4. GET,POST 区别?答: 基础知识:Http 的请求格式如下。主要包含三个信息:1、请求的类型(GET 或 POST),2、要访问的资源(如resimga.jif),3、Http 版本(http/1.1)用来说明服务器要使用的附加信息这是 Http 的规定,必须空一行 请求的内容数据区别:1、Get 是从服务器
5、端获取数据,Post 则是向服务器端发送数据。2、在客户端,Get 方式通过 URL 提交数据,在 URL 地址栏可以看到请求消息,该消息被编码过;Post 数据则是放在 Html header 内提交。3、对于 Get 方式,服务器端用 Request.QueryString 获取变量的值;对用 Post 方式,服务器端用 Request.Form 获取提交的数据值。4、Get 方式提交的数据最多 1024 字节,而 Post 则没有限制。5、Get 方式提交的参数及参数值会在地址栏显示,不安全,而 Post 不会,比较安全。5. 网游服务器用 TCP 还是 UDPUDP:多用,一个 soc
6、ket,加自己的可靠协议,延迟要求高TCP:承载链接数多,500 以上有压力,魔兽世界用 TCP,1000 延迟照样玩HTTP/HTTPS:由客户端间歇性的发起无状态的查询,并且偶尔发生延迟是可以容忍6. 关于 JAVA 内存模型,一个对象(两个属性,四个方法)实例化 100 次,现在内存中的存储状态,几个对象,几个属性,几个方法。答: 由于 JAVA 中 new 出来的对象都是放在堆中,所以如果要实例化 100 次,将在堆中产生 100 个对象,一般对象与其中的属性、方法都属于一个整体,但如果属性和方法是静态的,就是用 static 关键字声明的,那么属于类的属性和方法永远只在内存中存在一份
7、。7. 红黑树的好处、AVL 树红黑树性质:根节点是黑色的;非黑即红;叶节点(空节点)是黑色的;父节点是红色的,则其孩子节点必须是黑色的;从某一个节点到叶节点的所有路径,其黑色节点数目相同。红黑树好处:红黑树是许多“平衡的”查找树中的一种,它能保证在最坏情况 下,基本的动态集合操作时间为 O(lgn)。 红黑树并不追求完全平衡,它只要求部分的达到平衡要求,降低 了对旋转的要求,从而提高了性能。由于它的设计,任何不平衡 都会在三次旋转之内解决。红黑树的算法时间复杂度和 AVL 相同, 但统计性能比 AVL 树更高。 AVL 树明显比红黑树逻辑简单的多,但应用得少,应该是增删性能 差一点,增删时需
8、要旋转的次数可能比较多。8. 数组和链表,遍历效率哪个高,为什么(cpu 缓存与内存)数组的效率高,因为数组是连续存储的,即内存地址是连续的,所以在读取数组时,会将连续的内存地址的数据放入缓存中,所以读取数组时相当于是从缓存读取。而链表遍历都是从内存读取,缓存的读取速度要比内存块 100 倍左右。9. 进程间通信, 怎么共享内存i. 匿名管道:单向,只能用于具有亲缘关系的进程间通信,如父 子进程、兄弟进程等,缓冲区大小有限制。 ii. 命名管道:单向,可以用在任意的两个不同的进程间通信。iii. 信号量:主要用于同步。iv. 共享内存:最快的 IPC 机制,一般和信号量一起使用。一个进程创建,
9、其他进程通过映射的形式,将共享内存加入到自己的 内存空间中。数据结构:shmid_ds,函数 shmget:可以创建或 打开一块共享内存。v. 消息队列:是消息的链接表,有足够权限的进程可以向队列中 添加消息,被赋予读权限的进程则可以读走队列中的消息。消 息队列克服了管道只能承载无格式字节流以及缓冲区大小受 限等缺点。 vi. Socket:更为一般的进程间通信机制,可用于不同机器之间的进程间通信。10. Fork 进程时,继承那些:继承:进程的资格、堆栈、环境、内存、打开文件的描述符、执行时关闭标志、信号控制设定、nice 值、进程调度类别、进程 组号、当前工作目录、根目录、资源限制、控制终
10、端。独有:进程号、不同的父进程号、自己的文件描述符和目 录流的拷贝、子进程不继承父进程的进程,正文,数据和其他锁定内存、在 tms 结构中的系统时间、资源使用设定为 0、阻塞信号集初始化为空集、不继承由 timer_create 函数创建的计时器、不继承异步输入和输出。11. 1000 个超大的文件,可能每一个都超过内存,怎么对他们进 行排序和消除冲项,1 个超大怎么排序和消除重项。读文件,计算 hash(%10000),分成更小的文件,重复项肯定在一个文件里,归并的时候去重12. 2 个数组,一个超大数组(10w 记录),一个小一点,几千条, 问怎么找交集。两个数组元素无重复bitmap:b
11、it 数组,已 bit 代表一个数,1 表示有,遍历大数组构造 bit 数组;遍历小数组,看对应位置是否为 113. StackOverFlow 和 OutOfMemory 分别在什么情况下出现StackOverFlow:一般情况下 stack 的默认值为 128k256k, -Xss1024m1.请求栈深度大于允许最大深度,如:深度循环递归OutOfMemory:1. 多线程环境下,能够创建的线程最大内存=物理内存-最大堆内存-最大方法区内存,java 虚拟机栈就会因为内存太小无法创建线程而产生 OutOfMemoryError2. 大的对象或数组,堆地方不够用3. 运行时常量池(方法区)因
12、无法再添加常量而产生 OutOfMemoryError4. 直接内存用光,堆与直接内存物理内存5. 虚拟机栈动态扩展时无法获得足够内存14. java 虚拟机模型虚拟机栈:方法内存模型,一个方法一个栈帧,包括:局部变量表,操作数栈,动态链接,方法出口,请求栈深度大于允许报 StackOverFlow,动态扩展无法申请足够内存,包 OOM。-xss 设栈容量默认 256k? 局部变量表:所属对象引用,方法参数,局部变量(基本类型,引用)本地方法栈:与虚拟机栈相识,面向本地 native 方法,hotspot 中与虚拟机栈合二为一堆:对象实例,数组,类加载完成便可确定对象大小,OOM方法区:也有人
13、叫永久代(Permanent Generation)类信息,常量,静态变量等在加载完成后放入方法区,即时编译器编译后的代码运行常量池:class 文件中的常量池,编译生成的字面量,符号引用(new 对象时:先检查此类的符号引用是否加载、解析、初始化过,若否,先加载);动态性:String.intern15. 虚拟机垃圾回收可达性分析:从 GCroots 向下搜索,判断是否有引用可达GCroots:虚拟机栈(本地变量表)中引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象,本地方法栈中 JNI 引用的对象强引用:永远不会回收被引用的对象软引用 SoftRef:有用但非必需的对象,发
14、生内存溢出异常前将对象列进回收范围中进行第二次回收,如果此次回收还没有足够内存才会抛异常弱引用 WeakRef:非必需对象,只能生存到下一次垃圾回收之前,无论内存是否够,都会回收虚引用 PhantomRef:完全不对生存时间构成影响,也无法通过虚引用来取得一个对象实例标记整理算法:所有存活的对象都向一端移动,然后清理边界以外的内存分代收集:当前多采用,java 堆分成:新生代 Eden,老年代(Survivor,两个 from to)新生代:复制算法,老年代:存活率高,适合标记清理或整理hotspotSerial: 复制算法 单线程 client 模式默认新生代收集器,stop the wor
15、ld,简单高效ParNew: Serial 的多线程版本,其他都 server 模式首选,只有它能跟 CMS 搭配Parallel Scavenge: 关注吞吐量(cpu 执行用户)并行:多个收集线程同时收集并发:收集线程和用户线程同时,不一定并行可能交替方法区(hotspot 的永久代) 也可以回收废弃常量的回收类的回收: 无对象,classloader 已回收,该类对应的 class 文件没有被引用,且不可通过反射获取该方法复制算法:老年代做担保,新生代分三块一个 Eden80 两个 survivor 都是 1016. string 类 能否继承?如果写一个类 不能被继承 final 外
16、还有什么方法不能,因为是 final 的。还可以把构造函数私有化,单例模式18. session 和 cookie 的区别:session 放在服务器,cookie 放在客户端session 不区分路径,在同一个用户在访问一个网站期间,所有的 session 在任何一个地方都可以访问到。而 cookie 中如果设置了路径参数,那么同一个网站中不同路径下的cookie 互相是访问不到的。也就是说,同一个用户的 cookie,他换了浏览器,就访问不到之前的那个不同牌子的浏览器的 cookie 了。session 中保存的是对象,cookie 中保存的是字符串。 由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以 session 机制可能需要借助于 cookie 机制来达到保存标识的目的,但实际上它还有其他选择【经常被使用的一种技术叫做 URL 重写,就是把 session id 直接附加在 URL 路径的后面。还有一种技术叫做表单隐藏字段】。20. 单例模