java 面试整理一——基础知识_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java 面试整理一——基础知识

java 面试整理一——基础知识

 2018/2/25 18:15:08  cpjsjxy  程序员俱乐部  我要评论(0)
  • 摘要:1.shorts1=1;s1=s1+1;有错吗?shorts1=1;s1+=1;有错吗?对于shorts1=1;s1=s1+1;由于1是int类型,因此s1+1运算结果也是int型,需要强制转换类型而shorts1=1;s1+=1;可以正确编译,因为s1+=1;相当于s1=(short)(s1+1);其中有隐含的强制类型转换2.&和&&的区别?&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的
  • 标签:面试 Java 基础知识
1. short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型
而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换
2. &和&&的区别?
&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。
逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。
&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。
3. swtich 是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr)中,expr支持byte、short、char、int、enum、string(1.7)
4. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。
5. 关于equals和hashCode方法,
equals方法必须满足
自反性(x.equals(x)必须返回true)、
对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)、
传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)
一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值)
6. 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
重载:一个类中同一方法参数数量或者类型不同,对返回值无要求
重写:要求子类被重写方法有相同的返回类型、比父类重写的方法更好访问,不能比父类重写方法有更多的异常
7. 如何实现对象克隆?
1). 实现Cloneable接口并重写Object类中的clone()方法;
2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
public static <T> T clone(T obj) throws Exception {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bout);
        oos.writeObject(obj);
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bin);
        return (T) ois.readObject();
        }
基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种是方案明显优于使用Object类的clone方法克隆对象。让问题在编译的时候暴露出来总是优于把问题留到运行时。
8. 创建对象构造器的调用顺序
为对象分配存储空间
开始构造对象
从超类到子类对static成员进行初始化
超类成员变量按顺序初始化,递归调用超类的构造方法
子类成员变量按顺序初始化,子类构造方法调用
9. ArrayList和linkedList
ArrayList基于动态数组实现,查询快、插入删除慢
LinkedList基于链表实现,插入删除快,查询慢
10. hashSet、、LinkedHashSet、TreeSet
hashSet:基于hashMap实现的,无序,不能包含重复元素,非线程安全的
LinkedHashSet:HashSet的子类,使用链表维护元素的次序。有序,非线程安全
TreeSet:使用红黑树结构实现,是sortedSet接口的唯一实现类,可以确保集合内元素处于有序状态
11. HashMap、LinkedHashMap、TreeMap
HashMap:在底层将key-value封装成一个Entry【】进行处理,根据键值的hashcode值存储数据
LinkedHashMap:继承自HashMap,其内部增加了一个链表,用以存放元素的顺序,基于元素的进入顺序排序
TreeMap:实现SortMap接口,能够把它保存的记录根据键排序
12. concurrentHashMap
ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响,降低了对读一致性的要求;
Jdk1.7中,concurrenthashMap的核心是分段锁技术,减少锁竞争同时牺牲了对一致性的要求
Jdk1.8中,concurrentHashMap的核心是volatile变量+CAS,比较并交换,乐观锁的实现机制。
13. volatile修饰符
保证了不同线程对这个变量进行操作时的可见性。加入volatile关键字时,会多出一个lock前缀指令。
应用场景:高并发编程下的状态变量、一次性安全发布(双重锁定问题)

14. 说一下几种常见的排序算法和分别的复杂度。
排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度
冒泡排序 O(n2) O(n2) 稳定 O(1)
快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n)
选择排序 O(n2) O(n2) 稳定 O(1)
二叉树排序 O(n2) O(n*log2n) 不稳定 O(n)
插入排序 O(n2) O(n2) 稳定 O(1)
堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1)
15. 描述一下链式存储结构。
顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。
优点:存储密度大(=1),存储空间利用率高。
缺点:插入或删除元素时不方便。
链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
优点:插入或删除元素时很方便,使用灵活。
缺点:存储密度小(<1),存储空间利用率低。
16. 如何遍历一棵二叉树?


