Java基础05
Java基础面试准备
什么是jvm jre jdk?
- JVM是Java Virtual Machine(Java虚拟机)的缩写,它是整个Java实现跨平台的最核心的部分,所有的java程序会首 先被编译为.class的类文件,这种类文件可以在虚拟机上执行,JVM的主要工作是解释自己的指令集 (即字节码)到CPU的指令集或对应的系统调用,保护用户免被恶意程序骚扰。 JVM对上层的Java源文件是不关心 的,它关注的只是由源文件生成的类文件(.class文件)。
- JRE是java runtime environment(java运行环境)的缩写。光有JVM还不能让class文件执行,因为在解释class的时候 JVM需要调用解释所需要的类库lib。在JDK的安装目录里你可以找到jre目录,里面有两个文件夹bin和lib,在这里可以 认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和lib和起来就称为jre。
- JDK是java development kit(java开发工具包)的缩写。每个学java的人都会先在机器上装一个JDK,那 让我们看一 下JDK的安装目录。在目录下面有六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行 java时起作用的是以下四个文件夹:bin、include、lib、jre。现在我们可以看出这样一个关系,JDK包含JRE,而JRE 包含JVM。
jdk是JAVA程序开发时用的开发工具包,其内部也有JRE运行环境JRE。JRE是JAVA程序运行时需要的运行环境,就是说,如果你光是运行JAVA程序而不是去搞开发的话,只安装JRE就能运行已经存在的JAVA程序了
一幅图看懂八种基本数据类型
byte: 占用1个字节,取值范围-128 ~ 127
short: 占用2个字节,取值范围-215 ~ 215 -1
int:占用4个字节,取值范围-231 ~ 231 -1
long:占用8个字节
float:占用4个字节
double:占用8个字节
char: 占用2个字节
boolean:占用大小根据实现虚拟机不同有所差异
&和&& , |和||的区别和联系
-
& 称为逻辑与运算符,&& 称为短路与运算符,也可叫逻辑与运算符。 对于&:无论任何情况,&两边的操作数或表达式都会参与计算。 对于&&:当&&左边的操作数为false或左边表达式结果为false时,&&右边的操作数或表达式将不参与计算,此时最 终结果都为false。
-
&还可以用作位运算符。当&两边操作数或两边表达式的结果不是boolean类型时,&用于按位与运算符的操
作。
|和||的区别类比&和&&
基本数据类型转换
强制转换规则:
高级变为低级需要强制转换。
如何转换:
(1)赋值运算符“=”右边的转换,先自动转换成表达式中级别最高的数据类型,再进行运算。
(2)赋值运算符“=”两侧的转换,若左边级别>右边级别,会自动转换;若左边级别 == 右边级别,不用转换;若左 边级别 < 右边级别,需强制转换。
(3)可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,前提是不超出其表述 范围,否则必须进行强制转换。
递归算法总结
public class Recursion { //阶乘算法
public int factorial(int num){
if (num==0 || num== 1){
return 1; }
else{
return num*factorial(num-1);
}
}
public static void main(String[] args) {
Recursion recursion = new Recursion();
int n = 0;
int factorial = recursion.factorial(n);
System.out.println(factorial);
}
}
-
递归就是在过程或函数里调用自身。
-
在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
-
递归算法解题通常显得很简洁,但运行效率较低。所以一般不提倡用递归算法设计程序。
-
在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
java.lang.Object类的六个常用方法
(1)public boolean equals(java.lang.Object)比较对象的地址值是否相等,如果子类重写,则比较对象的内容是否相等;
(2)public native int hashCode() 获取哈希码
(3)public java.lang.String toString() 把数据转变成字符串
(4)public fifinal native java.lang.Class getClass() 获取类结构信息
(5)protected void fifinalize() throws java.lang.Throwable垃圾回收前执行的方法
(6)protected native Object clone() throws java.lang.CloneNotSupportedException 克隆
(7)public fifinal void wait() throws java.lang.InterruptedException多线程中等待功能
(8)public fifinal native void notify() 多线程中唤醒功能
(9)public fifinal native void notifyAll() 多线程中唤醒所有等待线程的功能
==和equals的区别和联系
“==”是关系运算符,equals()是方法,同时他们的结果都返回布尔值;
“==”使用情况如下:
a) 基本类型,比较的是值
b) 引用类型,比较的是地址
c) 不能比较没有父子关系的两个对象
equals()方法使用如下:
a) 系统类一般已经覆盖了equals(),比较的是内容。
b) 用户自定义类如果没有覆盖equals(),将调用父类的equals(比如是Object),而Object的equals的比较是地址 return (this == obj)
c) 用户自定义类需要覆盖父类的equals()
谈谈Java的多态
实现多态的三个条件
-
继承的存在(继承是多态的基础,没有继承就没有多态)
-
子类重写父类的方法。(多态下会调用子类重写后的方法)
-
父类引用变量指向子类对象。(涉及子类到父类的类型转换)
向上转型 Animal a = new Cat();
将一个父类的引用指向一个子类对象,称为向上转型,自动进行类型转换。此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法,此时通过父类引用变量无法调用子类特有的方法
向下转型 Cat a2 = (Cat)a;
将一个指向子类对象的引用赋给一个子类的引用,成为向下转型,此时必须进行强制类型转换。向下转型必须转换为 父类引用指向的真实子类类型,否则将出现ClassCastException,不是任意的强制转换.
Integer与int的区别
- int是java提供的8种原始数据类型之一,Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。
- int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的 情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。
- 在JSP开发中,Integer的默认为 null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示 时,结果为0,所以,int不适合作为web层的表单数据的类型。
同步代码块和同步方法有什么区别
相同点:
同步方法就是在方法前加关键字synchronized,然后被同步的方法一次只能有一个线程进入,其他线程等待。而同 步代码块则是在方法内部使用大括号使得一个代码块得到同步。同步代码块会有一个同步的“目标”,使得同步块更加 灵活一些(同步代码块可以通过“目标”决定需要锁定的对象)。一般情况下,如果此“目标”为this,那么同步方法和同 步代码块没有太大的区别。
区别:
同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁。很明显,同步方法锁的范围比较 大,而同步代码块范围要小点。一般同步的范围越大,性能就越差。所以一般需要加锁进行同步的时候,范围越小越 好,这样性能更好。