java基础面试宝典
Posted z1427094386
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础面试宝典相关的知识,希望对你有一定的参考价值。
基础篇
一、JAVA:
Java是面向对象的,跨平台的,它通过java虚拟机来进行跨平台操作,它可以进行自动垃圾回收的【c语言是通过人工进行垃圾回收】,java还会进行自动分配内存。【c语言是通过指定进行分配内存的】,只需要new一个对象,这个对象占用了多少空间,不需要我们来管,java虚拟机负责管这些,用完之后也不需要我们来释放,java虚拟机会自动释放
二、JDK JRE JVM的区别:
Jdk【Java Development ToolKit】就是java开发工具箱, JDK是整个JAVA的核心里边包含了jre,它除了包含jre之外还包含了一些javac的工具类,把java源文件编译成class文件,java文件是用来运行这个程序的,除此之外,里边还包含了java源生的API,java.lang.integer在rt的jar包里边【可以在项目中看到】,通过rt这个jar包来调用我们的这些io流写入写出等
JDK有以下三种版本:
J2SE,standard edition,标准版,是我们通常用的一个版本
J2EE,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序
J2ME,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序
Jre【Java Runtime Enviromental】是java运行时环境,那么所谓的java运行时环境,就是为了保证java程序能够运行时,所必备的一基础环境,也就是它只是保证java程序运行的,不能用来开发,而jdk才是用来开发的,所有的Java程序都要在JRE下才能运行。
包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。
Jre里边包含jvm
Jvm:【Java Virtual Mechinal】因为jre是java运行时环境,java运行靠什么运行,而底层就是依赖于jvm,即java虚拟机,java虚拟机用来加载类文件,java中之所以有跨平台的作用,就是因为我们的jvm
关系:
J2se是基于jdk和jre,
JDK是整个JAVA的核心里边包含了jre,
Jre里边包含jvm
三、java的基本数据类型
数据类型 大小
byte(字节) 1(8位)
shot(短整型) 2(16位)
int(整型) 4(32位)
long(长整型) 8(64位)
float(浮点型) 4(32位)
double(双精度) 8(64位)
char(字符型) 2(16位)
boolean(布尔型) 1位
附加:
String是基本数据类型吗?(String不是基本数据类型)
String的长度是多少,有限制?(长度受内存大小的影响)
四、switch默认接受的几种数据类型
1.7 Short, int, byte, char
1.8 byte,short,int,char,枚举,字符串
五、修饰符的作用
修饰符的作用范围:
private default protected public
同一个类中 可以 可以 可以 可以
同一个包的类中 可以 可以 可以
不同包的子类中 可以 可以
不同包的类中 可以 可以
六、Static修饰符
1、Static修饰的变量和方法都是类的,被称为静态成员,在类被加载到内存中时就开辟了空间;
2、static修饰的方法只能访问同类中的其他静态方法和静态变量,不能访问非静态成员;
3、static修饰的代码段被称为静态代码块,当类被加载时他只被执行一次。
七、final,finally,finalize 三者区别
Final是一个修饰符:
当final修饰局部变量的时候,只能被赋值一次;
当final修饰类变量时,必须在声明这个变量的时候赋值或者构造时赋值;
当final修饰方法时,该方法不能被重写;
当final修饰类时,该类不能被继承;
Finally:
Finally只能与try/catch语句结合使用,finally语句块中的语句一定会执行, 并且会在return,continue,break关键字之前执行
finalize:
Finalize是一个方法,属于java.lang.Object类,finalize()方法是GC (garbage collector垃圾回收)运行机制的一部分,finalize()方法是在 GC清理它所从 属的对象时被调用的
八、StringBuffer StringBuilder String 区别
1.StringBuilder执行效率高于StringBuffer高于String.
2.String是不可变的,所以对于每一次+=赋值都会创建一个新的对象,StringBuffer和StringBuilder都是可变的,当进行字符串拼接时采用append方法,在原来的基础上进行追加,地址不变,所以性能比String要高,又因为StringBuffer是线程安全的而StringBuilder是线程非安全的,所以StringBuilder的效率高于StringBuffer.
3.对于大数据量的字符串的拼接,采用StringBuffer,StringBuilder.
4.String与StringBuffer都是被final修饰的,不可被继承。
九、String的常用方法
Concat,equals,format,hasCode,indexOf,isEmpty,length,split,subString,valuesOf;
十、Java面向对象的特征
面向对象编程有三个特征:封装,继承,多态。
封装:1使用private关键字来实现封装;2讲类的属性私有化,提供公开的方法实现对属性的操作;3便于修改,增强代码的可维护性;
继承:1关键字是extend;2Java只能单继承;3子类继承了父类非私有的属性和方法;4构造方法不能继承;
多态:子类可以替代父类使用,接口可以替代实现类使用;
重载:1在同一个类中;2方法名相同;3参数类型或者数量不同;
重写:1发生在子类与父类之间;2方法名、返回值类型、参数类型都相同;3重写的修饰符权限要大于被重写的权限;
十一、抽象类与接口的区别
1.一个类只能进行单继承,但可以实现多个接口。
2.有抽象方法的类一定是抽象类,但是抽象类里面不一定有抽象方法;抽象类可以有构造方法,但不能被实例化,只能被继承;
接口里面所有的方法的默认修饰符为public abstract,接口里的成员变量默认的修饰符为 pulbic static final。
关系
接口和接口 继承
接口和抽象类 抽象类实现接口
类和抽象类 类继承抽象类
类和类 继承
十二、List,Set,Collection,Collections
1.List,Set,map都是接口,他们都继承于接口Collection,List是一个有序的可重复的集合,而Set的无序的不可重复的集合。Collection是集合的顶层接口,Collections是一个封装了众多关于集合操作的静态方法的工具类,因为构造方法是私有的,所以不能实例化。
2.List是以有序可重复数据存储的接口,实现类有ArrayList,LinkedList,Vector。ArrayList和Vector是基于数组实现的,所以查询的时候速度快,而在进行增加和删除的时候速度较慢LinkedList是基于链式存储结构,所以在进行查询的时候速度较慢但在进行增加和删除的时候速度较快。又因为Vector是线程安全的,所以他和ArrayList相比而言,查询效率要低。
3.set是以无序不可重复数据存储的接口,实现类有hasSet,treeSet。
4.Map是一个以键值对存储的接口。Map下有两个具体的实现,分别是HashMap和HashTable,HashMap是线程非安全的,HashTable是线程安全的,所以HashMap的效率高于HashTable,HashMap允许键空,而HashTable不允许键为空;map读取key值得方法是map.keySet,读取value值得方法map.values
十三、Io流
从流的方向
输入流 输出流
从流的类型上
字符流
Reader和Writer
字节流
inputstream和outputstream
两者的区别就是读写的时候一个是按字节读写,一个是按字符。在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。只是读写文件,和文件内容无关的,一般选择字节流。
十四、java Exception体系结构
java 异常是程序运行过程中出现的错误。Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。在Java API中定义了许多异常类,分为两大类,错误Error和异常Exception。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常(非runtimeException),也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
1、Error与Exception
Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。
这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。
2、运行时异常和非运行时异常
运行时异常:
都是RuntimeException类及其子类异常:
IndexOutOfBoundsException 索引越界异常
ArithmeticException:数学计算异常
NullPointerException:空指针异常
ArrayOutOfBoundsException:数组索引越界异常
ClassNotFoundException:类文件未找到异常
ClassCastException:类型转换异常
这些异常是不检查异常(Unchecked Exception),程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的。
非运行时异常:是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如:
IOException、文件读写异常
FileNotFoundException:文件未找到异常
EOFException:读写文件尾异常
MalformedURLException:URL格式错误异常
SocketException:Socket异常
SQLException:SQL数据库异常
十五、线程和进程的区别
1.线程(Thread)与进程(Process):一个进程可以包括若干个线程;
2.实现线程的两种方式:继承Thread类,实现Runable接口;
3.线程的五种状态:创建状态,就绪状态,执行状态,阻塞状态,结束状态。
4.Synchronized关键字:确保共享对象在同一时刻只能被一个线程访问,这种处理机制称为“线程同步”或“线程互斥”。修饰的方法被称为同步方法,修饰部分代码被称为同步块,作用与同步方法相同,只是作用范围不同。
5.wait与sleep的区别:都可以使线程等待。在等待时wait会释放资源(锁),而sleep一直持有锁,不会释放资源。Wait通常被用于线程间交互,sleep通常被用于暂停执行。
十六、冒泡排序
for (int i = 0; i < sort.length - 1; i++) {
for (int j = 0; j < sort.length - i - 1; j++){
if (arr[j] < arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
十七、二分查找法
十八、时间类型转换
十九、阶乘
二十、单例
单例就是该类只能返回一个实例。
单例所具备的特点:
1.私有化的构造函数
2.私有的静态的全局变量
3.公有的静态的方法
单例分为懒汉式、饿汉式和双层锁式
饿汉式:
public class Singleton1 {
private Singleton1() {};
private static Singleton1 single = new Singleton1();
public static Singleton1 getInstance() {
return single;
}
}
懒汉式:
public class Singleton2 {
private Singleton2() {}
private static Singleton2 single=null;
public tatic Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}
线程安全:
public class Singleton3 {
private Singleton3() {}
private static Singleton3 single ;
public static Singleton3 getInstance() {
if(null == single){
synchronized(single ){
if(null == single){
single = new Singleton3();
}
}
}
return single;
}
}
参考:
通过双重判断来保证单列设计模式在多线程中的安全性,
并且它在性能方面提高了很多。
synchronized在方法上加锁 (同步锁)
synchronized在代码块内部加锁 (同步代码块)
synchronized(同步锁)
使用synchronized如何解决线程安全的问题?
1.synchronized在方法上加锁
2.synchronized在代码块内部加锁
1.懒汉 2.饿汉 3.双重判断
二十一、jvm的内存结构
java虚拟机的内存结构分为堆(heap)和栈(stack),堆里面存放是对象实例也就是new出来的对象。栈里面存放的是基本数据类型以及引用数据类型的地址。
对于所谓的常量是存储在方法区的常量池里面。
以上是关于java基础面试宝典的主要内容,如果未能解决你的问题,请参考以下文章