美文网首页JAVA学习合集
JAVA学习-基础概念知识

JAVA学习-基础概念知识

作者: Renaissance_ | 来源:发表于2019-01-14 19:19 被阅读0次

简述Java代码从编写到运行的全过程

  1. 编写代码: 将需求通过代码实现
  2. 编译成字节码文件:将编码后的源程序编译成字节码文件 .class
  3. 类装载(classloader): 为运行程序寻找或装载所需要的类
  4. 字节码校验(bytecode verifier): 校验class的代码,保证安全性,比如对象类型,对象访问权限
  5. 解释(interprter):机器不认识字节码文件,需要被解释器解释后才能运行
  6. 运行: 最后代码可以在运行环境中进行运行

简述虚拟机的工作机制

同 【简述Java代码从运行到运行的全过程】

简述回收机制

垃圾回收是指JVM通过一些垃圾回收算法回收分配出去且未被使用的内存空间,提高程序运行效率,防止出现内存泄露。由于回收内存空间需要耗费时间,频繁的进行垃圾回收会影响程序的运行效率,因此当出现未被引用的对象,JVM不会立即进行回收,而是选择在合适的时候进行回收。所以在程序中使用system.gc()不会立马进行垃圾回收,而是通知JVM需要进行垃圾回收

简述java安全机制

  1. 类装载器结构(class loader): 装载和寻找程序执行所需要的类
  2. class文件检查器(the class file verifier): 虚拟机校验装载的字节码文件的完整性,通过四趟进行校验
    第一趟:检查文件结构,比如检查文件是否符合JavaClass文件的节本结构
    第二趟:类型数据的语义检查,例如检查final类有没有被子化等
    第三趟:字节码验证,确保操作数栈总是包含正确的数值以及正确的类型。
    第四趟:符号引用的验证,由于Java程序是动态链接的,所以Class文件检查器在进行第四次扫描中,必须检查相互引用类之间的兼容性。
  3. 内置于JVM的一些安全特性:
    a) 类型安全的引用转换
    b) 自动垃圾回收机制
    c) 空引用检查
    d) 结构化的内存访问
  4. Java管理器以及java api

简述java面向对象的三大特性

  1. 封装: 将属性私有化只有类内部才能使用,提供对外使用的公有方法,就像常见的java bean,属性都是priavte,set和get方法都是共有的。
    为什么不直接将类的属性设置为public供外部使用,因为直接使用的话,无法对属性进行相应的处理再获取,或者有些共有属性只读,不能修改,就不能直接将属性设置为公有供外部使用。
  2. 继承: 子类继承父类的方法和属性,并且可以重写父类方法或者可以扩展新方法。java是单继承语言,就是一个子类,只能继承一个父类。java的继承属提高了java的程序复用性和扩展性
  3. 多态: 指java不同类的对象可以对同一函数调用进行响应,也就是函数调用可以根据发送对象的不同而采用不同的行为方式。java多态分为运行时多态和编译时多态,编译时多态指方法的重载,即在编译时就可以确定使用哪个方法,运行时多态是指Java在运行时个根据调用方法的实例类型来决定调用哪个方法。所以多态是指在继承的基础上,对父类的引用可以指向子类对象,调用子类重写的方法,就是子类向上转型成父类,但是子类特有的扩展方法无法使用,可以通过强制类型转换实现调用特有方法
    多态的例子

方法的按值传递和按引用传递

  • 按值传递:方法的形参类型不是引用类型,则是按值传递,那么调用该方法时,形参将实参拷贝一份进行运算,不会改变实参的值。
  • 按引用传递:方法的形参类型为引用类型,则是按引用传递,那么调用该方法时,传递的是实参的地址,形参的运算会改变实参的值。

equals和==的区别

  • equals: 对于引用类型,比较引用类型是否引用统一实例,对于一些包装类File,String,Date等,equals比较的都是类型以及值,而不是判断是否引用同一实例。
  • == : 符号两边的数据类型是否一致(可自动转换的数据类型除外),对于引用类型,就是判断是否指向同一块内存地址

Java String为什么被设计成不可变的?

  • 字符串常量池的需要:因为在java方法区有一块字符串常量池,当创建一个String对象时,如果常量池中存储着这个对象,直接引用这个对象,而不是新建一个对象。所以如果String对象可变,则会对引用它的实例造成影响
  • 安全性:因为多线程中,可以对统一资源进行读写,String被设计为不可变的,则只读,不会引起安全隐患
  • hashCode缓存的需要:因为一些数据结构中会缓存hashCode,这样保证了不用每次都去计算hasCode,提高了效率

String,StringBuilder 和 StringBuffer的区别?

  • String: 对象不可变,通过final修饰类和value保证字符串对象不可变,每次操作字符串都会生成新的字符串对象,如果字符串常量池存在,则会引用已存在的字符串对象。
  • StringBuffer: 字符串对象可变,对字符串的操作不会生成新的对象,因此效率比String操作相对较高。由于很多方法添加了synchronized修饰,所以是线程安全的
  • StringBuilder: 字符串对象可变,原理同StringBuffer都继承了AbstractStringBuiledr,通过字符串缓冲池管理字符串,但是没有synchronized修饰符,所以时现场不安全的,但是效率比StringBuffer高
  • 效率: StringBuilder > StringBuffer > String
    线程安全: String,StringBuffer是线程安全的,StringBuilder是线程不安全的

