<pre cid="n0" mdtype="meta_block" contenteditable="true" class="md-meta-block md-end-block md-focus" style="box-sizing: border-box; overflow-x: hidden; overflow-y: auto; font-family: var(--monospace); font-size: 0.8rem; white-space: pre-wrap; line-height: 1.71429em; min-height: 1.875rem; background: transparent; display: block; width: inherit; margin-top: 1em; color: rgb(85, 85, 85); border: 0px; margin-left: 1em; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">typora-copy-images-to: assets
typora-root-url: assets
</pre>
Java中是如何实现跨平台
Java源文件会编译成.class文件(半编译),这种字节码文件在JVM上运行,JVM将这些文件“翻译”给不同平台(半解释)
Java中数据类型
基本数据类型:4类8种(byte,short,int,long,float,doule,char,boolean)
引用数据类型:数组,类,接口
方法的重写(运行时多态)和重载(编译时多态)
同一个类中,同名不同参的方法,即为重载
子类中,与父类方法同名,同参,同返回值类型,即为重写
什么GC?
GC是垃圾回收机制,在Java中,没有引用的对象,被视为垃圾,JVM会自动调用该对象的finalize方法释放内存,该过程是自动的,所有又称为自动垃圾回收机制
举例:
<pre class="md-fences md-end-block" lang="java" contenteditable="false" cid="n26" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9rem; white-space: pre; line-height: 1.71429em; text-align: left; break-inside: avoid; display: block; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(218, 218, 218); position: relative !important; margin-bottom: 3em; padding-left: 1ch; padding-right: 1ch; margin-left: 2em; width: inherit; color: rgb(31, 9, 9); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">User user = new User();
user = null; // user 没有引用了,变成了垃圾,等待回收</pre>
final,finally,finalize
final修饰属性即为常量,不能修改,final修饰方法不能重写,final修饰类不能集成
finally一般与异常处理相关,用来执行一定要运行的代码,例如回收资源,关闭流等
finalize与GC相关
接口抽象类区别
两者都不能被实例化
接口没有构造器
接口中都是抽象方法和常量
常用的集合有哪些,谈谈对它们的理解?
[图片上传失败...(image-12c41d-1586349569484)]
Collection 接口:单列集合,有两个子接口 1.List 接口: 有三个实现类 LinkedList:基于链表实现,每一个元素存储本身内存地址的同时还存储 下一个元素的地址。链表增删快,查找慢; ArrayList:基于数组;每次增删都要创建新的数组,但数组有索引。数组 增删慢,查找快 Vector:基于数组,线程安全的,效率低 2.Set 接口: 有两个实现类 HashSet:存储的元素无序,不可重复,底层是哈希表 LinkedHashSet:存储的元素有序,不可重复,底层是哈希表和链表的结合
Map 接口:双列集合 有三个实现类(HashMap,HashTable,TreeMap) HashMap:非线程安全,高效,支持 null; LinkedHashMap:是 HashMap 的一个子类,保存了记录的插入顺序 HashTable:线程安全,低效,不支持 null; TreeMap: 能够把它保存的记录根据键排序,默认是键值的升序排序
IO 流
字节流和字符流的区别 1.字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个 或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时。先去查指定的 编码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如:图片,MP3,AVI 视频文件,而字符流只能处理 字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
一些特别的流类型 转换流,转换流只有字节流转换为字符流,因为字符流使用起来更方便,我们只会向更方 便使用的方向转化。如:InputStreamReader 与 OutputStreamWriter。
缓冲流,有关键字 Buffered,也是一种处理流,为其包装的流增加了缓存功能,提高了输 入输出的效率,增加缓冲功能后需要使用 flush()才能将缓冲区中内容写入到实际的物理节 点。但是,在现在版本的 Java 中,只需记得关闭输出流(调用 close()方法),就会自动执 行输出流的 flush()方法,可以保证将缓冲区中内容写入。
对象流,有关键字 Object,主要用于将目标对象保存到磁盘中或允许在网络中直接传输对 象时使用(对象序列化)。
推回输入流,有关键字 PushBack,当程序调用推回输入流的 unread()方法时,系统回把指 定数组内容的内容推回到一个推回缓冲区中,在调用 read()方法读入内容时,就先从推回 缓冲区中读取,直到读完推回缓冲区中内容后才会从原输入流中读取
参考资料: https://www.kancloud.cn/yinzhenn/java/617409
简述下你了解的设计模式
(1) 设计模式的分类设计模式的六大原则 • 开闭原则(Open Closed Principle,OCP) • 里氏代换原则(Liskov Substitution Principle,LSP) • 依赖倒转原则(Dependency Inversion Principle,DIP) • 接口隔离原则(Interface Segregation Principle,ISP) • 合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP) • 最小知识原则(Principle of Least Knowledge,PLK,也叫迪米特法则) 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模 式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合 模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模 式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
(2) 单例模式
1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。
[图片上传失败...(image-9740b9-1586349569484)]
(3) 工厂模式 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行
工厂模式具体详见链接: http://blog.csdn.net/jason0539/article/details/23020989
Get 和 Post 的区别?
Get 请求方式:地址栏里会显示我们提交的数据(不安全),并且地址栏中支持提交少量 数据,请求的数据存在请求行中 Post 请求方式:地址栏里不显示我们提交的数据信息(相对安全),可以提交大量数据, 请求的数据存在请求正文中
cookie 和 session 的区别?
共同点:cookie 和 session 都是用来跟踪浏览器用户身份的会话方式 区别:cookie 数据保存在客户端,保存数据不安全且存储数据量有限; session 数据保存在服务器端,保存数据安全且存储数据量大,session 是基于 cookie 进行 信息处理的 二者的详细流程请访问:http://blog.csdn.net/axin66ok/article/details/6175522
什么是 ajax,为什么要用 ajax(浅谈你对 ajax 的认识),ajax 的最大特点?
Ajax 是一种创建交互式网页应用的的网页开发技术;Asynchronous JavaScript and XML”的缩写 Ajax 的优势:
通过异步模式,提升了用户体验
优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
Ajax 引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量 下的服务器负载。 Ajax 的最大特点: 可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度。 注意:ajax 在实际项目开发中使用率非常高(牢固掌握) 针对 ajax 的详细描述:http://www.jb51.net/article/93258.htm
Cookie 和 Session 以及 Servlet 的生命周期
Cookie:
cookie 的生命周期是累计的,从创建时,就开始计时,20 分钟后,cookie 生命 周期结束。
Session:
session 的生命周期是间隔的,从创建时,开始计时如在 20 分钟,没有访问 session,那么 session 生命周期被销毁 但是,如果在 20 分钟内(如在第 19 分钟时)访问过 session,那么,将重新计算 session 的生命周期 注意:关机会造成 session 生命周期的结束,但是对 cookie 没有影响
Servlet:
init():在 Servlet 的生命周期中,仅执行一次 init()方法。它是在服务器装入 Servlet 时执 行的,负责初始化 Servlet 对象。可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。无论有多少客户机访问 Servlet,都不会重复执行 init()。
service():它是 Servlet 的核心,负责响应客户的请求。每当一个客户请求一个 HttpServlet 对象,该对象的 Service()方法就要调用,而且传递给这个方法一个“请求” (ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在 HttpServlet 中 已存在 Service()方法。默认的服务功能是调用与 HTTP 请求的方法相应的 do 功能。
destroy(): 仅执行一次,在服务器端停止且卸载 Servlet 时执行该方法。当 Servlet 对象 退出生命周期时,负责释放占用的资源。一个 Servlet 在运行 service()方法时可能会产生其 他的线程,因此需要确认在调用 destroy()方法时,这些线程已经终止或完成
请求转发和请求重定向区别
请求转发自始至终只有一个请求,请求重定向有两个
请求转发只能转发站内请求,请求重定向可以站外
请求转发不能看到最终转发资源的地址,请求重定向可以
String,StringBuffer,StringBuilder区别
String代表字符串常量不可改变,每一次修改都创建新的字符串对象
StringBuffer,StringBuilder都代表字符串变量,对其修改不产生新对象,前者是线程安全的(多线程推荐使用),后者不线程安全(单线程推荐使用,效率高于StringBuffer)
(注意:以下线程问题多为一些互联公司才会涉及,在传统的web开发中不算多见,但很多公司会尝试提问,以显示逼格,大家把这部分看看即可,能聊上几句,不要显得没有概念)
参考资料: https://www.kancloud.cn/yinzhenn/java/621055
线程和进程的区别?
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进 行资源分配和调度的一个独立单位
线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比进程更小的可以独立 运行的基本单位
特点:线程的划分尺度小于进程,这使多线程程序拥有高并发性
进程在运行时各自内存单元相互独立,线程之间内存共享,这使多线程编程可以 拥有更好的性能和用户体验
注意:多线程编程对于其它程序是不友好的,占据大量 cpu 资源
启动一个线程是调用 run()方法还是 start()方法?
启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态,这意 味着它可以由 JVM 调度并执行,这并不意味着线程就会立即运行。 run()方法是线程启动后要进行回调(callback)的方法
编写多线程程序的几种实现方式
(1)通过继承 Thread 类
(2)通过实现 Runnable 接口(推荐使用,因为 Java 中是单继承,一个类只有一个父类, 若继承了 Thread 类,就无法在继承其它类,显然实现 Runnable 接口更为灵活
(3)通过实现 Callable 接口(Java 5 之后)
解决多线程安全问题的几种方式?
(1)同步代码块: 在代码块声明上 加上 synchronized
<pre class="md-fences md-end-block" lang="" contenteditable="false" cid="n232" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9rem; white-space: pre; line-height: 1.71429em; text-align: left; break-inside: avoid; display: block; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(218, 218, 218); position: relative !important; margin-bottom: 3em; padding-left: 1ch; padding-right: 1ch; margin-left: 2em; width: inherit; color: rgb(31, 9, 9); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
synchronized (锁对象) {
可能会产生线程安全问题的代码
} </pre>
同步代码块中的锁对象可以是任意的对象;但多个线程时,要使用同一个锁对象才能 够保证线程安全。 (2)同步方法: 在方法声明上加上 synchronized
<pre class="md-fences md-end-block" lang="java" contenteditable="false" cid="n236" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9rem; white-space: pre; line-height: 1.71429em; text-align: left; break-inside: avoid; display: block; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(218, 218, 218); position: relative !important; margin-bottom: 3em; padding-left: 1ch; padding-right: 1ch; margin-left: 2em; width: inherit; color: rgb(31, 9, 9); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
public synchronized void method(){
可能会产生线程安全问题的代码
} </pre>
同步方法中的锁对象是 this 静态同步方法: 在方法声明上加上 static synchronized 静态同步方法中的锁对象是 类名.class (3)同步锁 Lock 接口提供了与 synchronized 关键字类似的同步功能,但需要在使用时手动获取锁 和释放锁。
sleep()和 wait()有什么区别?
1、每个对象都有一个锁来控制同步访问,Synchronized 关键字可以和对象的锁交互,来实 现同步方法或同步块。 sleep()方法正在执行的线程主动让出 CPU(然后 CPU 就可以去执行其他任务),在 sleep 指定时间后 CPU 再回到该线程继续往下执行(注意:sleep 方法只让出了 CPU,而并不会释 放同步资源锁!!!); wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程 得到该资源进而运行,只有调用了 notify()方法,之前调用 wait()的线程才会解除 wait 状 态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify 的作用相当于叫醒睡着 的人,而并不会给他分配任务,就是说 notify 只是让之前调用 wait 的线程有权利重新参与 线程的调度);
2、sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;
3、sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保 持,不会释放对象锁,到时间自动恢复;wait()是 Object 的方法,调用会放弃对象锁,进 入等待队列,待调用 notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,再 次获得对象锁才会进入运行状态;
什么是死锁?
两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两 个进程 都陷入了无限的等待中。