java面试题整理

Continue 和break的区别:

Break和continue都起到跳出循环的作用。
Continue用在循环中,在需要结束当前循环并且继续进行下一层循环的时候使用。在多层循环中可以使用continue lable结束多层当前循环并继续进入下一次循环。

Break也用在循环中,在需要结束当前循环并 跳出当前循环时使用。在多层循环中可以使用break lable跳出多层循环。

Break还可以用在switch语句中,跟在case语句块之后,结束当前循环,如果不加break,会继续执行下一个case语句块。

数组和集合 数据结构

数组和集合的区别

问的是数组和ArrayList的区别 回答思路:

1.初始容量,是否可以自动扩容
集合创建时会有一个初始容量,并且可以进行自动扩容,数组不可以进行自动扩容,初始容量在声明规定,但是可以使用Array.copyof()方法进行手动扩容 二者的扩容原理都是基于System.arraycopy()方法实现扩容
注:ArrayList在构建时会分配一个初始容量,为10
2.内存结构
都是连续的内存结构,并且内存空间都分布在堆中
3.数据类型
集合里不能放基本数据类型,只能放引用数据类型,数组里可以放基本数据类型和引用数据类型
注:基本数据类型存储在栈中,引用数据类型存储在堆中

各种数据类型的数组的默认初始值

int :0 double:0.0 boolean:false char:空字符(ASCII码值为0的)

面向对象与面向过程的区别:

面向对象的细节是由面向过程实现的,面向过程构成了面向对象,二者是部分与整体的关系,面向过程是部分,面向对象是整体。用车子举例子。

什么是对象、什么是类、对象和类的区别/关系

1.类是抽象的,对象是具体的
2.先有类后有对象,类是对象的模板(根据类去创建对象)
3.类的初始化比对象的初始化要早
注: 对象在new的时候初始化,会调用类的构造方法和代码块(代码块是只由大括号包 起来的部分 例如:{代码块})
运行顺序:实际运行顺序:构造方法--->代码块
运行输出结果:代码块--->构造方法
类在初始化时会调用静态代码块(只会运行一次) static{静态代码块}
4.类方法(静态方法)被static修饰,可以直接通过类名.类方法()调用
5.对象方法(对象方法)通过对象.对象方法()或new 类().对象方法()调用

什么是引用、为什么要使用引用、垃圾回收

1.创建对象时,对象在堆中,需要定义一个变量指向堆里的对象的内存,以反复调用堆里 的对象,这个变量就是对象的引用。
2.如果没有引用指向的对象,则这个对象可能会被标记为垃圾

如何理解封装/什么是封装?

从修饰符来说:public protected default private
举例:手机(暴露各种接口但是不告诉你具体实现细节)
如何理解继承/什么是继承?
1.类可以单继承其他的类,可以多实现接口,接口之间可以多继承
2.Private修饰的 不可以被继承,final修饰的方法也不可以继承
3.子类可以重写父类的方法
4.所有类的父类都是Object
5.子类可以继承父类所有的方法和属性
6.Super 与 this 的区别
7.继承可以避免代码冗余,可以对父类的方法进行拓展,
Super 与 this 的区别
构造方法中:super() this()
普通方法中:super. this.

如何理解多态/什么是多态?

前提条件:
多态发生在继承关系中
子类重写父类的方法
父类(类,接口,抽象类)引用指向子类对象

多态的含义:
同一个类型的引用,调用相同的方法 运行结果不同

应用:
一个父类有多个子类,且子类有共同方法但运行结果不同时,写一个父类类型的形参 的方法去调用共有的 方法,但是调用的时的实参是子类对象

如何理解重写和重载

1.前提条件:重写发生在在继承时,重载发生在同一个类内部,
2.使用方法:
重写:子类有一个与父类同名且参数类型与个数都相同的方法(如果父类有返回值,则子类重写的方法的返回值类型应该与父类一致),此时叫做子类重写父类该方法(子类的方法的修饰符要么与父类相同,要么比父类开放程度更大一些)
重载:方法名相同而参数类型或参数个数不同(与返回值类型无关)
3.使用情景:
重写:不满足当前条件时,可以重写(重写较多的:toString方法,equals方法)
重载:(方便别人进行开发)

抽象类与接口的区别

1.抽象类单继承,接口多实现,接口之间可以多继承
2.抽象类可以定义任何变量和常量,接口只能定义被static final 修饰的常量
3.抽象类可以定义抽象方法和普通方法,接口只能定义抽象方法,在jdk1.8之后可以定义被default关键字修饰的普通方法
4.抽象类可以只定义普通方法也可以之定义抽象方法
5.抽象类不能被实例化,只能被继承,如果想实例化,需要被继承并重写全部的抽象方法
什么时候用抽象类,什么时候用接口
理解层次一:有接口尽量用接口,不要用抽象类(原因:抽象类单继承,接口多实现)
理解层次二:接口与抽象类都要使用(Javaweb讲)HTTPServlet类就是,重写了Service方法
理解层次三:自己的认识
各有各的用处,相辅相成:二者都有自己的局限性(接口无法定义除default修饰以外的普通方法,抽象类只能单继承)

