最近想做些总结,方便以后知识点回顾,同时为小白面试做基础。。。。。
1.java跨平台原理
jvm也是一个软件,不同的平台有不同的版本,我们编写的java源码,编译后生成一种.class文件,即字节码文件。
java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行,也就是说只要在不同的平台上安装对应的jvm,
就可以运行字节码文件,运行我们编写的java程序。通过jvm这个中间层,真正的实现了"一次编译,到处运行"的目的。
跨平台的是java程序,不是jvm。jvm是用C/C++开发的,是编译后的机器码,不能跨平台,不同的平台需要安装不同版本的jvm。
2.java中的int占几个字节
4个字节 注意 char 占2个字节; Boolean 一个字节(1位)
3.java面向对象的特征
封装 ,抽象,继承,多态
封装:在面向对象语言中,封装特性是由类来体现的,通过private将属性私有化,在提供公开的set/get方法,供外界访问。
抽象:抽象就是将一类实体的共同特性抽象出来,封装在一个抽象类中,所以抽象在面向对象语言中是由抽象类来体现的。
继承:继承就像我们现实生活中的父子关系,儿子可以遗传父亲的一些特征,在面向对象语言中,就是一个类可以继承另一
个类的一些特性,从而实现代码重用。
多态:多态就是父类对象引用不同的子类对象从而表现不同的行为。
4.包装类和基本数据类型
包装类:是基本数据类型的强化,有方法和属性供我们使用。可以为null.
基本数据类型:没有方法和属性,不能为null。
装箱和拆箱:
基础类型是数据,不是对象,也不是Object的子类。
装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装类转换为基本数据类型。
基本数据类型 除了char 和 int 外,其他包装类都是基本数据类型首字母大写。
char(基本数据类型) ----->Integer(包装类)
int ----->Integer
装箱:Integer a = Integer .valueOf(123);
拆箱:int b = a.intValue();
5.==与equals的区别
关于==
1.基本数据类型,也称原始数据类型。byte,short,int,char,int,long,float,double,boolean它们之间的比较,应用双等号,
比较的是它们的值.
2.复合数据类型(类)当它们用==进行比较的时候,比较的是它们在内存中的存放地址。
equals
java语言的equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是equals的.
6.String,StringBuilder,StringBuffer的区别
1.运行速度:StringBuilder>StringBuffer>String
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改
的。但后两者的对象时变量,是可以改变的。可以用append方法追加,java中对String对象进行的操作实际上是一个不断创建
新的对象并且将旧的对象回收的一个过程,所以执行速度很慢,而StringBuilder和StringBuffer的对象是变量,对变量进行操
作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
2.线程安全:StringBuilder是线程不安全的,StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StirngBuffer中很多方法可以带有synchronized关键字,
所以可以保证线程时安全的,但StringBuilder的的方法则没有该关键字,所以不能保证线程安全,有可能出现一些错误的操
作。所以如果进行的操作是多线程的,使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder
3.使用场景
String 适用于少量的字符串操作的情况
StringBuilder 适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer 适用于多线程下在字符缓冲区进行大量操作的情况
7.java中的集合
java集合分为value(Collection)和key-value(Map)两种;
存储value的有list和set两种:
list:有序,可以重复
set:无序,不可重复
存储为key-value是:map,HashMap,Hashtable,LinkedHashMap,CurrentHashMap
8.ArrayList,vector和LinkedList
1>区别
● ArrayList,vactor都是以类似数组的形式存储在内存中,LinkedList则以链表的形式存储。
●Vector线程同步,ArrayList,LinkedList线程不同步。
●LinkedList增删快,查询慢;ArrayList,Vector查询快,增删慢。
●Vector默认扩充为原来的两倍,(每次扩充空间的大小是可以设置的),而ArrayList默认扩充为原来的1.5倍,因此ArrayList更
节省空间。
2>联系
●ArrayList,Vector,LinkedList类均在java.util包中,都是可以改变大小的。
●ArrayList和Vetor都是基于存储元素的Object[] array 来实现的,它们会在内存中开辟一块连续的空间来储存,由于
数据存储是连续的,因此,它们支持索引来访问元素,同时索引数据的速度比较快。但是在插入元素时需要移动容器中
的元素,所以对数据的插入操作执行速度慢。ArrayList和Vector都有一个初始化的容量大小,当里边存储的元素超过
这个大小时就需要动态地扩充它们的存储空间。
9.序列化
序列化一般是指把结构化的对象变成无结构的字节流,便于存储和传输。
首先序列化并不是java所独有的,基本所有编程语言都提供了序列化的方式,序列化是编程的一种解决问题的方式。java序
列化就是将对象按照某种协议格式(某种约定的方式)放入一个buffer中,其目的是便于网络传输或持久存储。反序列化,就
是将序列化后的buffer按照序列化时还原成原来的对象,这样程序就能直接使用还原的对象了。
简单的说:序列化就是将对象输出到外界,反序列化就是将外界或磁盘中的对象加载到内存中。
10.实现一个拷贝文件的工具类要使用字节流还是字符流
使用字节流,因为我们 要拷贝的文件不确定里面是否全是字符,如果文件中包含图片之类的字节时,就需要使用字节流,所以我们一般用字节流
拷贝文件。
11.线程的实现方式,怎么启动线程,怎么区分线程
◇继承Thread类(不推荐)
◇实现Runnable接口
◇实现java.util.Concurrent下的Callable接口
启动线程
◇调用start()方法(调用start()方法,是使得线程处于可运行状态,线程不一定会执行。)
区分线程
◇给线程设置名字
12.Io和Nio
io nio
面向流 面向缓冲
阻塞io 非阻塞io
无 选择器
13.设计模式和常用的设计模式(选择自己熟悉的说,最好能手写)
设计过程中可以反复使用的,可以解决特定问题的通用模版:
●创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。
●结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
● 行为型模式(11种):策略模式,模版方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,
状态模式,访问者模式,中介者模式,解释器模式。
14.http,get.post请求的区别
1>get请求。请求的数据会附加在url之后,以?分割url和传输数据,多个参数用&连接,get请求不安全。url的编
码格式采用的是ASCII编码,而不是uniclde,既是说所有的非ASCII字符都要编码之后再传输。
post请求:post请求会把请求的数据放在请求体中,因此post请求相对安全,
2>传输数据的大小
在http规范中,没有对url的长度和传输数据大小的限制。但在实际的开发中,对于get请求,特定的浏览器和服务器对
url的长度有限制。因此,在使用get请求时,传输数据会受到url长度的限制。
对于post,由于不是url传值,理论上是不会受到限制的,但实际上服务器会规定对post提交数据大小进行限制,Apache,
IIS都有各自的配置。
3>安全性
post的安全性比get高
15.说说你对servlet的理解
就是一个运行在web服务器上的一个小的java程序,用于接收和响应从客户端发过来的请求,通常使用Http协议,
使用:1、编写一个java类继承HttpServlet类(或实现servlet接口)。2、把开发好的java类部署到web服务器中。
按照一种约定俗成的称呼习惯,通常我们把实现了servlet接口的java程序,称为servlet。
16.servlet的生命周期
默认用户第一次访问servlet的时候,服务器会创建一个Servlet实例,那么Servlet中的init方法就会执行,任何一次请求
服务器都会创建一个新的线程访问Servlet中的service方法。在service方法内部根据请求的方式的不同调用doXXX的方法(
get请求调用doGet方法,post请求调用doPost方法)。当Servlet从服务器中移除或者关闭服务器,servlet的实例就会被销
毁,那么destroy方法就会执行。
为什么说默认是用户第一次访问servlet时服务器会创建一个servlet实例:
如果我们在web.xml中配置了<load-on-startup></load-on-startup>
没有配置或者为负数时是第一次访问时创建servlet,如果是正数或0,则在服务器启动时创建servlet。
17.servlet中forward和redirect的区别
重定向(redirect)其实是两次请求,响应的结果是告诉浏览器去请求另一个页面,你会发现地址栏的地址发生了变化。在重
定向过程中,request域中的信息会丢失。
请求转发(forward)是服务器内部把对一个request/response的处理权移交给另一个,对于客户端而言,它们只知道自己最早
请求的那个A,而不知道中间的B,甚至C、D。传输的信息不会丢失。
18.jsp和servlet的相同点和不同点
相同点:
jsp是servlet技术的扩展,本质上是servlet的简易方式,更强调应用的外表表达。
jsp编译后是servlet类。
不同点:
1>servlet的应用逻辑是在java文件中,并且完全从表示层中的html里分离开来,servlet如果要实现HTML功能,必须使用
write输出对应的html
2>jsp是java和html可以组合成一个扩展名为.jsp的文件。做界面展示比较方便,而嵌入逻辑复杂,
3>jsp侧重视图,servlet主要用于控制逻辑。
19.jsp内置对象和四大作用域及页面传值
jsp9大内置对象
内置对象 类型
request HttpServletRequest
response HttpServletResponse
session HttpSession
application HttpServletContext
config ServletConfig
exception Throwable
page Object(this)
out jspWriter
pageContext PageContext
四大作用域及作用范围
域 范围
page域 只能在当前jsp页面使用
request域 只能在同一个请求中使用
session域 只能在同一个会话中使用
servletContext域 在同一个web应用中使用
20.session和cookie的区别和使用场景
Session和cookie都是会话跟踪技术,cookie通过在客户端记录信息确定用户身份,而session是通过在服务器端记录信息确
定用户身份。但是session的实线依赖于cookie机制来保存JESESSIONID(session的唯一标识,需要存在客户端)。
区别:
1>cookie的数据存储在客户端,session的数据存储在服务器上。
2>cookie不是很安全,别人可以通过分析存放在本地的cookie进行cookie欺骗,考虑到安全应该使用session。
3>session会在一定时间内保存在服务器上,当访问增多时,会影响服务器的性能,考虑到服务器的性能,应当使用cookie
4>单个cookie保存数据不能超过4k,很多浏览器显示一个站点最多保存20个cookie
5>将重要信息保存在session中(登录),将其它需要保留的信息存放在cookie中(购物车。cookie是可以在客户端禁用的,
这时候要使用cookie+数据库的方式实现购物车)。
21.MVC模式和MVC各部分的实现
MVC的全名Model View Controller,是模型-视图-控制器的缩写,是一种软件设计典范,低耦合。
Struts2的MVC:jsp-->StrutsPrepareAndExecuteFilter(前端控制器,核心控制器)+action-->javabean-->result
22.数据库分类和常用数据库
关系型数据库:Mysql,oracle,sql Server,IBM Db2,Sybase
非关系数据库:Redis、Memcached,MongoDB,Hadoop
23.事务的特征
事务是并发控制的单位,是用户定义的一个操作序列。这些操作要么全部成功,要么全部失败,是一个不可分割的工作单位。
事务的四大特征:ACID
1.原子性(Atomicity):事务是最小的操作单元,表示事务内不可分割,要么全部成功,要么全部失败。
2.一致性(Consistency):要么全部成功,要么全部失败。失败了,要对前面的操作进行回滚。即事务完成时数据由一种
一致性状态到另一种一致性状态。
3.隔离性(Isolation):一个事务开启了,不能受其它事务的影响
4.持久性(Durability):事务执行完毕,对数据的修改永久的保存在磁盘中。
不考虑事务的隔离性引发的一系列安全问题
脏读:一个事务读到另一个事务未提交的数据。
不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致在一个事务中多次查询结果
不一致。
虚读/幻读:一个事务读到了另一个事务已经提交的insert的数据,导致在一个事务中多次查询的结
果不一致。
数据库中提供了事务的隔离级别用于解决三类读问题。
read uncommitted(未提交读): 未提交读,脏读,不可重复读,幻读都有可能发生
read committed(已提交读): 解决了脏读,但不可重复读,幻读都有可能发生
repeatable read(可重复读):解决了脏读,不可重复读。但幻读有可能发生
serializable(串行化):解决了脏读,不可重复读,幻读的发生
安全性:serializable>repeatable read > read committed >read uncommitted
效率性:read uncommitted> read committed > repeatable read > serializable
默认隔离级别:
mysql--->repeatable read
Oracle--->read committed
24.简单说一下你对JDBC的理解
java database Connection Java数据库连接,数据库关系系统很多,每个数据库关系管理系统支持的命令是不一样的,java
只定义接口,让数据库厂商自己实现接口,对于开发人员而言,只需要导入对应厂商开发的实线即可。
然后以接口的方式进
行调用(mysql+mysql驱动+jdbc)
25.jdbc中PreparedStatement比statement的好处
preparedStatement可以防止sql注入攻击,它是预编译的。
26.数据库连接池的作用
1.限定数据库的连接个数,不会由于数据库连接过多导致系统运行缓慢或崩溃。
2.数据库连接不需要每次都创建或销毁,节约资源。
3.数据库连接不需要每次都去创建,响应时间更快。
27.简答说一下html,css,javaScript在网页开发中的定位
Html超文本标记语言,定义网页的结构
Css层叠样式表,用来美化页面
javaScript主要用来校验表单,做动态交互。
28.简单介绍一下ajax
ajax是:异步的javaScript和xml
作用是:通过ajax与服务器进行数据交换,ajax可以使网页实现拒不更新,这意味着可以在不重新加载
整个网页的情况下,对网页的部分进行更新。
怎样实现:ajax,可以异步向服务器发送请求,获取相应,完成局部更新。
使用场景:登录失败时不跳转页面,注册时提示用户名是否存在,二级联动等等。
29.js和JQuery的关系
jQuery是一个js框架,封装了js的属性和方法,并且增强了js的功能,让用户使用起来更加便利,并且
增强了js的功能。
原来是使用js是要处理很多兼容性问题(比如注册事件等),由jQuery封装了底层,就不用处理兼容性问题。
原生的js的dom和事件绑定和ajax等操作非常麻烦,jQuery封装了以后,操作非常方便。
30.jquery中常用的选择器
ID选择器 Class选择器 标签选择器 通用选择器 层次选择器 属性选择器
31.jquery中的ajax和原生js实现的ajax的关系
jquery中的ajax也是通过原生的js封装的,封装后让我们使用起来更加便利,不考虑底层实现或兼容性
等的处理。
如果采用原生的js实现ajax是非常麻烦的,并且每次都是一样的,如果我们不使用jquery,我们也要封
装对象的方法和属性,
有像jquery这些已经封装完成,经过很多企业实践过的框架,比较可靠,我们不需要封装,直接使用成
熟的框架即可。
32.什么是框架
框架(Framework)是一个框子---具有约束性-----具有支撑性,
IT语境中的框架,特指为解决一个开放性问题而设计的具有一定约束的支撑架构,在此结构上可以根据
具体问题扩展,安插
更多的组成部分,从而更迅速和更方便的构建完整的解决问题的方案。
●框架本身一般不完整到可以解决特定的问题,但是可以帮助我们快速解决特定的问题
●框架天生就是为了扩展而设计的
●框架里面可以为后续扩展的组件提供很多的辅助性,支撑性的方便易用的使用工具,也就是说框架时
常配套一些帮助解决某类问题的库或工具。
33.Struts2的执行流程或Struts2的原理
1.浏览器发送请求,经过一系列的过滤器filter,到达StrutsPrepareAndExecuteFilter
2.StrutsPrepareAndExecuteFilter通过ActionMapper判断当前的请求是否需要某个Action处理,如果不
需要,则走原来的流程,如果需要,把请求交给ActionProxy来处理
3.ActionProxy通过Configuration Manager询问框架的配置文件Struts.xml,找到需要调用的Action类。
4.创建一个ActionInvocation实例,来调用Action的对应方法来获取结果集的name,在调用前后会执行相
关拦截器。
5.通过结果集的name找到对应结果集来对浏览器进行响应。
34.Struts2的拦截器是什么
通过动态配置方式,可以在执行Action的方法前后,加入相关逻辑,完成业务,Struts2中的功能,
都是通过系统拦截器实现的,比如参数处理,文件上传,字符编码,当然,我们也可以自定义拦截
器
使用场景:用户登录判断,在执行Action的前面判断是否已经登录,如果没有登录则跳转到登录页
面,用户权限的判断,在执行Action的前面判断是否具有权限,如果没有给出提示信息。
35.AOP是什么?都用它做什么?
AOP:面向切面编程
核心原理:使用动态代理的方式在执行前后或出现异常后做加入相关逻辑。
用途:
事务处理 在执行方法前,开启事务,执行方法后提交事务,出现异常后回滚事务。
权限判断 在执行方法前,判断是否具有事务
日志记录 在执行方法前执行日志
36.ORM是什么?ORM框架是什么?
对象关系映射(Object Relational Mapping简称ORM)模式是一种为了解决面向对象与关系型数据库存在的互
不匹配的现象的技术。简单地说,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久
化呢?
一种简单的方法是采用硬编码的方式(jdbc操作数据库),为每一种可能的数据库访问操作提供单独的方法,
这种方法存在很多缺陷,所以使用ORM框架(为了解决面向对象与关系型数据库存在的互不匹配的现象的
框架)来解决。
java典型的ORM框架有:Hibernate ,mybatis
37.mybatis和Hibernate有什么不同
相同: 都是java中的ORM框架,屏蔽jdbc的api底层访问细节,使我们不用与jdbc挨个打交道,就可以完成对数据
的持久化操作,jdbc的api编程流程固定,还将sql与java代码混在一起,经常需要拼凑sql语句,细节繁
琐,开发不方便。
Mybatis的好处:屏蔽jdbcapi的底层访问细节,将sql语句与java代码分离,提供将结果集自动封装为实
体对象和对象集合的功能,queryForList返回单个对象,提供自动将实体对象的属性传递给
sql语句的参数。
Hibernate的好处:hibernate是一个基于jdbc的主流持久化框架工具,他可以自动生成sql语句,执行并
返回java结果。
不同点:
1.hibernate要比mybatis功能强大很多,因为hibernate自动生成sql语句
2.mybatis需要我们自己在xml配置文件中写sql语句,hibernate我们无法直接控制该语句,我们就
无法写特定的高效的sql语句对于一些不太复杂的sql查询,hibernate可以帮助我们很好的完成,
但是对于特别复杂的查询,hibernate就很难适应了,这时候用mybatis就是不错的选择,因为
mybatis还是由我们自己编写sql语句,mybatis可以处理复杂的sql语句,而hibernate不能。
3.Mybatis要比hibernate简单的多,Mybatis是面向sql的,不用考虑对象间一些复杂的映射关系。
38.hibernate对象状态及其转换
瞬时态:刚new的,没有持久化,不在session中
持久态:session中的持久化对象
脱管态:不在session中的持久化对象
39.Linux的使用场景
Linux是一个长时间运行比较稳定的操作系统,所以我们一般会拿他作为服务器(web,db,app等)。
Linux本身具有c的编译环境,我们的一些软件是没有软件包的(redis,nginx),需要在Linux编译得到软件包
Linux常用的命令:
cd跳转目录
pwd获取当前路径
Su切换账户
LI查看当前目录下的文件和目录
Rm-rf删除文件
Vi修改文件
MV移动/重命名 文件或文件夹
Mkdir创建文件夹
Rm-f删除文件夹
Tar打包/解压
Grep查找想要的信息
40.与App段对接时需要注意什么
和App段对接,需要知道对方需要什么样的数据,以及接口的请求方式,返回值类型等。
41.Http和HTTPS
Http:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),
用于从www服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
Https:是以安全为目的http通道,简单的讲是http的安全版,即Http下加入ssl层,Https的安全基础是
SSL,因此加密的详细内容就需要SSL。
https 协议主要作用分为两种:1.建立一个信息安全通道,来保证数据传输的安全2.确认网站的真实性
区别:
1.https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2.http是超文本传输协议,信息是文明传输,HTTPS则是具有安全性的SSL加密传输协议。
3.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443.
4.http的连接很简单,是无状态的;https协议是由SSL+http协议构建的可进行加密传输,身份认证的
网络协议,比http协议安全。
42.安全问题(别的网站使用爬虫技术爬你的网站怎么办)
单位时间内请求次数超过某个阀值就让输入验证码,可以极大降低抓取的速度,如果多次超过某个阀值
可以加入黑名单,还有就是页面内容使用json返回,数据经常变一变格式,或者js动态生成页面内容。
43.Object中有哪些方法
getClass() hashCode() clone() equals() toString() finalize() notify() notifyAll() wait()
44.常用的运行时异常
1.ClassCastException 类型转换异常
2.ArrayIndexOutOfBoundsExcption 数组下标越界异常
3.UnsupportedOperationException不支持的操作异常
Array.asList()方法把数组转换成集合,在对集合修改时会抛出异常
4.NullPointerException空指针异常
5.NumberFormatException数字异常
6.ArithmeticException数学异常
7.java.lang.IllegaMonitorStateException在不合理或不正确时间内唤醒一方法时出现的异常,
即java环境或java应用不满足请求操作。
举个例子:java代码如下
PrintWriter writer = response.getWriter();
writer.println("第一个servlet程序");
ServletOutputStream os = response.getOutputStream();
os.println("第一个servlet程序");
分析:程序运行之后会报错,同一个请求周期,HTTPServletResponse的getWrite()与
getOutPutStream()只能选择一个使用,否则会丢出IllegalStateException.
8.ConcurrentModificationException并发修改异常
45.常用的垃圾回收算法
标记-清除算法:
标记-清除算法采用从根集合(GCRoots)进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个
空间中未被标记的对象,进行回收,此算法一般没有虚拟机采用。
复制算法:
将内存分成两块容量大小相等的区域,每次只使用其中的一块,当这一块用完了,就将所有存活的对象
复制到另一块内存空间,然后清除前一块内存空间。这样一来就不容易出现内存碎片的问题。
标记-整理算法:
思想:在完成标记之后,它不是直接清理可回收对象,而是将存活对象向一端移动,然后清理掉端边界
以外的内存。不会产生内存碎片,但是依旧移动对象的成本。
分代收集算法:
分代收集算法是目前大部分jvm的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内
存划分为若干个不同的区域。一般情况下将堆区划分为老年代和新生代,在堆区之外还有一个代就是永
久代。老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都
有大量对象需要被回收,那么就可以根据不同的特点采取合适的收集算法。
46.类的实例化顺序
大致顺序:先静态方法,在构造方法。先父类后子类。
1)父类静态成员和静态初始化块,按代码顺序
2)子类静态成员和静态初始化块,按代码顺序
3)父类实例成员和实例初始化块,按代码顺序
4)父类构造方法
5)子类实例成员和实例初始化块,按代码顺序
6)子类构造方法
47.java内存模型
java内存模型是围绕着并发编程中原子性,可见性,有序性这三个特征来建立的,
那么依次看一下这三个特征:
1.原子性:一个操作不能被打断,要么全部执行完毕,要么不执行。在这点上有点类似于事务操作。
2.可见性:一个线程对共享变量做了修改之后,其他线程立即能看到(感知到)该变量这种修改(变化).
3.有序性:对于一个线程的代码而言我们总是以为代码的执行是从前往后的,依次执行的。这么说不
能说完全不对,在单线程程序里,确实会这样执行;但是在多线程并发时,程序的执行就有可能出
现乱序。用一句话可以总结为:在本线程内观察,操作都是有序的;如果在一个线程中观察另外一
个线程,所有的操作都是无序的。前半句是指“线程内表现为串行语义(WithIn Thread As-if-Serial Semantics)”,后半句是指“指令重排”现象和“工作内存和主内存同步延迟”现象。
48.内存泄露和内存溢出的区别,产生原因?
内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用
内存泄露(memory leak):是指程序在申请内存后,无法释放已申请的内存空间
内存溢出的原因:
1.内存加载的数据量过于庞大,如一次性从数据库取出过多条数据;
2.集合中有对对象的引用,使用完后未清空,使得jvm不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.启动参数内存值设定过小
49.sleep和wait的区别
1.sleep和wait都会使线程进入冻结状态,并且都会释放cpu的执行权和cpu的执行资格,不同的是sleep
不会释放锁,而wait会连锁一起释放。
2.sleep方法可以在任何地方使用;wait方法则只能在同步方法或同步块中使用
3.sleep方法是Thread类中定义的方法,wait是Object中定义的方法。
简单的回顾一下关于线程的问题:
线程是指进程中的一个执行流程,进程是指一个内存中运行的应用程序,一个进程可以包含多个线程。
实现多线程的方式:
继承Thread类重写run()方法
实现Runnable接口,重写run()方法
线程的启动:是调用start()方法
线程的五个状态:
新建 就绪 运行 阻塞 死亡
方法:
sleep();睡眠,参数是毫秒数,在睡的过程中不能被唤醒
wait();等待,可以被唤醒
join();强行加入,抢的cpu资源,等待本线程执行完毕再执行其他线程
yield();让一让,回到就绪状态,交出cpu执行权,和其它线程一起抢夺资源。
notify();唤醒单个线程
notifyAll();唤醒全部等待的线程
造成线程阻塞的方法:
sleep();
wait();线程等待;
join();线程自闭;在当前线程调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个
进程运行结束,当前线程再由阻塞转为就绪状态。
suspend();挂起;jdk1.5之后已经废除,因为有死锁倾向。
线程的优先级:
优先级范围1~10的正整数,线程默认的优先级为5,jvm线程调度程序是基于优先级的抢先调度机
制,在大多数情况下,当前运行的线程优先级将大于或等于线程池中任何线程的优先级。
注意:当设计多线程应用程序的时候,一定不要依赖于线程的优先级,因为线程调度的优先级操作是没有
保障的,只能把线程优先级作为一种提高程序效率的方法,但是要保证程序不依赖这种操作。
设置线程的优先级:setPriority();
50.类加载过程
jvm类加载机制分为五部分:加载,验证,准备,解析,初始化。
1.虚拟机在首次加载java类时,对静态代码块,静态成员变量,静态方法进行一次初始化(静态间按顺序
执行)
2.只有在调用new方法时才会创建类的实例
3.类实例创建过程:父子继承关系,先父类再子类。父类的静态>子类的静态>父类的初始化块>父类的
构造方法>子类的初始化块>子类的构造方法
4.类实例销毁的时候:首先销毁子类部分,在销毁父类部分。
个人能力有限,如有错误或者有更好的见解,欢迎在评论区告诉我。。。本次就编写五十道题,随后会继续总结,
java基础知识总结(一)
最新推荐文章于 2023-05-25 11:47:36 发布