java面试题--基础篇


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是唯一的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
java面试题真的很多,下面我来回答一个有关多线程的问题。 在Java中实现多线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。这两种方式有何区别? 继承Thread类的方式是直接定义一个类继承Thread,并重写它的run()方法。然后创建该类的对象,并调用对象的start()方法来启动线程。这种方式简单直接,但因为Java是单继承的,所以如果某个类已经继承了其他类,就不能再直接继承Thread类实现多线程。 实现Runnable接口的方式是定义一个类实现Runnable接口,并实现其唯一的抽象方法run()。然后创建Thread类的对象,将实现了Runnable的对象作为参数传递给Thread类的构造方法。最后调用Thread对象的start()方法来启动线程。这种方式灵活性更大,因为Java允许一个类实现多个接口,所以即使某个类已经继承了其他类,仍然可以通过实现Runnable接口来实现多线程。 另一个区别在于资源共享的问题。继承Thread类的方式,不管是数据还是方法,都是线程自己拥有的,不存在共享的情况。而实现Runnable接口的方式,多个线程可以共享同一个对象的数据和方法,因为多个线程共同操作的是同一个Runnable对象。 总结来说,继承Thread类方式简单直接,但只能通过单继承来实现多线程;实现Runnable接口方式更灵活,可以解决单继承的限制,并且多个线程可以共享同一个Runnable对象的数据和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值