【Java面试基础】

1.如何理解封装、继承、多态和抽象?
封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
继承:继承是从已有类得到继承信息创建新类的过程。
多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。
抽象:抽象用 abstract 关键字来修饰,用 abstract 修饰类时,此类就不能被实例化,
2.基本数据类型和包装类有什么区别?
包装类是对象,有⽅法和字段,对象的调⽤是通过引⽤对象的地址,⽽基本类型不是。
包装类型是引⽤的传递,基本类型是值的传递。
初始值不同:int的初始值位0,boolean的初始值为false;包装类型的初始值null。
声明的⽅式不同:基本类型不需要new关键字;包装类型需要new关键字创建对象分配内存空间。
存储位置不同:基本数据类型直接将值保存在堆中;包装类型的对象存储在堆中,通过对象的引⽤来调⽤
使⽤的⽅式不同:基本数据类型直接赋值就可以;包装类型通常是在集合时使⽤。
3.重载和重写的区别?
重写:方法名、参数列表,返回类型相同的情况下,对方法进行修改或者重写。
重载:方法名相同,参数列表不同,与返回类型无关。
4.抽象类和接口类的区别?
相同点:两者都是抽象类,都不能实例化。interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。
不同点:
1.抽象类可以有构造方法,接口不能有构造方法
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须是抽象的,不能有非抽象的普通方法
4.抽象类中抽象方法的访问类型可以是public,protected和默认类型虽然(eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型,并且默认即为public abstract类型
5.抽象类中可以包含静态方法,接口中不能包含静态方法
6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型
7.一个类可以实现多个接口,但只能继承一个抽象类
5.equals与==的区别?
equals:用于比较两个对象的内容是否相等。
==:用于比较两个对象的内存地址是否相同。
6.创建数组的几种方式,有什么区别?
创建数组的三种方式:其实分为2类,一种是静态的创建,如方式一。一种是动态的创建,只不过根据写法的不同分为方式二和方式三。
方式一:在声明的时候直接就已经分配空间,并赋值,方式一是不能写成如下这种形式的。方式二和方式三,声明和内存分配是分开的。这一步是在栈空间分配一个引用,存放的是一个引用,null
到这一步的时候jvm才开始在内存堆区域分配空间,并赋值,方式二直接赋值 1,2,3 方式三 默认初始化,基本类型是 0 布尔类型是 false 引用类型为null,
7.ArrayList、LinkedList、Vector的区别,实现原理,底层结构?
1.ArrayList 底层:是数组结构,查询快,增删慢,线程不安全,效率高。
2.LinkedList底层:是链表数据结构,查询慢,增删快,线程不安全,效率高。
3.Vector 底层:是数组结构,查询快,增删慢,线程安全,效率低。
8.HashMap、ConcurrentHashMap和Hashtable的区别,原理。
1.线程安全不同:
HashMap是非线程安全的,只是用于单线程环境下;
ConcurrentHashMap是线程安全的,多线程环境下可用;
Hashtable是线程安全的,能用于多线程环境中;
2.继承的父类不同
HashMap继承自AbstractMap类。但二者都实现了Map接口。
Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类(见其源码中的注释)。父类都被废弃,自然而然也没人用它的子类Hashtable了。
3.包含的contains方法不同
HashMap是没有contains方法的,而包括containsValue和containsKey方法;
hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法。
4.是否允许null值
Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;
HashTable键值对都不能为空,否则包空指针异常。
5.计算hash值方式不同
HashMap有个hash方法重新计算了key的hash值,因为hash冲突变高,所以通过一种方法重算hash值的方法:这里计算hash值,先调用hashCode方法计算出来一个hash值,再将hash与右移16位后相异 或,从而得到新的hash值。
Hashtable通过计算key的hashCode()来得到hash值就为最终hash值。
6.解决hash冲突方式不同
HashMap中,当出现冲突时 链表+红黑树
HashTable中, 都是以链表方式存储。
9.String,StringBuilder,StringBuffer三者的区别?
String:只读字符串,一经定义无法再增删改。每次都String的操作都会生成新的String对象。
StringBuilder,StringBuffer:都继承自ABstartStringBuilder抽象类,从ABstartStringBuilder抽象类中我们可以看到:他们的底层都是可变的字符数组,所以在进行频繁的字符串操作时:建议使用
StringBuilder和StringBuffer来进行操作。StringBuffer对方法加了同步锁所以是线程安全的,StringBuilder没有对方法加同步锁,所以是非线程安全的。
10.String 类为什么是 final的?
final 修饰的类是不被能继承的,所以 final 修饰的类是不能被篡改的。因为只有当字符串不可变时,才能实现字符串池。提高程序的效率。因为字符串是不可变的,所以是多线程安全的,同一个字符串实 例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。
1.为了实现字符串池
2.为了线程安全
3.为了实现String可以创建hashcode不可变性
因为字符串时不可变的,所以在它创建的时候HashCode就被缓存了,不需要被重新计算。这就使得字符串很适合做Map的键,字符串的处理速度快过其它的键对象。
11.java异常处理有哪些,有什么用?
java异常分为三种:1.运行时异常2.被检查时异常3.错误error.
运行时异常定义:RuntimeEception及子类都被称为运行时异常,特点就是java编译器不会检擦它,如果没有throw或者try-catch捕获,它还是会通过编译,然后5种常见的运行时异常有ClassCastException(类转 换异常),IndexOutBoundsException(数组越界),NullPonintException(空指针异常),ArrayStoreException(数据存储异常).BufferOverFlowException.
异常的处理使用thow抛出,try/catch捕获

12.List、Map、Set 三个接口,存取元素时,各有什么特点?
存·:
list:用于存储一组不唯一,有序的对象。
set:存放元素不可重复。
map:存放键值对,键不可重复,值可重复。
取:取出时:
1、List取出元素:
(1)get(index)、poll()、peek()等方法;
(2)for循环;
(3)foreach循环;
(4)Iterator迭代器迭代。
2、Set取出元素:
(1)foreach循环;
(2)Iterator迭代器迭代。
3、Map取出元素:
(1)get(key)方法;
(2)entrySet()获得Set<Map.Entry<K,V>>,然后进行Set集合迭代;
(3)keySet()获得Set,然后结合get(key)方法,进行Set集合迭代;
(4).foreach(new BiConsumer(){}),进行迭代。

13.Session和 Cookie 的区别与联系?
区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
联系:
session是通过cookie来工作的
session和cookie之间是通过C O O K I E 来 联 系 的 , 通 过 _COOKIE来联系的,通过 COOKIE可以知道session的id,从而获取到其他的信息。
14.存取get和post请求的区别
区别: 1.get请求一般是去取获取数据(其实也可以提交,但常见的是获取数据);post请求一般是去提交数据。
2.get因为参数会放在url中,所以隐私性,安全性较差,请求的数据长度是有限制的,post请求是没有的长度限制,请求数据是放在body中;
3.get请求刷新服务器或者回退没有影响,post请求回退时会重新提交数据请求。
4.get请求可以被缓存,post请求不会被缓存。
5.get请求会被保存在浏览器历史记录当中,post不会。get请求可以被收藏为书签,因为参数就是url中,但post不能。它的参数不在url中。
6.get请求只能进行url编码(appliacation-x-www-form-urlencoded),post请求支持多种(multipart/form-data等)。

15.转发和重定向的区别。
区别:
1、请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
2、地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;
3、是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据
4、跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;
5、发生行为不同:重定向是客户端行为,转发是服务器端行为;
16.创建线程的方式及实现,几种方式的区别?
方式:继承Thread类、实现Runnable接口、实现Callable接口
区别:
thread类:优势是:编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread()方法,直接使用 this 即可获得当前线程。劣势是:线程类已经继承了 Thread 类,所以不能再继承 其他父类。
Runnable 和 Callable 的区别
1、Callable 规定(重写)的方法是 call(),Runnable 规定(重写)的方法是 run()。
2、Callable 的任务执行后可返回值,而 Runnable 的任务是不能返回值的。
3、Call 方法可以抛出异常,run 方法不可以。
17.sleep() 、 wait()、yield()有什么区别?
wait:让当前线程有运行状态变为等待状态,和同步一起使用。
sleep:让程序暂停一段时间,时间到了又恢复运行状态。
yield:暂停当前正在执行的线程对象,让其他有相同优先级的线程执行。它是一个静态方法而且只能保证当前线程放弃cpu占用而不能保证使其他线程一定能占用cpu。
18.为什么wait()、notify()函数定义在 Object类里面?
因为wait和notify都是锁级别的操作,所以把他们定义在object类中因为锁属于对象。
19.线程run方法和start方法的区别?
start:用于启动新创建的线程,同时start内部调用了run方法。
run:只会在原来的线程里调用,没有新的线程启动。
20.线程池的原理、几种方式,各有什么区别。
原理:JVM先根据用户给定的参数创建一定数量的可运行的线程任务,并将其放入队列中,在线程创建后启动这些任务,如果正在运行的线程数量超过了最大线程数量(用户设置的线程池大小),则超出数 量的线程排队等候,在有任务执行完毕后,线程池调度器会发现有可用的线程,进而再次从队列中取出任务并执行。

newCachedThreadPool()可缓存线程池,它是用来处理大量短时间工作任务的线程池
newFixedThreadPool()定长线程池,控制最并大数,超出会等待。
newScheduledThreadPool()定长线程池,支持定时及周期性任务
newSingleThreadScheduledExecutor()单线程化的线程池,它只会用唯一线程执行,保证了指定顺序

21.简单谈一下SpringMVC.的工作流程,bean 的生命周期。
SpringMVC的工作流程:1.用户发送请求到前端控制器DispatcherServlet。
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3.处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器一并返回给DispatcherServlet。
4.DispatcherServlet。调用HandlerAdapter处理器适配器。
5.HandlerAdapter经过适配调用具体的处理器。
6.Controller执行完成返回ModelAndView。
7.5.HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
8.DispatcherServlet将ModelAndView穿给ViewReslover视图解析器。
9.ViewReslover解析后返回具体View。
10.DispatcherServlet根据View进行渲染视图。
11.DispatcherServlet响应用户。
bean的生命周期:1.实例化一个bean。
2.Bean实例化后对bean进行属性填充。
3 .如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法。
4.如果Bean实现了BeanFactoryAware接口的话,通过传递自身的实例来调用setBeanFactory()方法。
5.如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
6.如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
7.如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
8.如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
9.此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
10.如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

22.谈一下你对aop以及ioc的理解,Java反射机制理解。
ioc:控制反转:将对象的创建,初始化,销毁交给spring来管理,而不是开发者控制。
aop:面向切面编程,filter(过滤器)也是aop的一种。aop是对oop(面向对象编程)的一种补充。aop的主要编程是切面,而切面模块化横切关注点。
java反射机制:反射机制在运行时,对于任意一个类,都能知道这个类的所有属性和方法;对于任意个对象,都能调用它的任意一个方法。
反射机制的作用:1.反编译2.通过反射机制访问java对象的属性,方法,构造方法。
反射机制优缺点:
优点:运行时动态获取类的1实例,提高灵活性;与动态编译结合。
缺点:使用反射性能低,需要解析字节码,将内存中的对象进行解析。
23.spring 注入方式有哪几种? jdk接口代理和cglib.代理区别优缺点。
构造方法注入,setter注入,基于注解注入。
1、Jdk动态代理:利用拦截器(必须实现InvocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理
2、 Cglib动态代理:利用ASM框架,对代理对象类生成的class文件加载进来,通过修改其字节码生成子类来处理
区别:jdk动态代理是由java内部反射机制来实现的,cglib动态代理底层借助asm来实现的。反射机制在生成类的过程中比较高效,asm在生成类之后的相关执行过程中比较高效。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值