Java面试题自我总结

1, 讲一下String和StringBuilder的区别(final)?StringBuffer和StringBuilder的区别?

  1. 在java中提供三个类String StringBuilder StringBuffer 来表示和操作字符串, 字符串就是多个字符的集合.
    String是内容不可变的字符串. String底层使用了一个不可以变的字符数组(final char[])
    String str = new String(“bbb”);
    在这里插入图片描述
    而StringBuilder和StringBuffer是内容可以改变的字符串. StringBuilder StringBuffer底层是使用的可变的数组(没有使用final来修饰)
  1. 最经典就是拼接字符串
    ①, String 进行拼接 String c = “a” + “b” ;
    ②, StringBuilder 或者StringBuffer
    StringBuilder sb = new StringBuilder(); sb.append(“a”).append(“b”);
    拼接字符串不建议使用String进行拼接, 要使用StringBuilder 或者StringBuffer (如果是简单的字符串相加可以使用String连接, 但在循环内部还是老老实实使用另外两个, 因为String相比另外两个比较消耗资源)
  1. StringBuilder是线程不安全的, 效率较高, 而StringBuffer是线程安全的, 效率较低

2, 讲一下java中的集合?

  1. Java中的集合分为value, key-value(Collection和Map)两种.
  1. 存储值(value)又分List和Set:
    ①, List是有序的, 可以重复的.
    ②, Set是无序的, 不可以重复的. 根据equals和hashCode判断, 也就是说如果一个对象要存储在Set中, 必须重写equals和hashCode方法

3, ArrayList和LinkedList的区别和使用场景?

  1. 区别:
    ①ArrayList底层使用的是数组. LinkedList使用的是链表.
    ②数组查询具有查询特定元素比较快. 而插入和删除和修书比较慢(因为数据在内存中是一块连续的内存, 如果插入或删除是需要移动内存).
    链表是不要求内存是连续的, 在当前元素中存放下一个或上一个元素. 查询时需要从头部开始, 一个一个的找. 所以查询效率低. 插入时不需要移动内存, 只需要改变引用指向即可. 所以插入或删除的效率高
  1. 应用场景:
    ArrayList使用在查询比较多, 但是插入和删除比较少的情况, 而LinkedList使用在查询比较少插入和删除比较多的情况.

4讲一下HashMap和HashTable的区别? HashTable和 ConcurrentHashMap的区别?

  1. 相同点: HashMap和HashTable都可以使用来存储key-value的数据
  2. 区别:
    ①, HashMap是可以把null做为key或者value的, 而HashTable是不可以的.
    ②, HashMap是线程不安全的, 效率较高. 而HashTable是线程安全的, 效率较低.

我想线程安全但我又想效率高?
    ConcurrentHashMap通过将整个Map分为N个Segment(类似HashTable), 可以提供相同的线程安全, 但是效率提升N倍, 默认提升16倍


5, 讲一下线程的几种实现方式? 怎么启动? 怎么区分线程?

  1. 实现方式
    ①, 通过实现Thread类实现一个线程
    ②, 通过实现Runnable接口实现一个线程
    注: 继承扩展性不强, java只支持单继承, 如果一个类继承Thread就不能继承其他的类了
  1. 怎么启动?
    Thread thread = new Thread(继承了Thread的对象/实现了Runnable的对象)
    thread.start();
    启动线程使用start() 方法, 而启动了以后执行的是run方法.
  1. 怎么区分线程? 一个系统中有很多线程, 每个线程都会打印日志, 我想区分是哪个线程打印的怎么办?
    thread.setName(“设置一个线程名称”); 这是一种规范, 在创建线程完成后, 都需要设置名称.

6, 线程池的作用?

  1. 限定线程的个数, 不会导致由于线程过多导致系统运行缓慢或崩溃
  2. 线程池不需要每次都去创建或销毁, 节约了资源.
  3. 线程池不需要每次都去创建, 响应时间更快.

7, 讲一下什么是设计模式? 常用的设计模式有哪些?

设计模式就是经过前人无数次的实践总结出的, 设计过程中可以反复使用的, 可以解决特定问题的设计方法.

  1. 单例(饱汉模式/饥汉模式)
    ①, 构造方法私有化, 让除了自己类中能创建外其他地方不能创建
    ②, 在自己的的类中创建一个实例(饱汉模式是一出来就创建单实例, 而饥汉模式需要的时候才创建)
    ③, 提供一个方法获取该实例对象(创建时需要进行方法同步)
  2. 工厂模式: Spring IOC就是使用了工厂模式. 也就是对象的创建交给一个工厂去创建.
  3. 代理模式: Spring AOP就是使用的动态代理.

