初级java必问必会的基础面试题

一java面向对象有哪些特征?%70 

Java面向对象的三大特征为:封装、继承和多态

1.继承:继承可以提高代码的复用性。把类与类中相同的属性抽取到父类,由子类继承父类的代码,简化开发。

继承可以解决代码的复用性,让我们的编程更加靠近人类思维。

当多个类存在相同的属性(成员变量)和方法时,可以从这些类中抽象出父类。 在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可

2.封装:封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起。

 数据被保护在内部,程序的其他部分只有通过被授权的操作(方法),才能对数据进行操作. 把数据封装私有化,只提供对应的方法进行修改。

封装的理解和好处:

1:隐藏实现细节:调用方法的人只传递参数即可,不需要关系具体实现的细节。

2:可以对数据进行验证,保证安全合理。可以在封装的内部对数据进行验证,判断数据是否合理。

3:多态(多种状态): 方法或对象具有多种形态。是面向对象的第三大特征, 多态是建立在封装和继承基础之上的。

多态的向上转型:父类的引用指向了子类的对象。

多态的向下转型:只能强转父类的引用,不能强转父类的对象。

1:一个对象的编译类型和运行类型可以不一致。 创建对象时,两边的类型可以不一致,在继承的前提条件下。

2:编译类型在定义对象时,就确定了,不能改变。 =左边的是编译类型,编译类型在定义对象时就确定了,不可以改变。

3:运行类型是可以变化的。 在运行过程中编译类型可以变化不同的子类来改变运行类型。

4:编译类型看定义时=号 的左边,运行类型看=号的右边。

二.简单描述一个java对象的创建过程? %20

1:第一步先在方法区加载类信息。(加载类名.Class,只会加载一次)。
2:在堆内存中根据类信息开辟空间,空间会有一个地址值记录。
3:堆空间刚创建时会先初始化成员变量默认值,然后在根据类信息把对应的成员变量值加载到堆空间中。
4:根据构造器传递的值,再次给堆空间赋值。堆空间中基本数据保存具体的值,String类型记录在常量池的地址值。
5:返回堆空间的地址值给自定义对象名。

三.ArrayList和LinkedList有什么区别? %50

1:底层实现结构不同:ArrayList底层实现是可变数组,Linkedlist实现是双向链表。

2:增删效率不同:ArrayList增删效率较低,底层通过数组扩容。Linkedlist增删效率较高,通过链表追加.

3:改查效率不同:ArrayList改查效率较高,Linkedlist改查效率较低。

4:如果改查的操作较多选择ArrayList如果增删的操作多,选择Linkedlist。

四.Java中抽象类和接口有什么区别?%10

语法的区别:

1:抽象类中可以有构造方法,接口中没有。

2:抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象方法。

3:抽象类中可以有普通的成员变量,接口中没有普通的成员变量。

4:抽象类中可以包含静态方法,接口中不能包含静态方法。

5:抽象类中的抽象方法的访问类型可以是public,protected,但接口中的抽象方法只能是public,默认即为public abstract类型。

6:一个类可以实现多个接口,单只能继承一个抽象类。

7:抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能public static final 类型,并且默认即为public static final 类型。

理解区别:

抽象类是对一种某事物抽象的描述,例如:动物类,植物类。

接口是对一种行为耦合的手段,例如:“飞”飞机可以飞,鸟也可以飞。

五.== 和 equals 的区别是什么?%10

== 对于基本类型来说是值比较,对于引用类型来说是比较的是地址值;
equals 默认情况下是地址值比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是对象的值是否相等。

六.final关键字 在 Java 中有什么作用?%10

1:final 修饰的类叫最终类,该类不能被继承。

2:final 修饰的方法不能被重写。

3:final 修饰的变量叫常量,常量必须初始化值,初始化之后值就不能被修改

七.说一下 HashMap 的实现原理?%20

1:HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。

2:当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。

3:当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树

八.String,StringBuilder,StringBuffer三者的区别?20%

String和StringBuilder的本质区别:

1:String是一个不可改变的字符序列,创建对象后就不可改变。

2:StringBuilder是一个可改变的字符序列。

StringBuilder和StringBuffer的区别:

1:StringBuilder和StringBuffer的功能是完全一致的。

2:StringBuffer是JDK1.0出现的,线程是安全的(同步),效率低。

3:StringBuilder是JDK1.5出现的,线程是不安全的(不同步),效率高。

九.Java中异常处理机制?%10

1:java对异常默认的处理方式,是将问题抛出给上一级
2:抛出之前,java会根据错误产生的异常类,创建出该类的对象,底层并通过throw关键字将异常抛出给上一级,不断向上抛出,直到抛给了JVM虚拟机,虚拟机拿到问题之后,就会将错误的原因和所在的位置,打印在控制台.
异常的处理方式
一、问题可以自己处理掉的
try...catch处理方式:自己将问题处理掉,不会影响到后续代码的继续执行.
二、问题自己处理不掉的
throws抛出处理方式:如果发现问题自己无法完美结局,就可以通过throw关键字,将异常对象抛出给调用者,但如果使用throw抛出异常对象,则方法上面必须进行throws的声明,告知调用者此方法存在异常.
细节:如果抛出的对象是RuntimeException,则方法上面无需throws声明.

十.创建线程有几种方式?%10

1:继承Thread类:
优点:代码简单
缺点:该类无法继承别的类
2:实现Runnable接口:
优点:继承其他类.统一实现该接口的实例可以共享资源.
缺点:代码复杂.
3:实现Callable接口
Callable中的call()方法有返回值,其他和Runnable的run()方法一样.线程池方式
优点:实现自动化装配,易于管理,循环利用资源

