目录
- 前言
- 1.TCP和UDP
- 2.能讲讲你对Collection接口的了解吗
- 3.对于Map了解吗,能聊聊jdk7的jdk8的HashMap有啥区别吗?
- 4.Spring 中 Bean 的作用域和生命周期
- 5.Bean Factory和ApplicationContext有什么区别?
- 6.Mybatis中,#{}和${}的区别?
- 7.session 和 cookie 有什么区别?
- 推荐专栏
前言
最近又到了找实习热门时间,每天坚持更新Java
实习岗位相关的面试题,不仅是自己学习总结,也为了帮助大家一起准备,每天进步一点点,坚持不懈,水滴石穿,一起拿下offer
。
1.TCP和UDP
首先TCP
和UDP
协议都是属于传输层的协议,UDP
的包头几乎只保存了源端口号和目标端口,而TCP
的包头还记录了包的序号、确认序号、状态位、窗口大小等,所以相对TCP
来说UDP
头部开销更小。
UDP
是无需连接的,可以同时支持一对一、一对多、多对一还有多对多等交互通信。而TCP
是需要通过三次握手来进行连接的,只能进行一对一的通信。
UDP
是不可靠的传输,它只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作,所以当报文发送后,我们并无法知道其是否安全完整到达。而且UDP
是无连接的传输协议,想发就发,这本身就不可靠。而TCP
是可靠传输,它是在不保留报文边界的情况下以字节流方式进行传输,每个包都有一个序号,保证包的按序接收,接收端在成功接收以后会发回一个相应的确认(ACK),如果发送端在合理的往返延时(RTT)未收到确认,那么该包将会重传。所以通过TCP
连接 传输的数据无差错,不丢失,不重复,且按顺序到达。
所以从两者特性来看,UDP
更适合实时性要求较高的场景下使用,比如实时聊天、直播等场景。而对数据准确性要求高,速度可以相对较慢的,可以选用TCP
。
2.能讲讲你对Collection接口的了解吗
Collection
是Java
集合类的顶级接口之一,其内部实现了多种集合操作方法供子类使用,它有三种子类型接口集合,分别是List
、Set
、Queue
。每个子接口下面又是一些抽象类,最后是一些常见的实现类。
- 1.ArrayList
属于List
接口下,是顺序容器,支持随机访问,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。其特点在于,当容器内容量不足时,容器会自动进行扩容自动增加底层数组大小,其底层数组类型为Object
。ArrayList
是一种线程不安全的集合类。 - 2.vector
同属于List
接口,与ArrayList
类型,是线程安全的,但效率不高,现在已经基本不使用了。 - 3.LinkedList
不仅属于List
接口,也属于Queue
接口。底层为双向链表实现,只能顺序访问,但是可以高效进行插入和删除元素,一般常用作栈、队列和双向队列的实现类。 - 4.PriorityQueue
属于Queue
,基于堆结构实现,为优先队列的实现类。 - 5.HashSet
属于Set
接口,底层基于哈希表实现,支持快速查找,存储元素无序且不可重复。 - 6.TreeSet
属于Set
接口,基于红黑树实现,数组存储是有序的,但是查找效率不高,HashSet
查找的复杂度一般视为 O ( 1 ) O(1) O(1),但TreeSet
则为 O ( l o g n ) 。 O(logn)。 O(logn)。 - 7.LinkedHashSet
属于Set
接口,具有和HashSet
一样的查询效率,内部使用双向链表实现,可同时维护元素的插入顺序。
3.对于Map了解吗,能聊聊jdk7的jdk8的HashMap有啥区别吗?
Map
接口同样是Java
的顶级集合接口之一,其存储数据的方式是以键值对的形式,其常见的实现类有以下几种:
- 1.HashMap
Map
接口最常用的实现类,key
的存储是无序的,在jdk7
中是基于哈希表来实现的,实现的方式为冲突链表法。因为在通过哈希值定位到下标后,为了查找元素我们需要顺着链表去进行查找我们需要的元素,链表越长开销越大,为了降低该部分消耗,在jdk8
中我们链表中的元素达到 8 个时,会将链表转化为红黑树实现。 所以jdk8
的HashMap
是基于数组+链表+红黑树进行实现的。HashMap
是线程不安全的。 - 2.HashTable
与HashMap
类型,但其是线程安全的,但是效率不高,现在已经被遗弃使用。如果想使用线程安全的,推荐使用ConcurrentHashMap
。 - 3.LinkedHashMap
使用双向链表维护元素的插入顺序 - 4.TreeMap
底层为红黑树实现,可以使得key
有序存储。
4.Spring 中 Bean 的作用域和生命周期
Spring
中Bean
的作用域有以下:
- 1.
singleton
:唯⼀bean实例,Spring中的bean默认都是单例的。 - 2.prototype:每次请求都会创建⼀个新的bean实例。
- 3.request:每⼀次HTTP请求都会产⽣⼀个新的bean,该bean仅在当前HTTP request内有效。
- 4.session:每⼀次HTTP请求都会产⽣⼀个新的bean,该bean仅在当前HTTP session内有效。
- 5.application:在⼀个应⽤的Servlet上下⽂⽣命周期中,产⽣⼀个新的bean
- 6.websocket:在⼀个WebSocket⽣命周期中,产⽣⼀个新的Bean
对于Bean
的生命周期,一般为以下流程:
- 1.实例化:通过反射调用构造方法或者使用工厂方法实例化
Bean
对象 - 2.依赖注入:为
Bean
对象装配属性 - 3.调用
Bean
的初始化方法 - 4.使用
Bean
对象 - 5.容器关闭时,执行
Bean
的销毁方法
5.Bean Factory和ApplicationContext有什么区别?
BeanFactory
是Spring
的原始接口,它的实现功能比较单一,用BeanFactory
接口实现的容器特点是只有在获取对象时才会去创建对象。
ApplicationContext
继承自BeanFactory
,它不仅永远BeanFactory
的全部功能,而且拓展了许多高级特性,在容器启动就会将所有的对象创建好。现在所有的开发场合下基本都使用的是ApplicationContext
。
6.Mybatis中,#{}和${}的区别?
#{变量名} 是预处理替换的⽅式,本质是 jdbc 中占位符的替换。如传⼊字符串,会替换为带单引号的
值。可以安全性更好,
${变量名} 是字符串的替换,只是对 sql 字符串进⾏拼接。如传⼊字符串,会直接替换为字符串的值,不
加单引号。
#的方式可以很⼤程度的防止sql注入,相对来说更安全。⽽$的⽅式不能。
7.session 和 cookie 有什么区别?
1.存储位置不同
cookie
存储在客户端中,而session
存储在服务器中2.存储容量不同
单个cookie
存储的数据一般不超过4kb
,一个站点的cookie
数量不会超过20
个。
session
并没有限制,但由于存储在服务器端,从服务器端的性能考虑,session
不应存储过多东西,且需要设置session
的删除机制。3.隐私策略不同
cookie
是客户端是可见的,所以有可能被他人分析本地的cookie
并进行cookie
欺骗,所以是不安全的。
session
存储在服务器,是安全的。4.存储方式不同
cookie
只能保存ASCII字符串,并需要通过编码方式将其变为Unicode字符或者二进制数据
session
可以存储任何类型的数据,包括字符串、整数、集合、哈希表等。5.有效期不同
cookie
可以设置属性,达到使cookie
长期有效的效果。
session
依赖于名为JESSIONID的cookie
,而cookie JSESSIONID的过期时间默认为-1
,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。6.跨域支持不同
cookie
支持跨域session
不支持跨域
推荐专栏
《Java入门一百练》 学习有疑问?