面试题-1

1.栈是后进先出的 队列是先进先出的
栈具有记忆作用
栈可以顺序存储,也可以链式存储
栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针

  1. 接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。
    Java语法中,使用interface定义一个接口,使用class定义一个类,使用关键字abstract + class定义一个抽象类。
    抽象类可以实现接口
    抽象类可以继承实体类,因为抽象类中不仅可以有抽象方法,也可以有非抽象方法,抽象类继承了实体类则即包括自己的抽象方法也包括了继承来的非抽象方法

3 存储空间不一定连续,且各元素的存储顺序是任意的
在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域,另一部分用于存放指针,称为指针域。其中指针用于指向该结点的前一个或后一个结点(即前件或后件)。
链式存储方式既可用于表示线性结构,也可用于表示非线性结构。
线性顺序表需要在内存中开辟一块连续的区域,因此存储的数据在内存中的状态是连续的,而线性链表在内存中的存储是随机的,数据之间的连接靠的是指针。

  1. 向一个无序数组中插入一个数据项,不管已有多少数据项都花费同样的时间。
    无序数组的插入是一个与数组中的数据项个数无关的算法。新数据项总是被放在下一个有空的地方,无论数组中的数据项个数N有多大,一次插入总是用相同的时间。

  2. 在数据偏向查找操作的时候用有序数组快一些,在数据偏向插入的时候,无序数组好一些。删除操作效率一样。

  3. 方法重载 方法重载要求方法名称必须相同,重载方法的参数列表必须不一致,一个方法在所属的类中只能被重载多次。

  4. 简单排序算法包括
    冒泡排序 遍历若干次要排序的数列,每次遍历时,它都会从前往后依次比较相邻两个数的大小;
    选择排序 起始–在未排序的数列中找到最大(小)值,然后将其存放到数列的起始位置;过程–接着再从剩余未排序的元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。目标–以此类推,直到所有的元素均排序完毕
    快速排序选择一个基数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据比另外一部分的所有数据都要小。然后,再按此方法对这两部分的数据进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

8.简单排序算法中的两个基本操作是 比较 数 据项和 交换 数据项(或 复制)

9.哈夫曼树专用于压缩和解压缩文本。

10.提供创建对象能力 但屏蔽了对象创建的细节和复杂过程的设计模式是建造者模式

11.创建一个固定数量为5的线程池
ExecutorService pool = Executors.newFixedThreadPool(5);

12.如何将一个线程设置成守护线程 setDaemon(boolean on)

13.线程同步(7种同步方法)
1、同步方法 2、同步代码块3、使用特殊域变量(volatile)实现线程同步4:使用重入锁实现线程同步5.使用局部变量实现线程同步6.使用阻塞队列实现线程同步7.使用原子变量实现线程同步

14.如果想在java虚拟机关闭前做点事情 可以注册一个钩子线程 代码怎么写
Runtime.getRuntime().addShutdownHook(new MyShutdownHook());

15.java里实现一个定时任务程序 可以选择
普通thread
用Timer和TimerTask
ScheduledExecutorService(定时任务接口、调度线程池)

16.在Java中,使用ThreadLocal定义线程变量。

17.与流式的 I/O 不同,NIO是基于块(Block)的,它以块为基本单位处理数据。在NIO中,最为重要的两个组件是缓冲 Buffer 和通道 Channel 。缓冲是一块连续的内存块,是 NIO 读写数据的中转地。通道表示缓冲数据的源头或者目的地,它用于向缓冲读取或者写入数据,是访问缓冲的接口。

18.java nio的三个关键词
buffer(缓存)
channel(通道)
selector(选择器)

19.根据对象的存活周期 一般把java堆分为新生代和老年代

20.堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用

21.java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

if(request instanceof HttpServletRequest){
System.out.println("-------------");
}

22.throwable和exception的区别:
1、throwable是父类,exception是子类。
2、throwable是根基,exception是从throwable派生出来的。
3、throwable中包括exception(异常)和error(错误)。

23. HTTP 请求报文在这里插入图片描述
HTTP 响应报文
在这里插入图片描述

24.web网站常见的受攻击方式和解决办法
一.跨站脚本攻击(XSS)

跨站脚本攻击(XSS,Cross-site scripting)是最常见和基本的攻击WEB网站的方法。攻击者在网页上发布包含攻击性代码的数据。当浏览者看到此网页时,特定的脚本就会以浏览者用户的身份和权限来执行。通过XSS可以比较容易地修改用户数据、窃取用户信息,以及造成其它类型的攻击,例如CSRF攻击
常见解决办法:确保输出到HTML页面的数据以HTML的方式被转义
二. 跨站请求伪造攻击(CSRF)
跨站请求伪造(CSRF,Cross-site request forgery)是另一种常见的攻击。攻击者通过各种方法伪造一个请求,模仿用户提交表单的行为,从而达到修改用户的数据,或者执行特定任务的目的。为了假冒用户的身份,CSRF攻击常常和XSS攻击配合起来做,但也可以通过其它手段,例如诱使用户点击一个包含攻击的链接
解决的思路有:
1.采用POST请求,增加攻击的难度.用户点击一个链接就可以发起GET类型的请求。而POST请求相对比较难,攻击者往往需要借助javascript才能实现
2.对请求进行认证,确保该请求确实是用户本人填写表单并提交的,而不是第三者伪造的.具体可以在会话中增加token,确保看到信息和提交信息的是同一个人
三.Http Heads攻击
凡是用浏览器查看任何WEB网站,无论你的WEB网站采用何种技术和框架,都用到了HTTP协议.HTTP协议在Response header和content之间,有一个空行,即两组CRLF(0x0D 0A)字符。这个空行标志着headers的结束和content的开始。“聪明”的攻击者可以利用这一点。只要攻击者有办法将任意字符“注入”到headers中,这种攻击就可以发生