Java中怎样实现多继承:

接口:可以多实现 接口之间可以多继承 (接口可以替代抽象类的原因)
继承:叠加父类
Static 和final的区别
Static 静态 类的属性,类的方法 修饰的属性、方法在类初始化的时候进行初始化。
Final修饰的类不能被继承,修饰的方法不能被重写,修饰的成员变量的值不能改变
抽象类不能用final修饰

开发中要注意:设计常量 通常用static final修饰,作为一种工具去使用

Error与exception的区别

Error是错误,指与内存相关的严重问题 ,exception是异常,分为运行时异常与编译时异常
Error只能通过手动修改代码进行处理,exception可以通过try catch解决,也可以使用throws向上抛出
相同点:父类都是throwable

Throw、throws、throwable的区别

Throw :捕获到异常后,抛出异常
Throws:写在方法名后面,声明异常
Throwable:所有异常的父类

Final,finally,finalize的区别

Final:修饰符,修饰变量,方法,类
Finally:捕获异常时无论是否捕获成功 都要运行finally代码块 先运行finally在运行return
Finalize:与垃圾回收有关,当垃圾回收时会调用finalize方法

Collection与collections的区别

Collection是list与set集合的父类
Collections是操作集合的工具类

Object工具类

为什么要设计object座位所有类的父类
1.多态相关
2.配合集合使用
3.包含了一些基础的方法

Object特别重要的方法

Equals hashcode 与集合相关,例如set集合:equals相等则不能存储到set集合里

为什么要用包装数据类型,而不用基本数据类型(包装数据类型与基本数据类型的区别)

初始化默认值不同,包装数据类型默认值为null
集合只能装包装数据类型
包装数据类型提供了一些方法和属性

Collection集合

Collection集合如何让遍历

三种方法:for foreach 迭代器

为什么可以使用迭代器遍历

因为collection实现了iterator接口

什么是迭代器/什么是迭代器模式

不用知道里面的内容就可以遍历

Set与list的区别:

Set是无序的,list是有序的

Hashset与treeset的区别

Hashset与treeset都是无序的。
Hashset效率高于treeset(hashset底层原理是hashmap,treeset底层原理是红黑树)

Linkedlist与arraylist的区别

Linkedlist 双链表结构 增删快,查找满 栈内存 push、pop方法
ArrayList 数组结构 增删慢,查找快
注:两个栈可以模拟队列(存在第一个栈中,取出时,先全部放入第二个栈中,在从第二个栈取数据,就可以实现队列的先进先出)

Map集合

Hashmap treemap
存储方式是(key,value)键值对的形式,key值不能重复
Hashmap的key、value可以为空
Treemap的key值不能为空,value值可以为空

Map集合遍历

三种方式:
1.Key放到set集合中 keyset()方法
2.Key、value键值对看做整体放到set中 entryset()方法
CSDN:https://blog.csdn.net/qq_43980232/article/details/104594850

Servlet生命周期三个阶段

1.初始化 先实例化,然后调用init()方法
2.处理请求 调用service()方法
3.销毁 调用destroy()方法
注:servlet有两种初始化方式
积极加载式(服务器开启后自动初始化)
懒加载式(当用户第一次访问时初始化)(默认为懒加载式,可通过loadOnStarUp配置为积极加载式)

多线程

每个用户访问服务器,就是一条线程,多个用户同时访问,需要进行多线程处理,解决办法是加锁(synchronize),加锁有两种方式(局部锁,方法锁)。
线程安不安全的问题就是线程并发访问同一资源的问题,通过加锁(synchronize)解决,synchronize(this),注意this必须是同一个对象,否则无法加锁。加锁时,会在锁对象上加一个标志位(0/1),0标志未上锁,可以被线程访问,1标志已上锁,不可以访问,当一个线程访问时,会将标志位置1,此时,如果有其余线程申请访问,发现标志位为1,则禁止访问,直到正在访问的线程结束访问(归还锁)后,将标志位置为0,其余线程才可以进行访问。

局部锁:

Synchronize(this){} this是锁对象

方法锁:

Public synchronize void A(){} 类(this)是锁对象

Request、session、servletContext生命周期

Request:当次访问
Session:当次会话
servletContext:服务器开始到关闭

Request.getParameter()与request.setAttribute()

相同点:
都可以存储key,value形式的值
不同点:
赋值时机位置不同,getParameter()在前台获得页面中form表单里标签name value的值和地址栏中url?key=value&key2=value2
request.setAttribute()在后台获得request对象之后才能进行赋值,在生命周期内使用request.getAttribute()取值。
session和servletcontext也有setAttribute()和getAttribute()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值