相关题目

Java Serializable接口介绍

  • Serializable接口内部没有定义属性和方法,主要是标识此接口的实现类可以被序列化和反序列化

serializable

深入了解接口和抽象类

  1. 抽象类:用abstract修饰的类,含有不提供具体实现的抽象方法,抽象类不能被实例化,需要由子类继承抽象类实现父类的抽象方法。
  2. 接口:特殊的抽象类,该类中包含常量和抽象方法,子类可以实现多个接口,并且需要实现所有的抽象方法。
  3. 区别:抽象类可以包含静态属性和静态方法或者普通方法,但是接口只能包含常量和抽象方法
    抽象类不能使private,但是接口只能是public的
    子类只能继承一个抽象类,子类可以实现多个接口
  4. 适用场景:接口相比抽象类更加抽象,抽象类是对事物的抽象,即对类的抽象,而接口是对行为的抽象。抽象类是对整个类整体包含属性,行为,但是接口只是对类局部行为进行抽象。比如鸟和飞机都可以飞,可以将鸟和飞机都设计成抽象类,将飞这个行为定义成接口,鸟和飞机都实现这个接口,都具有飞的行为了。更多类型的鸟可以继承鸟父类,更多种类的飞机则可以进行继承飞机抽象类,所以这就是抽象类和接口的区别。

参考博客

简述java异常机制

  1. Java异常机制是一种识别和响应错误的机制,提高了程序的健壮性。Throwable是Error和Exception的父类,定义了一些捕获和打印异常的方法。Java异常分为运行时异常,都继承于RunTimeException,编辑器不会检查这类异常,只有在运行时才会捕获或者抛出,比如除数为0引起的运行时异常;还有一类是检查型异常,编辑器会检查这类异常是否抛出,或者是否被try catch 块捕获

简述java类的初始化顺序:

  • 普通类: 静态变量->静态代码块->普通属性->普通代码块->构造函数
  • 继承了父类的子类:父类的静态变量->父类的静态代码块->子类的静态变量->子类的静态代码块->父类的普通变量->父类的普通代码块->
    父类的构造函数->子类的普通变量->子类的普通代码块->子类的构造函数

简述Java内存区域

  • Java内存区域指的就是JVM的内存区域,从划分区域来讲可以分为程序计数器,Java栈,堆,本地方法栈,方法区;
  • 程序计数器:线程私有区域,用来记录每个线程指令执行的地址,在JVM中,多线程的执行是线程间轮流获得CPU的执行时间的,因此在某个时刻只有一条线程指令是被CPU内核执行,多线程间的切换需要记录每个线程的执行位置,因此每个线程都有自己独立的程序计数器,并且不会互相干扰,因此程序计数器是每个线程私有区域。
  • JAVA栈:线程私有区域,Java栈中存放的是栈帧,每个栈帧又包括局部变量表,操作数栈,指向当前方法所属类的运行时常量池的引用,方法返回地址等信息。当执行一个方法时,该方法的栈帧入账,当方法执行完毕后,该方法的栈帧出栈。
  1. 局部变量表:用来存储方法的局部变量,如果是基本的数据类型,存储的则是局部变量的直接量,如果是引用类型的变量,则存储指向对象的引用,局部变量的大小在编译期就可以知道了,所以运行期间局部变量表的大小不变。
  2. 操作数栈: 用来处理程序的计算过程
  3. 指向运行时常量池的引用: 执行运行时所属类的运行时常量池
  4. 方法返回地址:方法执行完后需要返回到调用他的位置,因此需要存储这个地址
    每个线程的执行方法是不同的,所以JAVA栈也是每个线程私有的。
  • 本地方法栈: 跟Java栈类似,不过本地方法栈存储的是需要执行的本地方法栈帧,本地方法是由其它语言编写的
  • Java堆:线程共享区域,Java堆存储的是数组和对象本身,JVM中只有一个Java堆,也是jvm垃圾回收的主要区域,如果堆内存不够来分配内存实例则会出现内存溢出
  • 方法区:现场共享区域,存储着每个类的基本信息包括,静态变量常量,方法以及编译期编译后的代码。方法区中有个重要的部分是运行时常量池,运行时常量池用来存储编译期生成的常量,当然也可以动态创建运行时常量池空间,比如String,intern。

简述Java内存模型

Java内存模型是一组程序线程访问共享变量的规则。Java内存模型中将线程私有数据的存储区域定义为工作内存,将线程间共享的变量数据定义为主内存。

  • 工作内存为每个线程私有的内存区域,存储着线程的指令执行位置,执行方法的相关信息,每个线程不能访问其它线程工作内存的数据,因此工作内存中的本地变量操作是线程安全的。
  • 主内存存储着实例对象和其它的类的基本信息,是多个线程间共有的,如果某个线程访问或者操作主内存的同一个变量,先要从主内存中刷新变量到线程的工作内存中,计算完后将变量从工作内存中刷新到主内存中,当多个线程访问或者操作的时候,则会出现变量不安全。
    为了解决多线程间的执行问题,Java从原子性,一致性和可见性提供了解决方案。

相关文章

网友评论

    本文标题:JAVA学习-基础概念知识

    本文链接:https://www.haomeiwen.com/subject/hywjdqtx.html