java基础知识总结(一)

最近想做些总结,方便以后知识点回顾,同时为小白面试做基础。。。。。
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.类实例销毁的时候:首先销毁子类部分,在销毁父类部分。
   个人能力有限,如有错误或者有更好的见解,欢迎在评论区告诉我。。。本次就编写五十道题,随后会继续总结,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值