以登陆为例:有这样一个url:

http://localhost/login?page=http%3A%2F%2Flocalhost%2Findex

当登录成功以后,需要重定向回page参数所指定的页面。下面是重定向发生时的response headers.

HTTP/1.1 302 Moved Temporarily
Date: Tue, 17 Aug 2010 20:00:29 GMT
Server: Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
Location: http://localhost/index

假如把URL修改一下,变成这个样子:

http://localhost/login?page=http%3A%2F%2Flocalhost%2Fcheckout <script>alert('hello')<%2Fscript>

那么重定向发生时的reponse会变成下面的样子:
HTTP/1.1 302 Moved Temporarily
Date: Tue, 17 Aug 2010 20:00:29 GMT
Server: Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
Location: http://localhost/checkout

这个页面可能会意外地执行隐藏在URL中的javascript。类似的情况不仅发生在重定向(Location header)上,也有可能发生在其它headers中,如Set-Cookie header。这种攻击如果成功的话,可以做很多事,例如:执行脚本、设置额外的cookie(Set-Cookie: evil=value)等。
避免这种攻击的方法,就是过滤所有的response headers,除去header中出现的非法字符,尤其是CRLF。
服务器一般会限制request headers的大小。例如Apache server默认限制request header为8K。如果超过8K,Aapche Server将会返回400 Bad Request响应:
对于大多数情况,8K是足够大的。假设应用程序把用户输入的某内容保存在cookie中,就有可能超过8K.攻击者把超过8k的header链接发给受害者,就会被服务器拒绝访问.解决办法就是检查cookie的大小,限制新cookie的总大写,减少因header过大而产生的拒绝访问攻击
四.Cookie攻击
通过Java Script非常容易访问到当前网站的cookie。你可以打开任何网站,然后在浏览器地址栏中输入:javascript:alert(doucment.cookie),立刻就可以看到当前站点的cookie(如果有的话)。攻击者可以利用这个特性来取得你的关键信息。例如,和XSS攻击相配合,攻击者在你的浏览器上执行特定的Java Script脚本,取得你的cookie。假设这个网站仅依赖cookie来验证用户身份,那么攻击者就可以假冒你的身份来做一些事情。
现在多数浏览器都支持在cookie上打上HttpOnly的标记,凡有这个标志的cookie就无法通过Java Script来取得,如果能在关键cookie上打上这个标记,就会大大增强cookie的安全性
五.重定向攻击
一种常用的攻击手段是“钓鱼”。钓鱼攻击者,通常会发送给受害者一个合法链接,当链接被点击时,用户被导向一个似是而非的非法网站,从而达到骗取用户信任、窃取用户资料的目的。为防止这种行为,我们必须对所有的重定向操作进行审核,以避免重定向到一个危险的地方.常见解决方案是白名单,将合法的要重定向的url加到白名单中,非白名单上的域名重定向时拒之,第二种解决方案是重定向token,在合法的url上加上token,重定向时进行验证.
六.上传文件攻击
1.文件名攻击,上传的文件采用上传之前的文件名,可能造成:客户端和服务端字符码不兼容,导致文件名乱码问题;文件名包含脚本,从而造成攻击.
2.文件后缀攻击.上传的文件的后缀可能是exe可执行程序,js脚本等文件,这些程序可能被执行于受害者的客户端,甚至可能执行于服务器上.因此我们必须过滤文件名后缀,排除那些不被许可的文件名后缀.
3.文件内容攻击.IE6有一个很严重的问题 , 它不信任服务器所发送的content type,而是自动根据文件内容来识别文件的类型,并根据所识别的类型来显示或执行文件.如果上传一个gif文件,在文件末尾放一段js攻击脚本,就有可能被执行.这种攻击,它的文件名和content type看起来都是合法的gif图片,然而其内容却包含脚本,这样的攻击无法用文件名过滤来排除,而是必须扫描其文件内容,才能识别。

25.在Java中 不可以覆盖static方法和private方法

26.如果对象的引用被置为null,垃圾收集器不会立即释放对象占用的内存?
不会,在下一个垃圾回收周期中,这个对象将是可被回收的。

27Java中Class.forName和classloader都可以用来对类进行加载。

a).Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。

b).而classloader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

c).Class.forName(name,initialize,loader)带参数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象。

28.服务端先设置cookie信息,并在客户端请求时把这个cookie信息发送给客户端,客户端会自动保存cookie的key/value值,下次向服务端发送请求时,客户端会自动带上cookie信息,服务端会根据cookie信息来识别状态。

29.final关键字不能用来抽象类和接口。

30.java接口的方法默认都是public abstract类型,
因此我们在编写接口的实现类的时候,方法的实现前面要显式的加上public访问控制符

猜你喜欢

转载自blog.csdn.net/qq_38623722/article/details/89609933