初级Java应届⽣⾯试题(持续更新。。。)初级Java应届⽣⾯试题
初识Java
1.Write Once,Run Anywhere
意思是:Write Once *.java(源⽂件), Run Anywhere on JVM(Java Virtual Machine)
Java编译器
< 产⽣
java解释器
<
产⽣
源⽂件*.java编译(JIT|Just in time compilation | 即时编译(IDE编译期中报红提⽰))
JVM负责将字节码解释成JVM所在的The Operating System Platform的机器码
机器码再被识别成计算机指令(不带歧视的低级汇编语⾔)
所以我们的The Operating System 必须Config jre(Java Run Environment):jre=常⽤类库+JVM
我们在⼤学期间第⼀次接触Java时,第⼀步就是下载JDK,(Java development kit | Java程序的开发⼯具)JDK其实有很多⼚商,如Oracle JDK ,Oracle OpenJDK,IBM OpenJDK等等,JDK就是包含Java开发环境jre以及⼀些Java开发⼯具:,
2.为什么要配置path环境变量?如何配置?
PATH:我们希望在操作系统的任何⽬录下都运⾏java程序
环境变量Why Function So
PATH 因为Java的编译
器和解释器都在
JDK的lib⽬录下
path环境变量在Operating System中function是在执⾏
命令时要搜索的路径,在DOS命令⾏下⾯执⾏命令如
javac Hello.java编译程序时,它会到PATH变量所指定的
路径中查看是否能到相应的命令程序
So我们需要把jdk安装⽬录下的bin⽬录增加到现有的
PATH变量中,bin⽬录中包含经常要⽤到的可执⾏⽂件
如javac/java/javadoc等,设置好PATH变量后,就可
以在任何⽬录下执⾏javac/java等⼯具了
CLASSPATH 因为JDK的jre⽂
件夹中包含着
Java类库,这些
类库被包含在
jre\lib下
作⽤是指定类搜索路径,要使⽤已经编写好的类,前提当
然是能够到它们了,JVM就是通过CLASSPTH来寻类
的
So我们需要把jdk安装⽬录下的lib⼦⽬录中的dt.jar和
tools.jar设置到CLASSPATH中
JAVA_HOME 它指向jdk的安装⽬录,Eclipse/NetBeans/Tomcat等软
件就是通过搜索JAVA_HOME变量来到并使⽤安装好的
jdk
有点像全局变量
JDK环境变量配置
1.配置环境变量
右击“我的电脑”–>“属性”–>“⾼级系统设置”–>“⾼级”–>“环境变量”
在系统变量⾥新建"JAVA_HOME"变量,变量值为:C:\Program Files\Java\jdk1.8.0_60(JDK的安装路径);
在系统变量⾥新建"classpath"变量
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
到path变量添加变量值
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
注意:不是W10:变量值之间⽤";"隔开。
注意:原来Path的变量值末尾有没有;号,如果没有,先输⼊;号再输⼊。
3.编写代码,使得发⽣VirtualMachineException(OutOfMemoryError,StackOverflowError)
OutOfMemoryError
public class ThrowableTest {
@Test
public void testOutOfMemoryError(){
Object[] objects =new Object[Integer.MAX_VALUE];
System.out.println(objects.length);
}
}
StackOverflowError
就是⾃⼰调⽤⾃⼰
@Test
public void testStackOverflowError(){
testStackOverflowError();
}
4.常见的运⾏时异常:
@Test
public void testRuntimeException(){
int[] ints =new int[5];
System.out.println(ints[6]);//ArrayIndexOutOfBoundsException数组下标越界
String str =null;
System.out.println(str.length());//NullPointerException空指针
//ClassCastException类型转换异常
//ArithmeticException(算术异常)
}
5.常见的编译时异常:
InterruptedException:线程⼲扰异常
FileNotFoundException:⽂件不到
JVM
1、JDK、jre、JVM三者的关系,以及JDK、JRE包含的主要结构有哪些
JDK=JRE+开发⼯具
JRE=常⽤类库+JVM
7.类初始化
⼀个类要创建实例需要先加载并初始化该类
⼀个⼦类要初始化需要先初始化⽗类
⼀个类初始化先初始化静态变量和静态代码块(按上下先后执⾏,只执⾏⼀次)
⾮静态实例变量和⾮静态代码(按上下先后执⾏)
⽆参构造⽅法(⽗类要考虑重写)
8.类加载
1.加载
2.验证
3.准备
4.解析
5.初始化
哪⼏种类加载器
启动类
1)根类加载器(bootstrap class loader):
它⽤来加载 Java 的核⼼类,是⽤原⽣代码来实现的,并不继承⾃ java.lang.ClassLoader(负责加载$JAVA_HOME中jre/lib/rt.jar ⾥所有的class,由C++实现,不是ClassLoader⼦类)。由于引导类加载器涉及到虚拟机本地实现细节,开发者⽆法直接获取到启动类加载器的引⽤,所以不允许直接通过引⽤进⾏操作。
2)扩展类加载器(extensions class loader):
它负责加载JRE的扩展⽬录,lib/ext或者由dirs系统属性指定的⽬录中的JAR包的类。由Java语⾔实现,⽗类加载器为null。
3)系统类加载器(system class loader):
被称为系统(也称为应⽤)类加载器,它负责在JVM启动时加载来⾃Java命令的-classpath选项、java.class.path系统属性,或者CLASSPATH换将变量所指定的JAR包和类路径。程序可以通过ClassLoader的静态⽅法getSystemClassLoader()来获取系统类加载器。如果没有特别指定,则⽤户⾃定义的类加载器都以此类加载器作为⽗加载器。由Java语⾔实现,⽗类加载器为
ExtClassLoader。
GC
内存结构
Name线程私有/共享设置参数Function
程序计数器(PC Registers)私有固定⼤⼩保存当前线程执⾏的⽅法
本地⽅法栈(Native Method Stack)私有固定⼤⼩JNI调取本地⽅法
⽅法区(Method Area)共享-XX static,class类结构,常量(池)
堆(Heap)共享-Xms:初始堆值;-Xmx:最⼤堆值new出来的实例对象和数组
JVM栈(JVM Stack)私有-Xss(每个线程)⽅法的栈帧、局部变量表、操作数栈gc算法
标记清除
标记整理(⽼年代):也叫标记压缩
复制(年轻代的s0和s1)
分代收集算法(新⽣代和⽼年代)
垃圾收集器
serial(单线程)参数:“-XX:+UseSerialGC”(客户端的并发不是很⾼,就⽤这个)
serial old
parallel(多线程)
parallel old
java编译器ide最新版下载CMS(Concurrent Mark Sweep)
注解
谈谈对注解的理解,解决了什么问题?
1:Java语⾔中的类、⽅法、变量、参数和包等都可以注解标记,程序运⾏期间我们可以获取到相应的注解以及注解中定义的内容,这样可以帮助我们做⼀些事情。
2:⽐如说Spring中如果检测到说你的类被@Component注解标记的话,Spring容器在启动的时候就会把这个类归为⾃⼰管理,这样我们就可以通过@Autowired注解注⼊这个对象了。
反射
介绍⼀下反射?
Java反射机制是在运⾏状态中,对于任意⼀个类,都能够知道这个类的所有属性和⽅法;对于任意⼀个对象,都能够调⽤它的任意⼀个⽅法和属性;这种动态获取的信息以及动态调⽤对象的功能就叫“反射机制”
反射机制的优缺点?
优点:
1:运⾏期类型的判断,动态加载类,提⾼代码灵活度
缺点
1:性能瓶颈:反射相当于⼀系列的解释操作,通知JVM要做的事情,性能⽐直接的Java代码运⾏要慢很多。
2:安全问题:让我们可以动态操作改变类的属性同时也增加了类的安全隐患
框架中哪些地⽅应⽤到反射
1:在我们平时的项⽬开发过程中,基本上很少会直接使⽤到反射机制,但是不能说明反射机制没有⽤,实际上有很多设计、开发都与反射机制有关。
2:例如模块化的开发,通过反射去调⽤对应的字节码;
3:动态代理设计模式也采⽤了反射机制
4:还有我们⽇常使⽤的Spring/Hibernate等框架也⼤量使⽤到了反射机制。
5:我们在使⽤JDBC连接数据库使⽤的Class.forName()就是通过反射加载数据库的驱动程序
6:Spring框架的IOC(动态加载管理Bean)创建对象,以及AOP(动态代理)功能都和反射有联系;
7:动态配置实例的属性
代理
1.JDK的动态代理和CGLIB有什么区别?
1:JDK动态代理:只能代理实现了接⼝的类,⽽CGLIB可以代理未实现任何接⼝的类,
2:CGLIB动态代理是通过⽣成⼀个被代理类的⼦类来拦截被代理类的⽅法调⽤,因此不能代理声明为final类型的类和⽅法。
3:两者的效率来说,⼤部分情况是JDK动态代理更优秀,随着JDK版本的升级,这个优势会更加明显。
Java 基础
9.⾯向对象的特征有哪些⽅⾯
封装:张三这个⼈,他的姓名等属性有这个对象⾃⼰的⽅法来读取和改变
抽象:把现实⽣活中的对象,抽象为类
继承:
多态:
6.⾃增变量
@Test
public void addTest(){
int i=1;
i=i++;//i=1
int j=i++;//j=1;i=2
int k=i+++i*i++;//2+3*3;i=4
System.out.println("i="+i);
System.out.println("j="+j);
System.out.println("k="+k);
}
8.⽅法参数传递机制
String、包装类对象(Interger)形参传递时不变
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论