1.java语言的特点有哪些?
简单易学,有丰富的类库,跨平台性(在对应的操作系统安装对应的虚拟机也就是我们所说的JVM)可靠安全,支持多线程。
2.面向对象和面向过程的区别?
面向过程:分析问题按照一个一个步骤去实现,举例:我们早上起来刷牙,需要先挤牙膏,在漱口,在刷牙,......一步一步的去实现这就是我们所说的面向过程开发。
面向过程开发的优点是:性能比较高,普遍在嵌入式开发中可见,缺点是对于硬件的损耗较大。
面向对象:分析问题的时候将分成个个步骤,然后每个对应的对象,在解决问题的时候具体的刷牙行为。。面向对象的优点是:封装,继承,多态,易复用,易扩展,可以设计出低耦合的系统但是性能方面并没有面向过程高。
3.java中的jdk,jre,jvm是什么?
jdk:包括了Java运行环境JRE、Java工具和Java基础类库
jre:运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库
jvm:整个java实现跨平台的最核心的部分,能够运行以Java语言写的程序。
4.标识符的命名规则?
在程序中我们常常需要定义类的名字,方法的名字,变量的名字,这些统称标识符。
在工作中尤其需要注意标识符的命名规则,应当养成良好的命名规范的习惯。
1.标识符可以是英文,或者数字,或者下划线$等
2.标识符不能以数字或者符号开头
3.不可以是java中的关键字
正确的做法:
变量名:phoneNumber(小驼峰命名)
方法名:同变量名(命名规则和变量名一样)
类名:每个单词的首字母大写,例:PhoneNumber (大驼峰命名)
5.java中的instanceof是什么?怎么用?
1.先说说instancef是什么,在java里是一个二目运算符,该运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
2.怎么使用或者怎么比较。
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
interface A{}
class B implements A{
//B类实现了A这个接口
}
class C extends B {
//C类继承了B类,也就是说C类是B类的子类
}
==============================================分隔符
boolean res;
A a=null;
B b=null;
res = a instanceof A; //因为a是null,所以结果为false
res = b instanceof B; //因为b是null,所以结果为false
a=new B();
res = a instanceof A; //因为a是B类型的实例,B又是A的一个实现类,所以结果为true
res = a instanceof B; //因为a是B类型的实例,所以结果为true
B b2=(C)new C();
res = b2 instanceof A; //因为b2是C类型的实例,而C是B的子类,B又是A的一个实现类,所以结果为true
res = b2 instanceof B; //因为b2是C类型的实例,所以结果为true
res = b2 instanceof C; //因为b2是C类型的实例,而C是B的子类,所以结果为true
6.java中的自动拆箱和自动装箱
装箱是什么?
拆箱是什么?
装箱:就是将基本数据类型自动转换成包装类型(每个基本类型都有对应的包装类型)
拆箱:就是将包装类型自动转换成基本类型
面试题:请写出下面程序运行返回的结果
public class Main {
public static void main(String[] args) {
Integer i1 = 100;//声明一个Integer类型的变量名称为I1 这里给他赋值为100
Integer i2 = 100;//声明一个Integer类型的变量名称为I2 这里给他赋值为100
Integer i3 = 200;//声明一个Integer类型的变量名称为I3 这里给他赋值为200
Integer i4 = 200;//声明一个Integer类型的变量名称为I4 这里给他赋值为200
System.out.println(i1==i2);
System.out.println(i3==i4);
====================================
运行结果:
true
false
在这里考验的是我们对valueOf()方法的掌握
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
================
valueOf这个方法里面有一个IntegerCache这个方法
这个方法源码已经写明了通过valueOf这个方法创建Integer对象,它的范围在负127-正128之间的话会直接返回这个对象,如果超过了这个范围则回重新创建一个新的对象。
}
}
7.重载与重写的区别?(重要)
首先我们要明白重写是什么?重载是什么?
重写的字面意思就是重写一遍,也就是在子类中把父类的方法重新写一遍,在子类中继承了父类原有的方法,但是有的时候子类并不想原封不动的使用,这时候就需要进行重写,重写的条件是方法名相同,返回值类型相同,参数列表相同的情况下才可以重写。需要注意的是子类访问修饰权限不能低于父类的。
//父类
public class Father {
public static void main(String[] args) {
Son s = new Son();
s.sayHello();
}
public void sayHello() {
System.out.println("Hello");
}
}
//子类
class Son extends Father{
@Override
public void sayHello() {
System.out.println("hello by ");
}
}
重写总结:
1.发生在父类和子类之中
2.方法名,返回值类型,参数列表必须相同
3.访问修饰符权限子类不能低于父类
重载是什么?
重载发生在同一个类中,方法名相同,参数列表不同(参数类型,参数个数,参数顺序不同)均视为重载。重载对于返回值类型没有要求可以有也可以没有。
8.equals和==的区别?
==:比较的是内存中(栈)内存中存放的对象的(堆)内存中的地址,也就是比较是否是同一个对象,比较真正意义上的指针操作。
==的主意事项:1.比较操作符两端是否是同一个对象
2.两边操作类型必须是同一类型(父子类也可以)才能编译通过
3.比较的是值则比较的是值是否相等
equals:用来比较两个对象的内容是否相等,由于所有的类都是继承于java.lang.object,所以适用于所有的类,如果没有对该方法进行覆盖的话,还是调用的object中的equals方法,而object中的equals方法返回的是==的判断。
9.HashCode的作用?
什么是HashCode?HashCode是怎么使用的?
HashCode:它返回的是根据对象的内存地址换算出来的一个值
当集合需要添加新的元素的时候,对象先调用这个HashCode这个方法,定位到这个对象存放的物理位置上,接下来通过equals去判断这个位置有没有元素,如果没有元素则写进去,如果有元素则在次和新的元素进行比较如果相同就不存了,如果不同就散列到其他的位置。
10.String,StringBuffer,StringBuiled的区别?
String:是只读字符串,不是基本数据类型,属于一个对象,从底层源码看是一个final修饰的字符型数组,所引用的字符串不能被改变,每次对String操作都会生成新的String对象。
StringBuffer:继承AbstractStringBuiled类,对方法或者调用的方法加了同步锁,线程安全,效率慢
StringBuiled:继承AbstractStringBuiled类,没有锁,线程不安全,效率更高。
11.ArrayList和LinkedList的区别?
1. ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;
2. 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针;
3. ArrayList查询快,增删慢,LinkedList增删快,查询慢
12.HashMap和HashTable的区别?
1.两者父类不同,HashMap继承于AbstacrtMap类,HashTable继承于Dictionary类,不过它们都同时实现了Map,Cloneanble(可复制),Seraliziable(序列化)三个接口。
2.HashTable比HashMap对外多提供了两个接口
1.elments:该方法继承HashTable的父类也就是Dictionary这个类,该方法主要的作用是返回HashTable中的Value的枚举
2.contians:该方法主要是判断该HashTable是否包含传入的Value
3.对NULL的支持也不一样
HashTable:key和value都不能位NULL
HashMap:key可以为NULL 但是Key是唯一的,为了保持Key的唯一性,可以一个Key有多个Value为NULL。
4.安全性不同
HashMap:线程不安全,在多线程的情况下,可能会出现死锁的情况,需要开发人员自己去编写相对的处理代码。
HashTable:线程安全,因为该每个方法上面都用Synchronized关键字修饰。因此可以直接在多线程的情况下进行使用,
性能问题:HashMap的效率要比HashTable的效率高很多,因为大部分的使用场景都是单线程,如果多线程的情况下可以考虑使用ConcurrentHashMap,因为ConcurrentHashMap使用了分段锁,并不会对这个数据进行锁定。
5.初始容量大小和每次扩容的大小不同(待更新)
6.计算Hash值得方法不同(待更新)
13.Conllection和Conllections的区别?
Conllection:集合类的上集接口,子类的接口分别是:List,Set,ArrayList,LinkedList,Vertor,Stack
Conllections:集合类的帮助类,里面提供很多的方法,比如:排序,搜索,线程安全化等操作
14.Java中的四种引用?
1.强引用:
强引用:
String str = new String("str");
概述:即使OOM也就是内存不足的时候也不会被回收
软引用:
// 注意:wrf这个引用也是强引用,它是指向SoftReference这个对象的,
// 这里的软引用指的是指向new String("str")的引用,也就是SoftReference类中T
SoftReference<String> wrf = new SoftReference<String>(new String("str"));
//使用场景:创建缓存的时候可以将缓存的对象放在里面,内存不足的时候会被自动回收
概述:在内存不足的时候会被回收
弱引用:
概述:只要回收器发现了它就会将其回收
虚引用:跟弱引用的回收机制差不多,区别在于再回收之前先放入ReferenceQuene中。
15.泛型常用的特点
泛型:意味着编写的代码可以被不同类型的对象所使用。
使用泛型的好处:
用集合来举例,我们不必因为添加元素类型的不同去创定义不同类型的集合,如整数集合类,浮点数集合类等来存放整数,浮点数等不同的数据,我们只需要把底层设置为Object即可。添加的数据全部都可以通过向上转型为Object。最重要的是我们可以通过规则按照自己的想法控制存储类型。
16.Java中创建对象的几种方式
1.通过new关键字创建
2.通过反射机制
3.通过clone
4.通过序列化机制
17.深拷贝和浅拷贝的区别?
浅拷贝:被复制的对象都具有和原来对象相同的值,而所有的对原来对象引用的对象都指向原来的对象,简而言之浅拷贝仅仅复制这个对象的值,对这个对象的引用都指向原来的对象。
深拷贝:被复制的对象都具有和原来对象相同的值,而那些指向其他引用的对象都指向复制的新对象,简而言之,深拷贝就是将复制的对象的引用对象也都复制了一遍
18.final的用法
1.final修饰方法代表该方法不可以被重写
2.final修饰类代表该类不可以被继承
3.final修饰引用代表这个引用不可以改变,引用指向的内容可变
4.final修饰变量代表这个变量不可以变
5.final修饰常量代表这个常量在编译阶段会被加载到常量池中
19.线程的几种状态?
1.创建(new):创建一个线程
2.可执行(runable):线程创建之后等待其他线程调用该线程的star方法,该状态的线程位于可运行的线程池中等待被线程调度选中,获得cpu使用权
3.运行(running):可运行状态(runable)的线程获取cpu时间片,执行代码。
4.阻塞(block):即阻塞状态是指线程因为某种原因放弃cpu使用权,进入可执行状态,等待cpu重新给他使用权。
阻塞的情况分为三种:
等待阻塞:运行的线程执行o.wait方法JVM会将该线程放入等待队列。
同步阻塞:运行的线程在获取对象的同步锁时,如果该同步锁被别的线程占用,则JVM会将该线程放入线程锁池中。
其他阻塞:运行线程执行睡眠或者t.join方法,或者发除I/ O请求的时候,JVM会把线程放到阻塞阶段当睡眠状态超时或者等待线程结束,JVM会把该线程重新放到可运行阶段中。
死亡:线程run()main()方法执行结束,或者因为异常退出run()方法则该线程结束生命周期
20.Java反射作用的原理?
什么是Java反射的定义?
Java反射就是对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用任意的方法,只要给定任意名字,就可以通过反射机制来获取该类的所有信息。这种动态获取的信息以及动态调用对象的方法的功能简称为java反射机制。
使用场景:
jdbc:
Class.forName('com.mysql.jdbc.Driver.class');//加载MySQL的驱动类
Java反射的实现方式:
1.Class.forName("类的路径");
2.类名.class
3.对象名.getClass
4.基本类型的包装类,可以调用包装类的Type属性来获取该类Class的对象
Java反射的优缺点?
优点:能够运行时动态获取对象的实例,提高灵活性。
与动态编译相结合。
缺点:
反射的性能比较低,需要解析字节码,将内存中的对象进行解析,
解决方法:
通过setAccessible来关闭JDK安全检查来提升反射的响应速度
多次创建一个类的实例,会有缓存快很多。
ReflectASM工具,通过字节码生成的方式来提升反射的速度,相对来说不安全,破坏了封装性,通过反射可以获取私有的方法和属性。
21.List,Set,Map三者的区别?
List(对付顺序的好帮手):List接口存储一组不唯一可以有多个元素引用相同的对象,有序的。
Set(注重独一无二的性质):不允许重复的集合,不会有多个元素引用相同的对象。
Map(用Key来搜索的专家):使用键值对存储Map会维护与Key有关联的值,两个Key可以引用相同的对象,但是两个Key不能相同。Key是唯一的。