Java面试题总结(基础面试题完结版,java使用教程书

news/2024/7/5 19:31:54 标签: 面试, java, 后端

同理:Collections包也提供了对list和set集合的方法。

Collections.unmodifiableList(List)

Collections.unmodifiableSet(Set)

五、队列和栈是什么?有什么区别?


1、队列先进先出,栈先进后出。

2、遍历数据速度不同。

栈只能从头部取数据 也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性;

队列则不同,他基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影像数据结构,速度要快的多

六、什么是 Java 的内存模型?


在了解什么是 Java 内存模型之前,先了解一下为什么要提出 Java 内存模型。

之前提到过并发编程有三大问题

  • CPU 缓存,在多核 CPU 的情况下,带来了可见性问题

  • 操作系统对当前执行线程的切换,带来了原子性问题

  • 译器指令重排优化,带来了有序性问题

为了解决并发编程的三大问题,提出了 JSR-133,新的 Java 内存模型,JDK 5 开始使用。

简单总结下

  • Java 内存模型是 JVM 的一种规范

  • 定义了共享内存在多线程程序中读写操作行为的规范

  • 屏蔽了各种硬件和操作系统的访问差异,保证了 Java 程序在各种平台下对内存的访问效果一致

  • 解决并发问题采用的方式:限制处理器优化和使用内存屏障

  • 增强了三个同步原语(synchronized、volatile、final)的内存语义

  • 定义了 happens-before 规则

七、既然 volatile 能够保证线程间的变量可见性,是不是就意味着基于 volatile 变量的运算就是并发安全的?


volatile修饰的变量在各个线程的工作内存中不存在一致性的问题(在各个线程工作的内存中,volatile修饰的变量也会存在不一致的情况,但是由于每次使用之前都会先刷新主存中的数据到工作内存,执行引擎看不到不一致的情况,因此可以认为不存在不一致的问题),但是java的运算并非原子性的操作,导致volatile在并发下并非是线程安全的。

八、请谈谈 ThreadLo

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

cal 是怎么解决并发安全的?


java程序中,常用的有两种机制来解决多线程并发问题,一种是sychronized方式,通过锁机制,一个线程执行时,让另一个线程等待,是以时间换空间的方式来让多线程串行执行。而另外一种方式就是ThreadLocal方式,通过创建线程局部变量,以空间换时间的方式来让多线程并行执行。两种方式各有优劣,适用于不同的场景,要根据不同的业务场景来进行选择。

在spring的源码中,就使用了ThreadLocal来管理连接,在很多开源项目中,都经常使用ThreadLocal来控制多线程并发问题,因为它足够的简单,我们不需要关心是否有线程安全问题,因为变量是每个线程所特有的。

九、很多人都说要慎用 ThreadLocal,谈谈你的理解,使用 ThreadLocal 需要注意些什么?


ThreadLocal 变量解决了多线程环境下单个线程中变量的共享问题,使用名为ThreadLocalMap的哈希表进行维护(key为ThreadLocal变量名,value为ThreadLocal变量的值);

使用时需要注意以下几点:

  • 线程之间的threadLocal变量是互不影响的,

  • 使用private final static进行修饰,防止多实例时内存的泄露问题

  • 线程池环境下使用后将threadLocal变量remove掉或设置成一个初始值

十、什么是 XSS 攻击,如何避免?


xss(Cross Site Scripting),即跨站脚本攻击,是一种常见于web应用程序中的计算机安全漏洞。指的是在用户浏览器上,在渲染DOM树的时候,执行了不可预期的JS脚本,从而发生了安全问题。

XSS就是通过在用户端注入恶意的可运行脚本,若服务端对用户的输入不进行处理,直接将用户的输入输出到浏览器,然后浏览器将会执行用户注入的脚本。 所以XSS攻击的核心就是浏览器渲染DOM的时候将文本信息解析成JS脚本从而引发JS脚本注入,那么XSS攻击的防御手段就是基于浏览器渲染这一步去做防御。只要我们使用HTML编码将浏览器需要渲染的信息编码后,浏览器在渲染DOM元素的时候,会自动解码需要渲染的信息,将上述信息解析成字符串而不是JS脚本,这就是我们防御XSS攻击的核心想法。

预防:

1、获取用户的输入,不用innerHtml,用innerText.

2、对用户的输入进行过滤,如对& < > " ’ /等进行转义;

十一、什么是 CSRF 攻击,如何避免?


跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

1、攻击细节

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

例子

假如一家银行用以运行转账操作的URL地址如下:http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName

那么,一个恶意攻击者可以在另一个网站上放置如下代码:

如果有账户名为Alice的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失1000资金。

这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成信息的网站中。这意味着如果服务端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。

透过例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义运行操作。

2、防御措施

检查Referer字段

HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。以上文银行操作为例,Referer字段地址通常应该是转账按钮所在的网页地址,应该也位于www.examplebank.com之下。而如果是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,不会位于www.examplebank.com之下,这时候服务器就能识别出恶意的访问。

这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。

3、添加校验token

由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。

十二、如何实现跨域?说一下 JSONP 实现原理?


1、jsonp原理详解——终于搞清楚jsonp是啥了

2、最流行的跨域方案cors

cors是目前主流的跨域解决方案,跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。

3、最方便的跨域方案Nginx

nginx是一款极其强大的web服务器,其优点就是轻量级、启动快、高并发。

现在的新项目中nginx几乎是首选,我们用node或者java开发的服务通常都需要经过nginx的反向代理。

反向代理的原理很简单,即所有客户端的请求都必须先经过nginx的处理,nginx作为代理服务器再讲请求转发给node或者java服务,这样就规避了同源策略。

十三、在 Java 中,什么时候用重载,什么时候用重写?


1、重载是多态的集中体现,在类中,要以统一的方式处理不同类型数据的时候,可以用重载。

2、重写的使用是建立在继承关系上的,子类在继承父类的基础上,增加新的功能,可以用重写。

3、简单总结:

重载是多样性,重写是增强剂;

目的是提高程序的多样性和健壮性,以适配不同场景使用时,使用重载进行扩展;

目的是在不修改原方法及源代码的基础上对方法进行扩展或增强时,使用重写;

生活例子:

你想吃一碗面,我给你提供了拉面,炒面,刀削面,担担面供你选择,这是重载;

你想吃一碗面,我不但给你端来了面,还给你加了青菜,加了鸡蛋,这个是重写;

设计模式:

cglib实现动态代理,核心原理用的就是方法的重写;

详细解答:

java的重载(overload) 最重要的应用场景就是构造器的重载,构造器重载后,提供多种形参形式的构造器,可以应对不同的业务需求,加强程序的健壮性和可扩展性,比如我们最近学习的Spring源码中的ClassPathXmlApplicationContext,它的构造函数使用重载一共提供了10个构造函数,这样就为业务的选择提供了多选择性。在应用到方法中时,主要是为了增强方法的健壮性和可扩展性,比如我们在开发中常用的各种工具类,比如我目前工作中的短信工具类SMSUtil, 发短信的方法就会使用重载,针对不同业务场景下的不同形参,提供短信发送方法,这样提高了工具类的扩展性和健壮性。

总结:重载必须要修改方法(构造器)的形参列表,可以修改方法的返回值类型,也可以修改方法的异常信息即访问权限;使用范围是在同一个类中,目的是对方法(构造器)进行功能扩展,以应对多业务场景的不同使用需求。提高程序的健壮性和扩展性。

java的重写(override) 只要用于子类对父类方法的扩展或修改,但是在我们开发中,为了避免程序混乱,重写一般都是为了方法的扩展,比如在cglib方式实现的动态代理中,代理类就是继承了目标类,对目标类的方法进行重写,同时在方法前后进行切面织入。

总结:方法重写时,参数列表,返回值得类型是一定不能修改的,异常可以减少或者删除,但是不能抛出新的异常或者更广的异常,方法的访问权限可以降低限制,但是不能做更严格的限制。


http://www.niftyadmin.cn/n/1593639.html

相关文章

struts2+jquery 实现ajax无刷新更新数据

为什么80%的码农都做不了架构师&#xff1f;>>> 前几天为了实现一个struts 的 ajax无刷新更新数据的例子&#xff0c;发现网上资料很少&#xff0c;很多已经过时或者链接都失效了 不过整合他们的资料&#xff0c;加上自己的研究&#xff0c;终于实现了效果 要求&am…

递归重命名文件linux,linux – 如何使用来自Bash的iconv递归重命名文件和文件夹

我认为以下内容可以在一次通过中完成您想要的一切.# Update: if this doesnt work, use read -d insteadfind . -print0 | while IFS read -d $\000 f ;doorig_f"$f"# Below is pure bash. You can replace with tr if you like# f"$( echo $f | tr -d ,\ | tr…

JVM总体概述,java架构师必备技能

JVM字节码 JVM使用Java字节码的方式&#xff0c;作为Java 用户语言 和 机器语言 之间的中间语言。实现一个通用的、 机器无关 的执行平台。 JVM能干什么 基于安全方面考虑&#xff0c;JVM 要求在 class 文件中使用强制性的语法和约束&#xff0c;但任意一门语言都可以转换为被…

MySQL Replication常见错误整理

MySQL Replication常见错误整理 2013-11-06 12:17:39分类&#xff1a; Linux这篇文章旨在记录MySQL Replication的常见错误&#xff0c;包括自己工作中遇到的与网友在工作中遇到的&#xff0c;方面自己及别人以后进行查找。每个案例都是通过Last_IO_Errno/Last_IO_Error或者Las…

linux 性能测试iostat,linux 性能工具之iostat

报告中央处理器(CPU)统计信息和整个系统、适配器、tty 设备、磁盘和 CD-ROM 的输入&#xff0f;输出统计信息。51Testing软件测试网%gkrc8qV"l1R3r语法51Testing软件测试网y8N mn:m(Gf2}ziostat[-s] [-a] [-d|-t] [-T][-m][PhysicalVolume... ] [Interval[Count] ]51Testi…

Kafka发送原理剖析其他生产者参数,2021年字节跳动、阿里等大厂最全Java面试题

这个参数用来指定分区中必须有多少个副本收到这条消息&#xff0c;之后生产者才会认为这条消息时写入成功的。acks是生产者客户端中非常重要的一个参数&#xff0c;它涉及到消息的可靠性和吞吐量之间的权衡。 ack0&#xff0c; 生产者在成功写入消息之前不会等待任何来自服务器…

2.7-mysql主从配置-1

MySQL 主从原理非常简单&#xff0c;总结一下&#xff1a;每个从仅可以设置一个主。主在执行 sql 之后&#xff0c;记录二进制 log 文件&#xff08;bin-log&#xff09;。从连接主&#xff0c;并从主获取 binlog&#xff0c;存于本地 relay-log&#xff0c;并从上次记住的位置…

mysql5,java中级工程师面试

下载下来的文件名是 mysql-installer-community-5.7.24.0.msi 双击文件名称进行安装 如果提示如下错误 说明.NET4.5.2未安装 需要安装此插件 报错窗口有网址 直接安装即可 ![](https://img-blog.csdnimg.cn/20210427122332443.png?x-oss-processimage/watermark,type_ZmFu 《…