java常见的面试问题_Java常见面试问题

Java常见面试问题

一、Java基础,[ORACLE官网——Java架构总概括](https://docs.oracle.com/javase/8/docs/index.html)

1.1、 面向对象和面向过程的区别

1.2、java的四个基本特性

1.3、重载和重写的区别

1.4、采用字节码的好处

1.5、构造器Constructor是否可被override

1.6、访问控制符public,protected,private,以及默认的区别

1.7、 是否可以继承String类

1.8、String和StringBuffer、StringBuilder的区别

1.9、hashCode和equals方法的关系

1.10、Java语言采用的编码方案

1.11、抽象类和接口的区别

1.12、自动装箱与拆箱

1.13、什么是泛型、为什么要使用以及泛型擦除

1.14、Java中的集合类及关系图

1.15、HashMap实现原理

1.16、HashTable实现原理

1.17、HashMap和HashTable区别

1.18、ArrayList和vector区别

1.19、Synchronized和可重入锁

1.20、servlet和filter的区别

1.21、JVM规范中,将JVM运行数据,分为几种

1.22、Http的运行过程

1.23、Object的常用方法

1.24、

1.25、

1.26、

二、Spring系列

2.1、spring的三种依赖方式

2.2、SpringMVC的运行机制

2.1、

2.1、

2.1、

2.1、

三、SpringCloud系列

3.1、feignClient的实现机制

一、Java基础,ORACLE官网——Java架构总概括

1.1、 面向对象和面向过程的区别

· 面向过程

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素

缺点:没有面向对象易维护、易复用、易扩展。

· 面向对象

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。

缺点:性能比面向过程低。

1.2、java的四个基本特性

抽象:就是把现实生活中的某一类东西提取出来,用程序代码表示,我们通常叫做类或者接口。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。

封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行封装隐藏。封装分为属性的封装和方法的封装。

继承:是对有着共同特性的多类事物,进行再抽象成一个类。这个类就是多类事物的父类。父类的意义在于抽取多类事物的共性。

多态:允许不同类的对象对同一消息做出响应。方法的重载、类的覆盖正体现了多态。

1.3、重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。

1.4、采用字节码的好处

Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。

所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

1.5、构造器Constructor是否可被override

构造器不能被重写,不能用static修饰构造器,只能用public、private、protected这三个权限修饰符,且不能有返回语句。

1.6、访问控制符public,protected,private,以及默认的区别

private只有在本类中才能访问;

public在任何地方都能访问;

protected在同包内的类及包外的子类能访问;

默认不写在同包内能访问。

1.7、 是否可以继承String类

String类是final类故不可以继承,一切由final修饰过的都不能继承。

1.8、String和StringBuffer、StringBuilder的区别

· 可变性

String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。

· 线程安全性

String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

· 性能

每次对String 类型进行改变的时候,都会生成一个新的String 对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

1.9、hashCode和equals方法的关系

equals相等,hashcode必相等;hashcode相等,equals可能不相等。

1.10、Java语言采用的编码方案

Java语言采用Unicode编码标准,Unicode(标准码),它为每个字符制订了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的使用。

1.11、抽象类和接口的区别

· 语法层次

抽象类和接口分别给出了不同的语法定义。

· 设计层次

抽象层次不同,抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

· 跨域不同

抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已,"like-a"的关系。

1.12、自动装箱与拆箱

· 装箱

将基本类型用它们对应的引用类型包装起来;

· 拆箱

将包装类型转换为基本数据类型;

Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提高了效率,由编译器来完成,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。

todo == 机制

1.13、什么是泛型、为什么要使用以及泛型擦除

泛型,即“参数化类型”。

创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换。

Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。泛型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。

类型擦除的主要过程如下:

1)将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。

2)移除所有的类型参数。

1.14、Java中的集合类及关系图

List和Set继承自Collection接口。

Set无序不允许元素重复。HashSet和TreeSet是两个主要的实现类。List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。

Map也属于集合系统,但和Collection接口没关系。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。

SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。

1.15、HashMap实现原理

HashMap基于hashing原理,通过put()和get()方法储存和获取对象。当将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用LinkedList来解决碰撞问题,当发生碰撞了,对象将会储存在LinkedList的下一个节点中。 HashMap在每个LinkedList节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的LinkedList中。键对象的equals()方法用来找到键值对。

1.16、HashTable实现原理

和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射。

Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。

Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。

1.17、HashMap和HashTable区别

1).HashTable的方法前面都有synchronized来同步,是线程安全的;HashMap未经同步,是非线程安全的。

2).HashTable不允许null值(key和value都不可以) ;HashMap允许null值(key和value都可以)。

3).HashTable有一个contains(Objectvalue)功能和containsValue(Objectvalue)功能一样。

4).HashTable使用Enumeration进行遍历;HashMap使用Iterator进行遍历。

5).HashTable中hash数组默认大小是11,增加的方式是old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数。

6).哈希值的使用不同,HashTable直接使用对象的hashCode; HashMap重新计算hash值,而且用与代替求模。

todo

hashMap的数据结构和扩容,碰撞避免等机制

1.18、ArrayList和vector区别

ArrayList和Vector都实现了List接口,都是通过数组实现的。Vector是线程安全的,而ArrayList是非线程安全的。

List第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List 认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%

1.19、Synchronized和可重入锁

可参考这里

Java中还有哪些是可重入锁

可重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。

synchronized 和 ReentrantLock 都是可重入锁。

可重入锁的意义之一在于防止死锁。

1.20、servlet和filter的区别

1.21、JVM规范中,将JVM运行数据,分为几种

Jvm在java运行时数据分为6种:

①.程序计数器:一个数据结构,保存当前正在运行的程序的内存地址。(java多线程中可用来进行线程的切换----线程切换后能回到正确的位置,线程私有);

②本地方法栈:为虚拟机使用到的本地方法服务

③运行时常量池:代表运行时每个class文件中的采用表,

④Java虚拟机栈:用于存储局部变量表,操作栈,方法返回值,基本数据类型以及对象的引用,线程私有

⑤方法堆:对象实例,线程共享

⑥方法区:虚拟机加载的内信息,常量,静态变量,编译后的变量

1.22、Http的运行过程

1.23、Object的常用方法

1.24、

1.25、

1.26、

二、Spring系列

2.1、spring的三种依赖方式

2.2、SpringMVC的运行机制

2.1、

2.1、

2.1、

2.1、

三、SpringCloud系列

3.1、feignClient的实现机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值