值传递:调用方法的时候把实际参数拷贝一份,这样在方法中对这个参数进行修改的话,就不会对实际参数有影响,也可以说是,传递之后就互不相关了
引用传递:在方法调用的时候其实是传递的引用地址,就是变量所在的内存空间的地址,传递的是值的引用,也就是说传递前和传递后都指向同一个引用
最大的区别就是没有复制副本,有复制副本就是值传递,没有复制副本就是引用传递
2,java中IO分为几种InputStream:字节输入流
Reader:字符输入流
OutputStream:字节输出流
Writer:字符输出流
3:BIO,NIO,AIO的区别BIO:一个连接一个线程
NIO:一个请求一个线程
AIO:一个有效请求一个线程
BIO:同步并阻塞,服务器实现模式为一个连接请求一个线程,客户端有请求时,服务器端就要启动一个线程进行处理,如果不处理会造成不必要的线程开销,可以通过线程池解决
NIO:同步非阻塞,服务器一个请求一个线程,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询连接到有IO请求时才会启动一个线程处理
AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的IO请求都是由OS先完成了,在通知服务器启动线程处理
4:什么是反射机制是指程序在运行时能够获取自身的信息
5:String有那些特性1String类是被Final修饰的,不能被继承,
2String类的底层是用数组结构
3不变性,String是一个只读字符串,对它进行任何操作,其实都是创建一个新对象,再把引用指向该对象
4:在使用HashMap的时候用,用String当key(键)相比于其他对象来说更快
6:String 和 StringBuffer、StringBuilderString:String的值被创建后就不能修改,对任何的String进行修改都会创建一个新的String对象
StringBuffer:跟String类似,但是值可以被修改,使用synchronized来保证线程安全
StringBuilder:StringBuffer的非线程安全版本,没有使用synchronized,具有更高性能,推荐优先使用
7int和Integer有什么区别1Integer是int的包装类,int则是java的一种基本数据类型
2Integer变量必须实例化才能时运,而int变量就不需要
3Integer实际是对象的引用,指向此new的Integer对象,int是直接存储数据值
4Integer的默认值是null,int的默认值是0
8:List,Set,Map 三者的区别?List、Set、Map 是否继 承自 Collection 接口?List、Map、Set 三个接口存取 元素时,各有什么特点区别:List:有序,可重复,通过索引查速度快,增删速度慢
set:无序,不能重复的集合
Map:键值对,键唯一,值不唯一,可以根据键得到值
List、Set、Map 是否继 承自 Collection 接口?
List和Set继承了,Map没有
存放:
List以特定的索引有序存放元素,可以重复元素
Set存放元素是无序的,而且不可重复
Map保存键值对的映射,映射关系可以是一对一或者一对多,键是无序唯一,值不唯一
取出:
List取出元素for循环,Foreach循环,Iterator迭代器迭代
Set取出元素foreach循环,Iterator迭代器迭代
Map取出元素需转换Set,然后进行Iterator迭代器迭代,或者转换为Entry对象进行Iterator迭代器迭代
9:Java 集合的快速失败机制 “fail-fast”?fail_fast是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的时候,有可能就会产生fail_fast机制,
产生原因:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个ModCount变量(用来记录对象的修改次数的变量),集合在被遍历期间如果发生了内容变化,就会改变modCount的值,每当使用迭代器遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历,否则就抛出异常,终止遍历
解决办法
1在遍历过程中,所有涉及到改变modCount值的地方全部加上sybnchronized锁
2使用copyOnWriteArrayList来替换ArrayList
10:插入数据时,ArrayList、LinkedList、Vector 谁速度较 快?阐述 ArrayList、Vector、LinkedList 的存储性能和特性ArrayList因为是按索引查询的所以速度最快,,
LinkedList也是按索引查询的,但是它加了synchronized修饰,索引他是安全的,但是性能和ArrayList比差
LinKedList使用的是双向链表实现储存,按序号索引数据需要进行向前活向后遍历,但是插入数据时,只需要记录当前项的前后项即可,所以LinkedList插入速度较快
11ArrayList的扩容原理ArrayList的旧容量不够的时候,就会触发扩容,新容量的大小是旧容量的1.5倍
12HashMap的实现原理HashMap底层是由数据+链表组成的,数组是HashMap的主体,链表只是为了解决哈希冲突,如果定位到数组位置,不包含链表的话,那么查询和添加速度快,只需要查询一次地址就好了,如果定位到了链表,对于添加操作来说,时间复杂度基本为0,首先遍历一遍,存在就覆盖,否则就添加,对于查询方法,仍然需要遍历数组,然后通过key对象的.query()方法逐一对比查找,性能考虑,肯定是链表越少越好.
JDK1.8之后对HashMap实现了优化,当链表的节点数超过八个的时候就会自动装换成红黑树来提高查询效率,从原来的 O(n)到 O(logn)
13,如果使用Object作为HashMap的key,应该怎么办重写HashCode()方法和equals()方法



