JAVA基础面试题01
今天的话算是自己学习Java开发3年以来第一篇关于Java基础的文章。因为这个时候刚好是自己工作面试之前的最后一个月,说实话在这个之前也看了不少的面试题和文章了,但是后面想了想还是需要记录一下。因为知识点比较多,是很容易忘记的。再加上每天都在接受新的知识点。希望这一篇文件可以帮助和我一样正在争取自己满意工作路上的小伙伴们。(其中综合了各位大佬的经验,希望不要在意。)
JVM JRE JDK
JVM: Java 虚拟机,是Java 能够跨平台的核心。
JRE:Java 运行时环境,jvm 的标准实现和 Java 的一些基本类库。
JDK:Java 开发工具包。jdk 是整个 Java 开发的核心,它可以集成工具(jar)。
JDK=JVM+JRE JRE(JVM)
什么是JAVA语言以及和其他语言的区别(C++)
Java语言特点:简单性、面向对象、分布性、编译和解释性、稳健性、安全性、可移植性、高性能、多线索性、动态性。
区别:
1、Java为解释性语言 ,C/C++为编译型语言。Java的执行速度比C/C++慢,但Java能够跨平台执行,C/C++不能。
2、Java是纯面向对象语言所有代码(包括函数、变量)必须在类中实现,除基本数据类型(包括int、float等)外,所有类型都是类。此外,Java语言中不存在全局变量或者全局函数,而C++兼具面向过程和面向对象编程的特点,可以定义全局变量和全局函数。
3、与C/C++语言相比,Java语言中没有指针的概念,这有效防止了C/C++语言中操作指针可能引起的系统问题,从而使程序变得更加安全。
4、与C++语言相比,Java语言不支持多重继承,但是Java语言引入了接口的概念,可以同时实现多个接口。由于接口也有多态特性,因此Java语言中可以通过实现多个接口来实现与C++语言中多重继承类似的目的。
5、在C++语言中,需要开发人员去管理内存的分配(包括申请和释放),而Java语言提供了垃圾回收器来实现垃圾的自动回收,不需要程序显示地管理内存的分配。在C++语言中,通常会把释放资源的代码放到析构函数中,Java语言中虽然没有析构函数,但却引入了一个finalize()方法,当垃圾回收器要释放无用对象的内存时,会首先调用该对象的finalize()方法,因此,开发人员不需要关心也不需要知道对象所占的内存空间何时被释放。
面向对象(OOP)
(1)请简述类和对象的关系。(可以有自己的理解)
答:类相当于是模板,对象是通过模板刻画出来的带有独立特性的实际对象。
(2)面向对象三大特征。
答:封装、继承、多态。
封装的体现:将相同的属性或事物提炼封装成为一个类;将一组能够完成特定功能的代码封装成方法;将类的属性使用访问权限(public,protected,默认的,private)进行修饰,完成数据私有化,方法公开化的封装;
继承:子类继承父类,就无需重复父类的代码。
多态的体现:a.对象的多态。一个类class可以new无数个对象;向上造型也是多态的体现;b.方法的多态。重写和重载就是多态的体现。
实现多态的机制:java实现多态的机制是依靠父类或者接口的引用指向子类。从而实现了一个对象多种形态的特性。其中父类的引用是在程序运行时动态指向具体的实例,调用该方法时不是根据引用变量的类型中定义的方法来运行,而是根据具体的实例的方法。
(3)请简述重写和重载的区别?
答:在同一个类中,方法名相同,但参数不同,即为方法的重载(overload);参数的不同包括,参数的个数、类型、顺序,只要有一个不同就是参数不同,就符合重写的规则。
重写(override)发生在父子类中,方法名相同,参数相同,但方法体不同。需要符合“两同两小一大”的原则。
两同:方法名相同,参数相同。
两小:抛出的异常和返回值类型子类要比父类小,或者一样。如果返回值是基本数据类型,就要求必须一样。
一大:子类的访问权限要比父类的小,或者一样
面向过程和面向对象区别:
一、bai编程思想不同
1、面向过程:是一bai种以过程为中du心的编程思想。都是zhi以什么正在dao发生为主要目标进行编程。
2、面向zhuan对象语言:是一类以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。
二、特点不同
1、面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
2、面向对象语言:识认性,系统中的基本构件可识认为一组可识别的离散对象,对象具有唯一的静态类型和多个可能的动态类型,在基本层次关系的不同类中共享数据和操作。
(之前我的理解是面向对象在意的是执行结果,面向过程在意的是执行的过程。不知道各位大佬有没有更好的建议和就见解?)
Java数据类型 (基本和引用)
基本类型转换:隐式(自动),显示(强制)
隐式(自动)类型转换:从存储范围小的类型到存储范围大的类型。byte→short(char)→int→long→float→double
显示(强制)类型转换:从存储范围大的类型到存储范围小的类型。double→float→long→int→short(char)→byte。该类类型转换很可能存在精度的损失。
自动装箱与拆箱
装箱:将基本类型用包装器类型包装起来
拆箱:将包装器类型转换为基本类型
String常用方法
stringbuilder和stringBuffer和string的区别
String 类型和 StringBuffer 的主要性能区别:String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
在某些特别情况下, String 对象的字符串拼接其实是被 Java Compiler 编译成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,
String为什么是不可变的
1、private修饰,表明外部的类是访问不到value的,同时子类也访问不到,当然String类不可能有子类,因为类被final修饰了
2、final修饰,表明value的引用是不会被改变的,而value只会在String的构造函数中被初始化,而且并没有其他方法可以修改value数组中的值,保证了value的引用和值都不会发生变化
字符型常量和字符串常量的区别
形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)
占内存大小 字符常量占两个字节 字符串常量占若干个字节(至少一个字符结束标志)
什么是字符串常量池?
字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。