目录

  • 前言
  • 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

首先TCPUDP协议都是属于传输层的协议,UDP的包头几乎只保存了源端口号和目标端口,而TCP的包头还记录了包的序号、确认序号、状态位、窗口大小等,所以相对TCP来说UDP头部开销更小。

UDP是无需连接的,可以同时支持一对一、一对多、多对一还有多对多等交互通信。而TCP是需要通过三次握手来进行连接的,只能进行一对一的通信。

UDP是不可靠的传输,它只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作,所以当报文发送后,我们并无法知道其是否安全完整到达。而且UDP是无连接的传输协议,想发就发,这本身就不可靠。而TCP是可靠传输,它是在不保留报文边界的情况下以字节流方式进行传输,每个包都有一个序号,保证包的按序接收,接收端在成功接收以后会发回一个相应的确认(ACK),如果发送端在合理的往返延时(RTT)未收到确认,那么该包将会重传。所以通过TCP连接 传输的数据无差错,不丢失,不重复,且按顺序到达。

所以从两者特性来看,UDP更适合实时性要求较高的场景下使用,比如实时聊天、直播等场景。而对数据准确性要求高,速度可以相对较慢的,可以选用TCP

2.能讲讲你对Collection接口的了解吗

CollectionJava集合类的顶级接口之一,其内部实现了多种集合操作方法供子类使用,它有三种子类型接口集合,分别是ListSetQueue。每个子接口下面又是一些抽象类,最后是一些常见的实现类。

  • 1.ArrayList
    属于List接口下,是顺序容器,支持随机访问,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。其特点在于,当容器内容量不足时,容器会自动进行扩容自动增加底层数组大小,其底层数组类型为ObjectArrayList是一种线程不安全的集合类。
  • 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 个时,会将链表转化为红黑树实现。 所以jdk8HashMap是基于数组+链表+红黑树进行实现的。HashMap线程不安全的。
  • 2.HashTable
    HashMap类型,但其是线程安全的,但是效率不高,现在已经被遗弃使用。如果想使用线程安全的,推荐使用ConcurrentHashMap
  • 3.LinkedHashMap
    使用双向链表维护元素的插入顺序
  • 4.TreeMap
    底层为红黑树实现,可以使得key有序存储。

4.Spring 中 Bean 的作用域和生命周期

SpringBean 的作用域有以下:

  • 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有什么区别?

BeanFactorySpring的原始接口,它的实现功能比较单一,用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依赖于名为JESSIONIDcookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。

  • 6.跨域支持不同

  • cookie支持跨域

  • session不支持跨域

推荐专栏

《Java入门一百练》 学习有疑问?