目录
1、jdk jre jvm 的区别?
2、“==”和equals方法究竟有什么区别?
3、 面向对象的特征有哪些方面?
4、普通类和抽象类有哪些区别?
5、接口和抽象类有什么区别?
6、一个数组用二分查找
7、九九乘法表
8 、java中this关键字的使用方法?
9 、java中为什么在static中不能使用this关键字?
10、什么是 java 序列化?什么情况下需要序列化?
11、List、Set、Map 之间的区别是什么?
12、String str=i与 String str=new String(i)一样吗?
13、线程的 run()和 start()有什么区别?
14、线程有哪些状态?
15、在 java 程序中怎么保证多线程的运行安全?
16、哪些集合类是线程安全的?
17、守护线程是什么?
18、什么是自动拆装箱?
19、同步方法和同步代码块的区别是什么?
20、创建线程有几种不同的方式?你喜欢哪一种?为什么?
21、&和&&的区别?
22、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
23、swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
24、用最有效率的方法计算2乘以8?
25、是否可以继承String类?
26、已知int占4个字节,bool占1个字节。求value和condition
27、要交换变量A和B的值,应使用的语句代码
28、JVM内存包含哪个部分( )
29、Jvm有几种垃圾回收的算法 ?分别是什么?
1、jdk jre jvm 的区别?
1.JDK和JRE区别:在bin文件夹下会发现,JDK有javac.exe而JRE里面没有,javac指令是用来将java文件编译成class文件的,这是开发者需要的,而用户(只需要运行的人)是不需要的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。
2.JRE和JVM区别:JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持.
2、“==”和equals方法究竟有什么区别?
“==”用来判断两个变量之间的的值是否相等。变量就可以分为基本数据类型变量,引用类型。如果是基本数据类型的变量直接比较值而引用类型要比较对应的引用的内存的首地址。equals 用来比较两个对象长得是否一样。判断两个对象的某些特征是否一样。实际上就是调用对象的equals方法进行比较。
3、 面向对象的特征有哪些方面?
有四大基本特征:封装、抽象、继承、多态。
4、普通类和抽象类有哪些区别?
- 普通类不能包含抽象方法,抽象类可以包含抽象方法
- 抽象类不能直接实例化,普通类可以直接实例化。
5、接口和抽象类有什么区别?
- 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
- 构造函数:抽象类可以有构造函数;接口不能有。
- main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
- 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
- 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
6、一个数组用二分查找
public static void main(String[] args) {
int [] num = {2,3,4,23,13,65};
int target = 10;
BinarySearch(num,target);
}
public static void BinarySearch(int [] num,int target){
int min = 0;
int max = num.length-1;
while (min<=max){
int middle = (min + max)/2;
if(num[middle] > target){
max = middle -1;
}if (num[middle] < target){
min = middle + 1;
}if (num[middle] == target){
System.out.println("找到了,位置是:"+middle);
break;
}
}
}
7、九九乘法表
public static void main(String[] args) {
for (int i=1;i<10;i++){
for (int j = 1;j<=i;j++){
System.out.print(j+"*"+i+"="+(i*j)+" ");
}
System.out.println();
}
}
8 、java中this关键字的使用方法?
1、 使用this来区分当前对象。
Java中为解决变量的命名冲突和不确定性问题,引入关键字this代表其所在方法的当前对象的引用:
1) 构造方法中指该构造器所创建的新对象;
2) 方法中指调用该方法的对象;
3) 在类本身的方法或构造器中引用该类的实例变量(全局变量)和方法。
this只能用在构造器或者方法中,用于获得调用当前的构造器方法的对象引用。可以和任何的对象引用一样来处理这个this对象。
说明:
(1)当实例变量和局部变量重名,JAVA平台会按照先局部变量、后实例变量的顺序寻找。即,方法中使用到的变量的寻找规律是先找局部变量,再找实例变量。如果没用找到,将会有一个编译错误而无法通过编译。
(2)如果使用this.a,则不会在方法(局部变量)中寻找变量a,而是直接去实例变量中去寻找,如果寻找不到,则会有一个编译错误。
(3)在一个方法内,如果没有出现局部变量和实例变量重名的情况下,是否使用this关键字是没有区别的。
(4)在同一个类中,Java普通方法的互相调用可以省略this+点号,而直接使用方法名+参数。因为Java编译器会帮我们加上。
2、 在构造器中使用this来调用对象本身的其他构造器。
在构造器中使用this([args_list]);可以调用对象本身的其他的构造器。直接使用this()加上类构造器所需要的参数。就可以调用类本身的其他构造器了。如果类中有多个其他构造器定义,系统将自动根据this()中的参数个数和类型来找出类中相匹配的构造器。
注意: 在构造器中可以通过this()方式来调用其他的构造器。但在一个构造器中最多只能调用一个其他的构造器。并且,对其他构造器的调用动作必须放在构造器的起始处(也就是构造器的首行),否则编译的时候将会出现错误,另外不能在构造器以外的地方以这种方式调用构造器。
3、 this关键字还有一个重大的作用就是返回类的引用。如在代码中,可以使用return this来返回某个类的引用。此时,这个this关键字就代表类的名称。
9 、java中为什么在static中不能使用this关键字?
Static方法是类方法,先于任何的实例(对象)存在。即Static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成。而this指代的是当前的对象
在方法中定义使用的this关键字,它的值是当前对象的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.
而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this.
10、什么是 java 序列化?什么情况下需要序列化?
简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
11、List、Set、Map 之间的区别是什么?
12、String str=i与 String str=new String(i)一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。
13、线程的 run()和 start()有什么区别?
每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。
start()方法来启动一个线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码; 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行状态, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。 如果直接调用run(),其实就相当于是调用了一个普通函数而已,直接待用run()方法必须等待run()方法执行完毕才能执行下面的代码,所以执行路径还是只有一条,根本就没有线程的特征,所以在多线程执行时要使用start()方法而不是run()方法。
14、线程有哪些状态?
- 创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
- 就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
- 运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
- 阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
- 死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪
15、在 java 程序中怎么保证多线程的运行安全?
- 原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);
- 可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);
- 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。
16、哪些集合类是线程安全的?
- vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
- statck:堆栈类,先进后出。
- hashtable:就比hashmap多了个线程安全。
- enumeration:枚举,相当于迭代器。
17、守护线程是什么?
守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。
18、什么是自动拆装箱?
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。
19、同步方法和同步代码块的区别是什么?
在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。
synchronized关键字可应用在方法级别(粗粒度锁:这里的锁对象可以是This)或者是代码块级别(细粒度锁:这里的锁对象就是任意对象)。
20、创建线程有几种不同的方式?你喜欢哪一种?为什么?
有三种方式可以用来创建线程:
•继承Thread类
•实现Runnable接口
•应用程序可以使用Executor框架来创建线程池
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。
在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。
21、&和&&的区别?
&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(""),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
22、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。
23、swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
在Java 5以前,switch(expr)中,expr只能是byte、short、char、int。从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型,从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
24、用最有效率的方法计算2乘以8?
2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)
25、是否可以继承String类?
String 类是final类,不可以被继承。
26、已知int占4个字节,bool占1个字节。求value和condition
unsigned int
value = 1024;
bool condition =*((bool *)(&value));
if (condition)
value += 1; condition = *((bool *)(&value));
if (condition)
value += 1; condition = *((bool *)(&value));
1024, 0
27、要交换变量A和B的值,应使用的语句代码
1、C=A;A=B;B=C
2、a = a^b; b=a^b;a=a^b;
28、JVM内存包含哪个部分( )
根据JVM规范,JVM 内存共分为虚拟机栈,堆,方法区,程序计数器,本地方法栈五个部分。
29、Jvm有几种垃圾回收的算法 ?分别是什么?
引用计数法
标记清除法
标记压缩算法
复制算法
分代算法