常见java面试题
JAVA面向对象的特征
封装 继承 抽象 多态
封装:在面向对象语言中 封装特性是由类来实现的 我们将现实生活中的一类实体定义成类 其中包括属性和行为(在java中是方法) 例如电脑
继承:继承就像是我们现实生活中的父子关系 儿子可以遗传父亲的一些特性 在面向对象语言中 就是一个类可以继承另一个类的一些特性 从而可以代码复用
抽象:抽象就是将一类实体的共同特性抽象出来 封装在一个抽象类中 所以抽象在面向对象语言是由抽象类来实现的 比如人 class Person{}
多态:多态就是通过传递给父类对象引用不同的子类对象 从而表现出不同的行为
String, StringBuffer,StringBuilder的区别是什么 String为什么是不可变的
String是字符串常量 StringBuffer和StringBuilder是字符串变量
StringBuffer是线程安全的 StringBuilder是非线程安全的
具体来说String是一个不可变的对象 每次修改String对象实际上是创新对象 并将引用指向新对象 效率很低 StringBuffer是可变的 即每次修改只是针对其本身
大部分情况下比String效率高 StringBuffer保证同步(synchronized) 所以线程安全 StringBuilder没有实现同步 所以非线程安全
但效率应该比StringBuffer高 StringBuffer使用时最好指定容量 这样会比不指定容量快30%-40% 甚至比不指定容量的StringBuilder还快
装箱和拆箱
为什么需要装箱拆箱 : 是java早年设计缺陷 基础类型是数据 不是对象 也不是Object的子类
装箱就是自动将基本数据类型转换为包装器类型 小转大
拆箱就是自动将包装器类型转换为基本数据类型 大转小
例:Integer a = Integer.valueOf(123);//装箱
int b = a.intValue();//拆箱
讲一下JAVA中的集合
java中的集合分为value(Collection)和key-value(Map)
存储value的有list和set
list是有序可重复
set是无序不可重复的
存储为key-value是map 分为:HashMap,Hashtable ,CurrentHashMap
ArrayList ,Vector,LinkedList的区别
1.区别
Vector,ArrayList都是以类似数组的形式存储在内存中 LinkedList则以链表形式进行存储
Vector线程同步 ArrayList ,LinkedList线程不同步
LinkedList适合指定位置插入 删除操作 不适合查找
ArrayList,Vector适合查找 不适合指定位置的插入 删除操作
Vector默认扩充为原来的两倍(每次扩充空间大小是可以设置的)
ArrayList默认扩充为原来的1.5倍 因此ArrayList更节省空间
2.联系
ArrayList,Vector,LinkedList类均在java.util包中都是可改变大小的
ArrayList和Vector都是基于存储元素的Object[] array来实现的 他们会在内存中开辟一块连续空间来存储 由于数据存储是连续的 因此 他们支持用索引来访问元素 同时索引数据的速度比较快 但是在插入元素时需要移动容器中的元素 所以对数据插入操作执行的比较慢
ArrayList和Vector都有一个初始化容量大小 当里面存储的元素超过这个大小就需要动态的扩充他们的存储空间
HashMap和HashTable区别
相同:HashMap和HashTable都可以存储key-value的数据
不同:1.基类不同 HashTable基于Dictionary类 而HashMap基于AbstractMap Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类 而AbstractMap是基于Map接口的骨干实现 它以最大限度的减少实现此接口所需的工作
2.线程安全 HashMap是单线程安全的 HashTable是多线程安全的
3.遍历不同 HashMap仅支持lterator的遍历命令 HashTable支持lterator和 Enumeration两种遍历方式
4.null不同 HashMap可以允许存在一个为null的key和任意个为null的value 但是HashTable中的key和value都不允许为null
ArrayList和LinkedList区别
ArrayList和LinkedList都实现了List接口 有以下不同点:
1.ArrayList是基于索引的数据接口 它的底层是数组 它的查询速度很快
2.LinkedList是以元素列表的形式存储它的数据 每一个元素都和它前一个和后一个元素链接在一起 所以它的插入 添加 删除速度更快 因为当元素被添加到集合任意位置的时候 不需要像数组那样重新计算大小或者是更新索引
3.LinkedList比ArrayList更占内存 因为LinkedList为每一个节点存储了两个引用 一个指向前一个元素 一个指向下一个元素
Iterator和ListIterator区别是什么
Iterator可以用来遍历Set和List集合 但是ListIterator只能用来遍历List
Iterator对集合只能是前向遍历 ListIterator既可以前向也可以后向
ListIterator实现了Iterator接口 并包含其他的功能 比如:增加元素 替换元素 获取前一个和后一个元素的索引 等等
Java都有哪些开发平台
Java SE:主要在客户端开发
Java EE:主要在web应用程序开发
Java ME:主要用在嵌入式应用程序开发
什么是JDK 什么是JRE
JDK:java development kit 是java开发工具包 是开发人员所需要安装的环境
JRE:java runtime environment 是java运行环境 java程序运行所需要安装的环境
什么是数据结构
计算机保存 组织数据的方式
Java的数据结构有哪些
线性表(ArrayList)
链表(LinkedList)
栈(Stack)
队列(Queue)
图(Map)
树(Tree)
++i 与 i++区别
++i:先赋值 后计算
i++:先计算 后赋值
Java中各种数据默认值
Byte short int long 默认都是0
Boolean默认值是false
char类型的默认值是’’
Float与double类型默认是0.0
对象类型的默认值是null
形参与实参
形参:全称为“形式参数” 是在定义方法名和方法体的时候使用的参数 用于接收调用该方法时传入的实际值
实参:全称为“实际参数”是在调用方法时传递给该方法的实际值
你所知道的网络协议有哪些
HTTP:超文本传输协议
FTP:文件传输协议
SMPT:简单邮件协议
TELNET:远程终端协议
POP3:邮件读取协议
HTTP响应的结构是怎么样的?
HTTP响应由三个部分组成:
状态码(Status Code):描述了响应的状态 可以用来检查是否成功的完成了请求 请求失败的情况下 状态码可以用来找出失败的原因 如果Servlet没有返回状态码 默认会返回成功的状态码HttpServletResponse.SC_OK
HTTP头部(HTTP Header):它们包含了更多关于响应的信息 比如:头部可以指定认为响应过期的过期日期 或者是指定用来给用户安全的传输实体内容的编码格式 如何在Servlet中检索HTTP的头部看这里
主体(Body):它包含了响应的内容 它可以包含HTML代码 图片 等等 主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成的
什么是cookie?session和cookie有什么区别
cookie是web服务器发送给浏览器的一块信息 浏览器会在本地文件中给每一个Web服务器存储cookie 以后浏览器在给特定的Web服务器发送请求的时候同时会发送为该服务器存储的cookie
区别在于:
无论客户端浏览器做怎么样的设置 session都应该能正常工作 客户端可以选择禁用cookie 但是 session仍然是能够工作的 因为客户端无法禁用服务端的session
在存储数据量方面session和cookies也是不一样的 session能够存储任意的Java对象 cookie只能存储String类型对象
什么是HTTP隧道
HTTP隧道是一种利用HTTP或者是HTTPS把多种网络协议封装起来进行通信的技术 因此 HTTP协议扮演了一个打通用于通信的网络协议管道的包装器的角色 把其他协议的请求掩盖成HTTP请求的就是HTTP隧道
sendRedirect()和forward()方法有什么区别
sendRedirect()方法会创建一个新的请求 而forward()方法只是把请求转发到一个新的目标上 重定向(redirect)之后 之前请求作用域范围以内的对象就失效了 因为会产生一个新的请求 而转发(forwarding)以后 之前请求作用域范围以内的对象还是能访问的 一般认为sendRedirect()比forward()要慢