8, http get post请求的区别?

  1. 相同点: get和post请求都是http请求方式, 用户通过不同的http的请求方式完成对资源(url)的不同操作. get,post,put,delete 就对应着对这个资源的查, 改, 增, 删 4个操作, 具体点讲get一般用于获取/查询资源信息, 而post一般用于更新资源信息
  2. 区别:
    ①, get请求提交的数据会在地址栏显示出来, 而post请求不会再地址栏显示出来
    ②, 传输数据的大小(get请求由于浏览器对地址长度的限制而导致传输的数据有限制, 而post不会)
    ③, 安全性, post的安全性要比get的安全性高

9,说一下你对Servlet的理解? 或者Servlet是什么?

  1. Servlet (Server Applet), 全称Java Servlet, 用Java编写的服务器端程序, 而这些程序(Servlet)都要实现Servlet这个接口. 其主要功能是用于交互地浏览和修改数据, 生成动态Web内容. Servlet运行于支持Java的应用服务器中.
  2. 实际工作中我们是继承HttpServlet, 重写doGet和doPost方法或者你也可以重写service方法完成对get和post请求的响应

10, 简单说一个Servlet的生命周期?

Servlet有良好的生存期的定义, 包括加载实例化, 初始化, 处理请求以及服务结束. 这个生存期由Servlet接口的init service 和destroy方法表达

加载Servlet的class–> 实例化Servlet–> 调用Servlet的init完成初始化–> 响应请求(Servlet的service方法) --> Servlet容器关闭时(Servlet的destory方法)

Servlet启动时, 开始加载Servlet, 生命周期开始. Servlet被服务器实例化后, 容器运行其init方法, 请求到达时运行其service方法, servcie方法自动派遣运行与请求对应的doXXX方法(doGet, doPost)等,当服务器决定将实例销毁的时候(服务器关闭)调用destory方法


11, Servlet API中的forward() 与redirect() 的区别?

  1. forward是服务器端的转向而redirect是客户端的跳转.
  2. 使用forward浏览器不会发生改变, 而redirect会发生改变.
  3. forward是一次请求中完成, 而redirect是重新发起请求.
  4. forward是由服务端完成,而不是客户端重新发起的请求, 效率较高

12, JSP和Servlet有哪些相同点和不同点?

  1. 相同点: JSP是Servlet技术的技术扩展, 所有的jsp文件都会翻译为一个继承HttpServlet的类. 也就是JSP最终也是一个Servlet, 这个Servlet对外提供服务.
  2. 不同点:
    ①, Servlet和JSP最主要的不同点是JSP侧重于视图, Servlet主要用于控制逻辑
    ②, Servlet如果要实现html功能, 必须使用Writer输出对应的html, 比较麻烦. 而JSP的情况是Java和html 可以组合成一个扩展名为.jsp的文件, 做界面展示比较方便而嵌入逻辑比较复杂.

13, jsp有哪些内置对象? 作用分别是什么?

9个内置对象:
request 用户请求, 此请求会包含来自GET/POST请求的参数
② response 网页传回用户端的响应
pageContext 网页的属性是在这里管理
session 与请求有关的会话
application servlet正在执行的内容
⑥ out 用来传送回应的输出
⑦ config servlet的构架部件
⑧ page JSP网页本身
⑨ exception 针对错误网页, 未捕捉的例外
四大作用域: pageContext request session application 可以通过jstl从四大作用域中取值
Jsp传值 request session application cookie都可以传值


14, Session和Cookie的区别和使用场景

相同点: Session和Cookie都是会话(Session)跟踪技术. Cookie通过在客户端记录信息确定用户身份, Session通过在服务器端记录信息确定用户身份. 但是Session的实现依赖Cookie. sessionId(session的唯一标识需要存放客户端)

不同点:
①, Cookie数据存放在客户端的浏览器上, Session数据存放在服务器上
②, Cookie不是很安全, 别人可以分析存入在本地的Cookie并进行Cookie欺骗, 考虑到安全问题应当使用Session
③, Session会在一定时间内保存在服务器上. 当访问增多, 会比较占用你服务器的性能, 考虑到减轻服务器性能方面, 应当使用Cookie
④, 单个Cookie保存的数据不能超过4K, 很多浏览器都限制一个站点最多保存20个cookie
⑤, 所以个人建议: 将登录信息等重要信息存入在Session中, 其他信息如果需要保留, 可以放到Cookie中

应用场景: 购物车最好使用Cookie, 但是Cookie是可以在客户端禁用的, 这时候我们要使用Cookie+数据库的方式实现, 当Cookie中不能取出数据时, 就从数据库中获取


15, MVC的各个部分都有哪些技术实现

M(Model) 模型 javabean
V(View) 视图 html jsp freemaker
C(Controller) 控制器 Servlet Action

MVC模式的目的就是实现Web系统的职能分工。 Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。 View层用于与用户的交互,通常用JSP来实现。 Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。


