Java面试题总结之设计模式、网络基础、常用算法
lipiwang 2024-11-24 18:33 10 浏览 0 评论
一.设计模式
1.单例模式
A.懒汉式
- 单例模式最简单的实现发现,但是不支持多线程,线程不安全
- 如果想线程安全,在方法上加上synchronized就可以,不过这样效率低下,99%情况都不会用到
public class Singleton { private static Singleton instance; public static Singleton getInstance(){ if(instance==null){ instance = new Singleton(); } return instance; } private Singleton() { } }
B.饿汉式
线程安全,没有加锁所以效率高,但是类一加载就初始化,浪费内存
public class Singleton { private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } private Singleton() { } }
C.双重锁
安全且在多线程情况下能保持高性能
public class Singleton { private volatile static Singleton instance; public static Singleton getInstance(){ if(instance==null){ synchronized (Singleton.class){ if(instance==null){ instance = new Singleton(); } } } return instance; } private Singleton() { } }
为什么加双重验证?
因为如果只有第一重验证,线程A,B都通过第一重验证,无论线程A,B哪个获取到了锁对象,对对象进行实例化,释放锁之后,另外一个线程也获取锁对象,也对对象进行实例化,此时,对象就不是单例的了。所以要加双重验证
为什么用要volatile修饰?
volatile主要是保证有序性,禁止重排序的,重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段,在创建对象的时候,也就是new对象的时候,是有三步的,分别是:
1.分配对象内存空间
2.初始化对象
3.设置instance指向刚分配的内存地址
不用volatile禁止重排序,顺序就可能会变成
1.分配对象内存空间
2.最后才初始化对象
当线程A获取锁因为重排序执行顺序变成1,3,2时,执行到3后instance就不为null了,如果此时线程B判断instance!=null,就直接返回了一个没有初始化的对象了,这样线程B有可能会造成程序崩溃
3.设置instance指向刚分配的内存地址(此时对象还未初始化)
2.工厂模式
- 步骤:创建一个接口和实现几个接口的实体类,再定义工厂类,之后就可以编写测试类了,相较于抽象工厂模式简单点
Color
public interface Color { void draw(); }
Green
public class Green implements Color { @Override public void draw() { System.out.println("Green..."); } }
Yellow
public class Yellow implements Color { @Override public void draw() { System.out.println("Yellow..."); } }
Red
public class Red implements Color { @Override public void draw() { System.out.println("Red..."); } }
ColorFactory
public class ColorFactory { public Color getColor(String type){ if(type==null){ return null; } else if(type.equalsIgnoreCase("Yellow")){ return new Yellow(); }else if(type.equalsIgnoreCase("Red")){ return new Red(); }else if(type.equalsIgnoreCase("Green")){ return new Green(); } return null; } }
测试类
public class ColorFactoryDemo { public static void main(String[] args) { ColorFactory factory = new ColorFactory(); Color yellow = factory.getColor("yellow"); yellow.draw(); } }
3.抽象工厂模式
- 相较于工厂模式,较为复杂点
- 步骤:定义多个接口以及接口的实现类,编写抽象工厂类,再编写工厂类,工厂类都是扩展于抽象工厂类,然后再创建一个工厂生成器,之后就可以编写测试类了
shape
public interface Shape { void draw(); }
Color
public interface Color { void fill(); }
Red
public class Red implements Color { @Override public void fill() { System.out.println("Red..."); } }
Rectangle
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Rectangle..."); } }
AbstractFactory
public abstract class AbstractFactory { public abstract Shape getShape(String type); public abstract Color getColor(String type); }
ColorFactory
public class ColorFactory extends AbstractFactory { @Override public Shape getShape(String type) { return null; } @Override public Color getColor(String type) { if(type==null){ return null; }else if(type.equalsIgnoreCase("Red")){ return new Red(); }else if(type.equalsIgnoreCase("Green")){ return new Green(); }else if(type.equalsIgnoreCase("Yellow")){ return new Yellow(); } return null; } }
ShapeFactory
public class ShapeFactory extends AbstractFactory { @Override public Shape getShape(String type) { if(type==null){ return null; }else if(type.equalsIgnoreCase("Square")){ return new Square(); }else if(type.equalsIgnoreCase("Circle")){ return new Circle(); }else if(type.equalsIgnoreCase("Rectangle")){ return new Rectangle(); } return null; } @Override public Color getColor(String type) { return null; } }
FactoryProduct
public class FactoryProduct { public static AbstractFactory getFactory(String factoryname){ if(factoryname.equalsIgnoreCase("Shape")){ return new ShapeFactory(); }else if(factoryname.equalsIgnoreCase("Color")){ return new ColorFactory(); } return null; } }
测试类
public class AbstractFactoryDemo { public static void main(String[] args) { AbstractFactory shapeFactory = FactoryProduct.getFactory("Shape"); Shape rectangle = shapeFactory.getShape("Rectangle"); rectangle.draw(); AbstractFactory colorFactory = FactoryProduct.getFactory("Color"); Color red = colorFactory.getColor("Red"); red.fill(); } }
二.网络基础
1.OSI七层模式从下到上哪七层
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
2.TCP协议、ip协议、Http协议分别在哪一层
- 传输层(tcp、udp协议)
- 网络层(ip协议)
- 应用层(Http协议)
3.TCP协议的3次握手过程
- 第一次握手:客户端给服务器发送一个SYN报文
- 第二次握手:服务端收到客户端发送的SYN报文,会回应一个SYN+ACK报文
- 第三次握手:客户端收到SYN+ACK报文后,会回应一个ACK报文
服务端收到ACK报文后,三次握手建立完成,三次握手目的就是为了建立可靠的通信信道
4.TCP协议的4次挥手过程
- 假如是客户端先发起关闭请求
- 第一次挥手:客户端发送一个FIN报文,报文会指定一个序列号
- 第二次挥手:服务端收到FIN报文,会发送一个ACK报文,且把从客户端接收到的序列号+1作为ACK报文的序列号,表明收到了客户端的报文
- 第三次挥手:如果服务端也想断开连接,和客户端第一次挥手一样,发送FIN报文,且指定一个序列号
- 第四次挥手:客户端收到FIN报文后,一样发送一个ACK报文作为应答,且把从服务端接收到的序列号+1作为自己ACK报文的序列号
- 服务端收到ACK报文后,就处于关闭状态了
5.TCP和UDP区别
- TCP面向连接 UDP面向无连接的
- TCP传输可靠 UDP传输不可靠
- TCP传输速度慢 UDP传输速度快
- TCP偏重量级 UDP偏轻量级
- TCP面向字节流 UD面向报文(数据包)
6.http请求状态码
- 200 成功
- 302 重定向
- 404 请求资源不存在
- 4xx 客户端错误
- 5xx 服务端错误
7.http和https区别
- http是明文传输,https是加密的安全传输
- http端口是80,https端口是443
8.简述浏览器第一次访问网页情况
浏览器A在第一次请求服务器B的时候,服务器B会在服务端创建一个session,并为该浏览器A创建一个Cookie,并在响应时候把这个Cookie一同返回给浏览器A,这样A在请求数据不变的情况下再次请求服务器B的时候会带着这个Cookie,cookie中包含了sessionid,与服务端的session对应
9.cookie和session区别
- 两者都是为了解决http协议无状态的情况
- cookie是存放在浏览器上的,session放在服务器上的
- session依赖sessionid,而sessionid是存在cookie中的
- cookie放在本地,别人可以分析存放在本地的cookie进行cookie欺骗,所以安全性不如cookie
- 单个cookie保存数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
10.get和post区别
- get请求在URL中传送参数有长度限制,post则没有
- get请求参数在URL可见,post请求参数不可见
- 从可见性上来看,post请求比起get请求安全的多
- get请求是可以缓存的,post请求不可以缓存(get一般是信息获取之类的,post是信息修改添加之类的,所以get不需要每次获取都去找数据库)
11.重定向和转发区别
- 重定向浏览器URL地址栏改变,转发浏览器URL地址栏不变
- 重定向是两次请求,转发是一次请求
- 重定向后传输的信息会丢失(request),转发传输的信息不会丢失
- 重定向速度不如转发
转发一般用于用户登陆,根据角色转发到相应的模块
重定向一般用于用户注销登陆时返回主页面和跳转到其它的网站等
- 为什么说重定向是两次请求,转发是一次请求?
转发过程:
用户首先发送一个请求到服务端,服务端执行servlet后,调用getRequestDispacther方法,把请求转发给指定的xxx,整个流程都在服务端完成的,所以说转发是一次请求
重定向过程:
用户首先发送一个请求到服务端,服务端执行servlet后,调用sendRedirect方法,这个方法是response,所以是向客户端返回这个响应,响应告诉客户端需要再发送一个请求,紧接着客户端收到这个请求立即发出一个新的请求,去请求新的地址,这里两个请求互不干扰,相互独立,所以request会失效,所以说重定向是两次请求
12.servlet和jsp区别
- jsp经过编译后就成为了Servlet
- jsp是java和html组成成一个扩展名为jsp的文件,所以jsp侧重视图
- servlet完全从表示层的html里分离开的,servlet侧重控制逻辑(Servlet类似于Controller,用来做控制)
13.传统api和restful api区别
传统api是用URL来描述行为的(看URL就知道要干啥),不管成功失败都会返回200和一段json,只是可能表示是错误的json
restfulapi是用HTTP方法描述行为,用URL描述资源,使用json交互数据,使用HTTP状态码来表示不同的结果
14.jsp九大内置对象和四大作用域
九大内置对象:request、response、pageContext、session、application、out、config、page、exception
四大作用域:page(当前页面有效)、request(当前请求有效)、session(当前会话有效)、application(当前应用有效)
三.常用算法
1.排序算法
A.选择排序
B.冒泡排序
C.快速排序
2.手动实现一个ArrayList
最后
欢迎大家有兴趣的可以关注我的公众号【java小瓜哥的分享平台】,文章都会在里面更新,还有各种java的资料都是免费分享的。
- 上一篇:java基础面试题
- 下一篇:90%的面试官都会提的java100+面试题
相关推荐
- 前端入门——css 网格轨道详细介绍
-
上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...
- Islands Architecture(孤岛架构)在携程新版首页的实践
-
一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...
- HTML中script标签中的那些属性
-
HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...
- CSS 中各种居中你真的玩明白了么
-
页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...
- CSS样式更改——列表、表格和轮廓
-
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...
- 一文吃透 CSS Flex 布局
-
原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...
- css实现多行文本的展开收起
-
背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...
- css 垂直居中的几种实现方式
-
前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...
- WordPress固定链接设置
-
WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...
- 面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿
-
前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...
- 3种CSS清除浮动的方法
-
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...
- 2025 年 CSS 终于要支持强大的自定义函数了?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...
- css3属性(transform)的一个css3动画小应用
-
闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...
- CSS基础知识(七)CSS背景
-
一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...
- CSS 水平居中方式二
-
<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)