欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 面试整理一——基础知识 博客分类: javajava编程 java面试数据结构编程 

程序员文章站 2024-03-06 18:44:56
...
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. 如何遍历一棵二叉树?
java 面试整理一——基础知识
            
    
    博客分类: javajava编程 java面试数据结构编程 

先序遍历:遍历顺序规则为【根左右】ABCDEFGHK
中序遍历:遍历顺序规则为【左根右】BDCAEHGKF
后序遍历:遍历顺序规则为【左右根】DCBHKGFEA
17. 倒排一个LinkedList。
Collections.reverse(list);
18. ==和equals的区别?
==是操作符,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协议族通信的中间软件抽象层,它是一组接口。
  • java 面试整理一——基础知识
            
    
    博客分类: javajava编程 java面试数据结构编程 
  • 大小: 11.6 KB