先序遍历:遍历顺序规则为【根左右】ABCDEFGHK
中序遍历:遍历顺序规则为【左根右】BDCAEHGKF
后序遍历:遍历顺序规则为【左右根】DCBHKGFEA
17. 倒排一个LinkedList。
Collections.reverse(list);
18. ==和equals的区别?
==是caozuofu.html" target="_blank">操作符,equals是方法
==一般用于原生类型比较,equals一般用于对象比较
如果==用于对象比较,当两个对象引用的地址相同时返回true
19. hashCode方法的作用?
hashCode()方法和equal()方法的作用其实一样,在java里都是用来对比两个对象是否相等一致.因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高.每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
20. 如何保证HashMap的线程安全?
//synchronizedMap 本质和hashTable类似
Map<String, String> synchronizedHashMap = Collections.synchronizedMap(new HashMap<String, String>());
//Hashtable 使用synchronized来保证线程安全的
Map<String, String> hashtable = new Hashtable<>();
//ConcurrentHashMap
Map<String, String> concurrentHashMap = new ConcurrentHashMap<>();
21. Java中一个字符占几个字节?
“字节”是byte,“位”是bit;1 byte = 8 bit;java是用unicode来表示字符
1字节: byte , boolean
2字节: short , char
4字节: int , float
8字节: long , double
22. 创建一个对象实例有哪些方法?
a) New
b) 运用反射手段,Java.lang.class或java.lang.reflect.Constructor类的newInstance()
c) 调用对象的clone
d) 通过反序列化实现的深度克隆
23. Session/Cookie的区别?
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
24. String/StringBuffer/StringBuilder的区别
a) String是字符常量;stringBuffer和StringBuilder是字符变量;
b) 执行速度Stringbuilder>StringBuffer>String
c) StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,都继承自AbstractStringBuilder中采用一个char数组来保存需要append的字符串,char数组有一个初始大小,当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展。只是StringBuffer中的方法大都采用了synchronized关键字进行修饰,因此是线程安全的


网络相关
1. TCP建立连接的三次握手
第一次握手:客户端发送syn包(syn=j)到服务器。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。
2. TCP断开连接的四次挥手
TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送
服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1
服务器关闭客户端的连接,发送一个FIN给客户端
客户段发回ACK报文确认,并将确认序号设置为收到序号加1
3. 出现大量TIME_WAIT的原因及解决方法
根据TCP协议定义的3次握手断开连接规定,主动关闭socket的一方socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime)。例如,服务器端主动关闭客户端的socket连接,将导致服务器端存在大量的TIME_WAIT状态的socket。 TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。
解决方法:调整内核参数
vi /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后执行 /sbin/sysctl -p 让参数生效
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
4. HTTP协议的头域
a) 通用头域
i. Cache-Control:指定请求和相应遵循的缓存机制,最常见的值是no-cache,指示请求和响应消息不能缓存;
ii. Connection:用于指定处理完本次请求/响应后,客户端和服务器是否还要继续保持连接。
iii. Transfer-Encoding:用于指定实体内容的传输编码方式。
b) 请求头域
i. Accept:用于指定客户端程序能够处理的MIME类型,多个时用逗号隔开;
ii. Accept-Encoding:指定客户端程序支持的压缩方式;
iii. Accept-Language:指定客户端期望返回哪个国家语言的文档;
iv. Accept-Charset:指定客户端程序可以使用的字符集;
v. Host:指定资源所在的主机名和端口号;
vi. Referer:指定请求uri的源资源地址,也就是用户从哪个uri过来,允许服务器生成回退链表;
vii. User-Agent:浏览器客户端信息,如使用哪种浏览器等;
viii. Cookie:服务器在浏览器端留下的信息,这是最重要的请求头字段之
c) 响应头域
i. Server:说明响应服务器的名称,如BWS/1.0或者Apache/1.3.27;
ii. Location:在302跳转页面应答的时候,带有Location指明跳转的目的地址;
iii. Set-Cookie:服务器对浏览器端设置Cookie
d) 实体头域
i. Content-Encoding:指明实体内容采用的压缩方式;
ii. Content-Length:指明实体内容的长度,单位为字节;
iii. Content-Type:指定实体内容的MIME类型;
iv. Expires:指明实体内容在什么时间之后过期,不再缓存。
5. HTTP应答状态码
1xx:信息,请求收到,继续处理;
2xx:成功,行为被成功地接受、理解和采纳;
3xx:重定向,为了完成请求,必须进一步执行的动作;
4xx:客户端错误,请求包含语法错误或者请求无法实现;
5xx:服务端错误,服务器不能正确执行一个正确的请求。
200 正确返回结果
302 页面跳转
304 页面未改动
400 请求错误,不符合协议
404 页面未找到
405 方法不允许
501 未被使用
503 服务不可用
6. HTTP、TCP、UDP的区别
TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。
在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议
在传输层中有TCP协议与UDP协议
在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议
Http协议是基于TCP协议实现的
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
  • 大小: 11.6 KB
  • 查看图片附件
发表评论
用户名: 匿名