十一.线程的状态?%10

1:就绪(Runnable):线程准备运行,不一定立马就能开始执行。
2:运行中(Running):进程正在执行线程的代码。
3:等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。
4:睡眠中(Sleeping):线程被强制睡眠。
5:I/O阻塞(Blocked on I/O):等待I/O操作完成。
6:同步阻塞(Blocked on Synchronization):等待获取锁。
7:死亡(Dead):线程完成了执行

十二.常见的异常类有哪些?%10 

  1. NullPointerException 空指针异常
  2. ClassNotFoundException 指定类不存在
  3. NumberFormatException 字符串转换为数字异常
  4. IndexOutOfBoundsException 数组下标越界异常
  5. ClassCastException 数据类型转换异常
  6. FileNotFoundException 文件未找到异常
  7. NoSuchMethodException 方法不存在异常
  8. IOException IO 异常
  9. SocketException Socket 异常

十三.常见的设计模式?20%

1:工厂模式:一个抽象接口的实现,多个抽象接口的实现类,spring的beanFactory就是工厂模式
2:单例模式:在内存中,保证对象的实例只有一个。
3:装饰者模式:对一个类进行装饰,增强其方法行为,如Java中的IO流就使用了装饰者模式
4:代理模式:比如sping AOP使用动态代理
5:适配器模式:io流,通过继承实现将一个接口适配到另一个接口,InputStreamReader类继承Reader接口,但要创建它们必须在构造函数中传入一个InputStream的实例,InputStreamReader的作用也就是将InputStream适配到Reader
6:状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

第十四.cookie和session的区别与联系?50%

1:cookie数据存放在客户的浏览器上,session数据存放在服务器上.
2:很多浏览器限制站点最多保存20个cookie,单个cookie保存的数据不能超过4k.
3:cookie不是很安全,考虑安全应当使用session.
4:可以考虑将登录信息等重要信息存放为session,其它信息如果需要保留,可以放在cookie中.
5:session会在一定时间内保存在服务器上.
6:session会在浏览器关闭或者一段时间内销毁,也可以通过setMaxInactiveInterval(int)方法进行设置,或是通过invalidate()方法强制结束当前会话.cookie可以通过setMaxAge(int)方法设置缓存在客户端的时间.
7:一般情况下,session生成的sessionid都是保存在cookie中.

理解区别:
cookie:在客户端保存数据,不安全.只能保存字符串,且是少量数据.
session:在服务器端保存数据,安全.可以保存对象数据,数据无限制

第十五.转发和重定向的区别?20%

1:重定向是浏览器发送请求并收到响应以后再次向一个新地址发请求,转发是服务器收到请求后为了完成响应转到另一个资源。

2:重定向中有两次请求对象,不共享数据,转发只产生一次请求对象且在组件间共享数据。

3:重定向后地址栏地址改变,而转发不会。

4:重定向的新地址可以是任意地址,转发必须是同一个应用内的某个资源。

十六.JAVA反射机制提供了什么功能?50%

1:Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
2:Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。
3:Java反射机制提供如下功能:
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判段任意一个类所具有的成员变量和方法
在运行时调用任一个对象的方法
在运行时创建新类对象
4:在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。

十七.JDK1.8新特性有哪些?40%

1:新增Lambda表达式

2:新增函数式接口

3:*方法引用和构造器调用

4:新增Stream API

5:接口中的默认方法和静态方法。

6:新时间日期API

十八.Stream常用方法有哪些?20%

1:map: 用作类型转换 如把集合里面的字符串转为大写,或者一个对象的集合取几个字段转为新的对象集合
2:filter: 过滤 符合条件的集合元素保存下来,不符合条件的去掉
3:flatMap:合并集合,比如List<Album> Album里面有一LIst<Track> 对象,这个时候就能不通过循环的方式把 List<Album> 里的每一个元素的 trasks 对象组装成一个新的集合
4:reduce: reduce可以做累加运算, .reduce(0, (a,b)-> a+b);
5:count: count和size一样返回的是元素的个数
6:max,min: 求最大值和最小值,这两个方法需要传入一个comparator比较器,Comparator比较器有一个comparing() 方法 
7:anyMatch表示,判断的条件里,任意一个元素成功,返回true
8:allMatch表示,判断条件里的元素,所有的都是,返回true

十九.什么是死锁?怎么防止死锁?50%

1:当线程 A 持有独占锁a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。

2:尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。
尽量使用 Java. util. concurrent 并发类代替自己手写锁。
尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。
尽量减少同步的代码块。

二十.单例设计模式中懒汉式和饿汉式的区别?20%

1:饿汉式:

//饿汉式单例类.在类初始化时,已经自行实例化 
public class Singleton1 {  
    private Singleton1() {}  
    private static final Singleton1 single = new Singleton1();  
    //静态工厂方法   
    public static Singleton1 getInstance() {  
        return single;  
    }  
}

2:懒汉式:

//懒汉式单例类.在第一次调用的时候实例化自己   
public class Singleton {  
    private Singleton() {}  
    private static Singleton single=null;  
    //静态工厂方法   
    public static Singleton getInstance() {  
         if (single == null) {    
             single = new Singleton();  
         }    
        return single;  
    }  
}  

 1:饿汉式就是类一旦加载,就把单例初始化完成。

 2:懒汉式,只有当方法被调用的时候,才会初始化这个单例

 3:饿汉式是线程安全的,懒汉式是线程不安全的(即一个进程内有多个线程在在同时使用时可能会产生多个实例,可创建个静态内部类,产生一个单例对象,通过静态内部类返回获取这个对象)

猜你喜欢

转载自blog.csdn.net/han1725692339/article/details/126369439