这些关于java基础的灵魂拷问你都答得出吗

一、Java SE 篇

1.1 代码块执行

1.1.1 静态代码块,构造代码块,普通方法执行顺序?

答:先执行静态代码块、然后是构造器(先加载父类再子类)、最后普通方法按顺序依次执行。

1.1.2 静态代码块,构造代码块,局部代码块执行顺序?

答:先执行静态代码块,然后执行构造代码块,再执行构造器,最后是局部代码块。

1.1.3 创建对象的时候,构造方法是如何执行的?

  • 先执行父类构造器(先执行父类的静态代码块)
  • 子类构造器
  • set get 方法
  • 创建什么对象,打印的this 就是谁

1.2 相似(重写与重载、==与equals、string相关API)

1.2.1 重写与重载的区别?

重载:

  • 方法名必须相同
  • 形参列表必须不同
  • 返回类型没有要求,一般在本类。
  • 解决了相同功能方法起名麻烦的问题

重写:(一同,两小,一大)

  • 发生到子类和父类之间
  • 方法签名必须相同(方法名+形式参数)
  • 子类的返回类型是和父类一致或者是比它小
  • 子类抛出的异常和父类一致或者比它小
  • 子类的修饰符必须大于等于父类的
  • 解决子类继承父类,父类方法满足不了我们子类方法要求,需要在子类里面重写该方法。

1.2.2 equals 与 = = 的区别?

  • ==是一个比较运算符

  • ==既可以判断基本类型,又可以判断引用类型

  • ==如果判断基本类型,判断的是值是否相等。

  • ==如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象

  • equals:是Object类中的方法,只能判断引用类型,

  • 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。

1.2.3 Stringbuilder 、 StringBuffer 、 String 的区别?**

  • Stringbuilder : 非线程安全,单线程使用,速度快
  • StringBuffer : 线程安全,多线程使用,速度较快
  • String : 速度慢,每次拼接都要创建新的对象

1.3 集合相关

1.3.1 HashTable与HashMap的区别?

  • 线程安全:HashMap是非线程安全的,HashTable是线程安全的,因为HashTable中的方法基本都实现了synchronized.
  • 效率:HashMap线程不安全,所以相对来说效率较高。
  • key-value 类型支持:HashMap的key 允许一个为Null ,但是HashTable的key 和value 都不允许为空。
  • 扩容机制
    • HashMap第一次扩容为16,且加载因子为0.75,后面按2倍扩容;HashTable 第一次的容量为11,后面扩容按2倍+1来扩。
    • 创建时给定一个默认大小值,HashTable会按照那个值,但是HashMap是扩充为2的幂次方大小(1,2,4,8,16,32…)。
  • 底层数据结构:HashMap 是数组 + 链表+ 红黑树,如果链表的长度大于8 并且数组的大小大于64 ,便会树化。HashTable没有这样的机制。

1.3.2 HashMap的的加载因子为什么是 0.75 而不是 0.5 或 1 ?

  • 如果加载因子过大,那么它的扩容频率低,浪费的存储空间小,不过发生hash冲突的几率比较大,假如加载因子是1,如果HashMap的大小是128,那么这个容量存储的数据在64- 128 之间,那么这个时间段就更容易造成hash冲突,使得链表的长度较长,从而影响性能。
  • 如果加载因子偏小,那么它的扩容频率高,因此会占用更多的空间,但是表就会稀疏,hash冲突的几率就比较小,操作性能就会比较高(如加载因子为0.5,那么HashMap的大小为256时,那么这个容量存储的数据在64 - 128之间,浪费空间有点大)

1.3.3 HashMap的扩容操作是怎么实现的 ?

  1. 首先判断当前容量是否为空,如果为空,则扩容到16.
  2. 获取key的hashcode,对hashcode进行扰动处理,计算出元素的下标。
  3. 根据元素的下标判断是否有hash碰撞,如果没有,则直接放入table表中。
  4. 如果有hash碰撞,则比较两个key是否相同,相同则覆盖,不相同则以链表的方式插入到尾部(尾插法)。
  5. 如果插入到尾部以后链表的长度到了8,并且table表的容量已经到达64,则进行树化。
  6. 插入成功后,如果元素个数到达阈值则进行扩容。

1.3.3 ArrayList和LinkedList的区别 ?

  1. 数据结构:ArrayList底层是一个动态数组,而LinkedList底层是一个双向链表。
  2. 随机访问效率:ArrayList随机访问效率比LinkedList高,因为ArrayList是一种线性储存方式,所以移动指针从前往后依次查找即可。
  3. 插入删除效率:LinkedList比ArrayList效率高,因为ArrayList的操作要影响其它元素的下标。
  4. 线程安全:它们都是非线程安全的,都没有实现synchronized。
  5. 内存占用:LinkedList更占内存,因为LinkedList节点中除了储存对象还要存储两个引用,一个指向前一个元素,一个指向后一个元素。

二、JavaWeb篇

2.1 概念及专业术语的理解

2.1.1 Servlet 相关

2.1.1.1 什么是Servlet ?
  • Sun ( Oracle )公司制定的一种用来扩展Web服务器功能的组件 规范
2.1.1.2 什么是组件?
  • 在软件开发行业,符合一定规范,实现部分功能,并且需要部署到容器当中才能运行的软件模块。
2.1.1.3 什么是容器?
  • 符合一定规范,提供组件运行环境的一个程序。

2.1.2 什么是三层C/S结构,什么是三层B/S结构?

一、三层C/S架构(客户端 + 应用服务器 + DB)即客户端 - web 服务器 - 数据库。

  • 其特点:
    1、数据库只负责数据的管理
    2、应用服务器提供所有的业务逻辑的处理
    3、客户端只负责提供操作界面
  • 其优点:
    1、移植性好,适合大型应用
    其缺点:
    1、客户端需要单独安装,开发复杂(需要自定义协议,编写客户端和服务器端的通信模块)

二、三层B/S架构(Browser + Web Server + DB)即浏览器 - web服务器 - 数据库

B/S架构的优势:
特点:
1、数据库只负责数据的管理
2、Web服务器负责业务逻辑的处理
3、浏览器负责提供操作页面
优点:
1、不需要单独安装客户端。
2、开发相对于CS简单,客户端和服务器的通信模块都是使用标准的HTTP协议进行通信。

2.1.3 请列出JSP页面9大内置对象及四大域对象?

一、四大域对象为:输入输出对象,作用域通信对象、Servlet对象、异常对象。

  • 输入输出对象包括:
    1、request:用来请求信息。
    2、response:用来响应信息。
    3、out:输出的数据流。
  • 作用域通信对象包括:
    4、session:用于会话。
    5、application:是全局的上下文对象。
    6、pageContext:是JSP页面上下文。
  • Servlet对象包括:
    7、page:是JSP页面本身。
    8、config:Servlet配置对象。
  • 异常对象包括:
    9、exception:用于捕获网页异常.
    在这里插入图片描述

在这里插入图片描述

谈谈重定向与转发的区别联系?

区别与联系:

1、重定向是浏览器发送请求并收到响应以后再次向一个新地址发请求,转发是服务器收到请求后为了完成响应转到一个新的地址。
2、重定向中有两次请求对象;不共享数据;转发只产生一次请求对象且在组件间共享数据。
3、重定向后地址栏地址改变;而转发则不会。
4、重定向的新地址可以是任意地址;转发到的新地址必须是同一个应用内的某地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值