16, 数据库

  1. 数据库的分类及常用的数据库
    数据库分为:关系型数据库和非关系型数据库
    关系型: mysql, oracle, sqlserver等
    非关系型: redis, memcache, mogodb, hadoop等

17, 索引使用小技巧?(非常重要)

索引弊端

  1. 占用磁盘空间
  2. 对插入, 修改, 删除操作有影响, 变慢

使用场景:

  1. 肯定在where条件经常使用, 如果不做查询就没有意义
  2. 该字段的内容不是唯一的几个值
  3. 字段内容不是频繁变化

具体技巧

  1. 对于创建的复合索引(多列表索引), 不是使用的第一部分就不会使用索引
    在这里插入图片描述
  2. 对于使用like查询, 查询如果是’%aaa’ 不会使用到索引而’aaa%’ 会使用到索引
    在这里插入图片描述
    所以在使用like查询时, '关键字’的最前面不能使用%或_这样的字符, 如果一定要前面有变化的值, 则考虑使用全文索引框架 sphinx
  3. 如果条件中有or, 有条件没有使用索引, 即使其中有条件带索引也不会使用. 换言之, 就是要求使用的字段必须单独使用索引.
  4. 如果列类型是字段串, 那一定要在条件中将数据使用引号引用起来, 否则不使用索引.
    在这里插入图片描述
    也是就是, 如果列是字符串类型, 无论是字符串还是数字就一定要用’'把它包括起来
  5. 如果mysql使用全表扫描比使用索引快, 则不使用索引</font.(表里面只有一条记录)

18, 数据库优化之读写分离

一台数据库支持的最大并发连接数是有限的, 如果用户并发访问太多. 一台服务器满足不了要求是可以使用集群处理, mysql的集群处理技术最常用的就是读写分离.
在这里插入图片描述

  1. 主从同步
    数据库最终会把数据持久化到磁盘, 如果集群必须确保每个数据库服务器的数据是一致的. 将能改变数据库数据的操作都往主数据库去写, 而其他的数据库从主数据库上同步数据
  2. 读写分离
    使用负载均衡来实现写的操作都往主数据库去, 而读的操作往从数据库去

20, 数据库优化之缓存

在持久层(dao)和数据库(db)之间添加一个缓存层, 如果用户访问的数据已经缓存起来时, 在用户访问时直接从缓存中获取, 不用访问数据库. 而缓存是在操作内存的, 访问速度快.

作用: 减少数据库服务器压力, 减少访问时间

Java中的常用缓存:

  1. hibernate的二级能在, 该缓存不能完分布式缓存.
  2. 可以使用redis(memcahe等)来作为中央缓存, 对缓存数据时行集中处理

21, 有没有使用过redis? redis是什么

  1. redis是一个key-value的nosql数据库, 先存到内存中, 会根据一定的策略持久化到磁盘, 即使断电也不会丢失数据. 支持的数据类型比较多

2 . 主要是用来做缓存数据库的数据和web集群时当做中央缓存存放session


22, 简单说一下redis的使用场景

  1. 缓存:
    把经常需要查询的, 很少修改的数据, 放到读速度很快的空间(内存), 以便下次访问减少时间. 减少压力, 减少访问时间
  2. 计数器
    redis中的计数器是原子性的内存操作, 可以解决库存溢出问题, 进销存系统溢出
  3. session缓存服务器
    web集群时作为session缓存服务器
    在这里插入图片描述
  4. 缓存队列等

23, 简单说一下html5?

html5是最新版本的html, 是在原来的html4的基础上增强了一些标签
html增加了一些像画板, 声音, 视频, web存储等高级功能. 但是html5有一个不好的地方就是html太强调语义了, 导致开发中都不知道要选择哪个标签
例如:在做页面布局时, 无论头部, 主题, 导航等模块都使用div来表示, 但是html5的 规范, 需要使用不同的标签来表示.(header, footer等)


24, 简单说一下css3?

css3是最新版本的css是对css2的功能增强
css3中提供一些原来css2中实现起来比较困难或者不能实现的功能
1, 盒子圆角边框
2, 盒子和文字的阴影
3, 渐变
4, 转换, 移动, 缩放, 旋转等
5,过渡, 动画都可以实现动画
6, 可以使用媒体查询实现响应式网站
css3的最大缺点就是要根据不同的浏览器算是兼容性. 对应有一些处理兼容性的工具, 不用担心


25, bootstrap是什么?

bootstrap是一个移动设备优先的UI框架. 我们可以不用写任何css, js代码就能实现比较漂亮的交互性的页面. 我们程序员对页面的编写是有感伤的, 所以要自己写页面的话就要使用类似bootstrap这样的UI框架

平时用得很多的:
1, 模态框
2, 表单, 表单项
3, 布局
4, 删格系统

猜你喜欢

转载自blog.csdn.net/weixin_39973810/article/details/89174828
今日推荐