==和equals方法有什么区别?
==操作符是用来比较两个变量的值是否相等,也就是用来比较变量所对应的内存中所存储的数值是否相等,比较两个基本类型的数据或两个引用的变量是否相等。<br /> equals方法是用于比较两个独立对象的内容是否相等。就好比去比较两个人相貌是否相同。通常用于比较两个对象的值是否相等。
Integer与int的区别
int是8中基本类型之一,而Integer是为int的封装类。int默认值是0 Integer默认值是null,还可以区分未赋值和值为0的区别
两个对象的HaseCode()相同,则equals()也一定为true吗?
不对, 两个对象的HaseCode()相同,equals()不一定为true;<br />当有 a.equals(b) == true 时,则 a.hashCode() == b.hashCode() 必然成立,<br />反过来,当 a.hashCode() == b.hashCode() 时,a.equals(b) 不一定为 true。
final在Java中有什么用?
final修饰的类是最终类,不能被继承。<br /> final修饰的方法。不能重写。<br /> final修饰的变量叫常量,常量必须初始化,初始化就不能被修改
抽象类必须有抽象方法嘛?
不需要, 抽象类不一定非要有抽象方法。
Java中IO流分为几种?
按照流的流向分,可以分为输入流(input) 输出流(output)
按照操作单元划分,可以划分为字节流和字符流
按照流的角色划分为节点流和处理流。
区别是在于,字节流是按照8位传输以字节输入输出 字符流是按照16位传输以字节输入输出。
InputStream/Reader;所有的输入流的基类,前者是字节输入流,后者是字符输入流
OutoutStream/Writer:所有输出流饿的基类,前者是字节输出流,后者是字符输出流。
3.1.0 BIO,NIO,AIO有什么区别
BIO:Block IO 同步阻塞式IO,就是我们平常用的传统IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:Non IO同步非阻塞IO 是传统IO的升级,客户端和服务器端通过Channel(通道) 通讯,实现了多路服用。
AIO:Asynchronous IO 是NIO的升级,也叫NIO2,实现了异步非阻塞IO,异步IO的操作基于事件的回调机制接口和抽象类的区别
抽象类可以存在普通成员,而接口只能存在public abstract()方法<br /> 抽象类的成员变量可以是各种类型的,而接口中成员变量只能是public static final类型的<br /> 抽象类只能继承一个,接口可以实现多个
普通类和抽象类有什么区别
普通类不能包含抽象方法, 抽象类可以包含抽象方法
抽象类不能被实例化,普通类可以直接实例化面向对象的特征有哪些方面
封装
封装其实是保证软件部件具有优良的模块行的基础,封装的目标为了实现软件部件的“高内聚,低耦合”,防止程序相互依赖性而带来的变动影响。
抽象
抽象就是找到一些事物的相似和的共性之处,然后将这个事物归为一个类,这个类只考虑事物的相似和共性之处
继承
继承在定义和实现一个类的时候,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要。
多态
多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定基本数据类型
byte、int、long、short、double、char、float、boolean。<br /> String类是final的,不能被继承这个类
重载和重写的区别
重载就是同样的一个方法能够根据输入数据的不用,做出不同的处理<br />重载就是发生在用一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同。<br /> 重写就是当子类继承父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就是覆盖父类方法<br />重写就是发生在运行期,是子类对父类的访问的方法的实现过程进行重写。外部样子不能改变,内部逻辑可以改变
String、StringBuilder、StringBuffer的区别
String类中使用final关键字来修饰字符数组来保存字符串,所以String对象是不可变的。<br /> StringBuffer与StringBuilder也是使用字符数组保存字符串,但是没有final关键字修饰。所以这两个对象是可变的<br /> 线程安全 <br />String中对象是不可变的,也可以理解成常量。线程安全。StringBuffer对方法加了同步锁或对调用的方法加了同步锁,是线程安全的,StringBuilder并没有对方法进行同步锁,所以是非线程安全
Java核心技术
try-catch- finally
try块 :用来捕获异常。其后可接零个或多个catch<br /> catch块:用于处理try捕获到的异常<br /> finally块: 无论是否捕获或处理异常,finally块语句都会被执行。 当在 try 块或 catch 块中 遇到 return 语句时,finally 语句块将在方法返回之前被执行。<br />
以下4种特殊情况下,finally块不会执行:
在 finally 语句块第一行发生了异常。 因为在其他行,finally 块还是会得到执行<br /> 在前面的代码中用了 System.exit(int)已退出程序。 exit 是带参函数 ;若该语句在异常语句之后,<br />finally 会执行<br /> 程序所在的线程死亡。<br /> 关闭 CPU。
throw和throws的区别
throws是用来声明一个方法可能抛出的所有的异常信息, throws是将异常声明但是不处理,而是将异常上传,谁调用我就交给谁处理。而throw则是指抛出的一个具体的异常类型
final、 finally、finalize有什么区别
final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写,修饰变量表示该变量是一个常量不能被重新赋值。
finally一般作用于try-catch代码块中,处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
finalize是一个方法,属于Object类的一个方法,而Object类是使用类的父类,该方法一般由垃圾回收器来调用,当我们调用System的gc()方法的时候,由垃圾回收器用finalize(),回收垃圾线程有哪些基本状态?
初始状态 运行状态 阻塞状态,等待状态 超时等待状态 终止状态
为什么使用线程池?
我们合理使用线程池,则可以避免把系统搞崩。
降低资源消耗,通过重复利用已创建的线程,降低 线程创建和销毁造成的消耗
提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
增加线程的可管理型。线程是稀缺资源,使用线程池可以进行统一分配,调优和监控。线程池核心属性有哪些?
threadFactory(线程工厂) 用于创建工作线程的工厂
corePoolSize(核心线程数)当线程池运行少于corePoolSize时,会创建一个新线程来处理请求,即使其他工作线程处于空闲状态
workQueue(队列) 用于保留任务并移交给工作线程的阻塞队列
maximumPoolSize(最大线程数):线程池允许开启的最大线程数。
handler(拒绝策略):往线程池添加任务时,将在下面两种情况触发拒绝策略:1)线程池运行状态不是 RUNNING;2)线程池已经达到最大线程数,并且阻塞队列已满时。
keepAliveTime(保持存活时间):如果线程池当前线程数超过 corePoolSize,则多余的线程空闲时间超过 keepAliveTime 时会被终止。线程池目前有5个状态:
RUNNING:接受新任务并处理排队的任务。
SHUTDOWN:不接受新任务,但处理排队的任务。
STOP:不接受新任务,不处理排队的任务,并中断正在进行的任务。
TIDYING:所有任务都已终止,workerCount 为零,线程转换到 TIDYING 状态将运行 terminated() 钩子方法。
TERMINATED:terminated() 已完成。
在Java程序中怎么保证多线程的安全
使用安全类,使用原子类AtomicInteger<br /> 使用自动锁synchronized<br /> 使用手动锁 Lock
创建线程的四种方式
1.继承Thread类
2.实现Runnable接口
3.使用Callable和FutureTask创建线程
4.Executors工具类创建线程池List和Set,Map的区别
List一索引来存取元素,有序的,元素是允许重复的,可以插入多个null;
Set不能存放重复元素,无序的,只允许一个null;
Map保存键值对映射,映射关系可以一对一,多对一
List 有基于数组、链表实现两种方式
Set、 Map容器有基于哈希存储和红黑树两种方式实现
Set 基于Map实现,Set里的元素值就是Map的值Hasetable和HaseMap的区别
HaseMap是HaseTable的轻量级实现,他们都完成了Map接口,主要区别是HaseMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于HaseTable
HaseMap允许将null作为entry的key或者value,而HaseTable不允许描述下JVM加载class文件的原理机制
是由ClassLoader和它的子类来实现的,JavaClassLoader是一个重要的Java运行时系统组件。负责在运行时查找和装入类文件的类。
jdk 1.8 之后新特性
lambda表达式,可以简化译名内部类的代码,允许将方法作为参数<br /> 函数式接口<br /> 方法引用和构造器调用<br /> Stream API<br /> 接口中的默认方法和静态方法<br /> 新时间的日期API
Java序列化与反序列化是什么?
Java序列化是指把Java对象转化为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程;<br /> 序列化:序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用是对象状态的保存与重建。 Java对象是保存在jvm的堆内存中,如果说jvm堆不存在啦,对象也就跟着消失啦。<br /> 反序列化:客户端从文件中或网络上获得序列化后的对象字节流,根据字节流保存的对象状态及描述信息,通过反序列化重建对象。
为什么需要序列化与反序列化?
对内存中的对象进行持久化或网络传输,这个时候都需要序列化和反序列化
序列化以后就是字节流,进行通用的格式传输或保存,传输结束后在使用反序列化还原。序列化实现的方式有哪些?
实现Serializable接口或者Externalizable接口
Java序列化中如果有些字段不想进行序列化,肿么办
使用transient关键字修饰
作用就是控制变量的序列化,在变量声明前加上关键字,可阻止该变量被序列化到文件中。只能修饰变量,不能修饰类和方法字符流和字节流的区别?
读写的时候字节流是按照字节读写,字符流按字符读写<br /> 读写文件需要对内容按行处理,一般选择字符流<br /> 只是读写文件,和文件内容无关时,字节流
Java IO都有那些的设计模式
适配器模式和装饰器模式
把一个类的接口变换成客户端期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作
装饰器模式: 一种动态地往一个类中添加新行为的设计模式,装饰器模式相比于子类更为灵活,这样可以给某个对象而不是整个类添加一些功能jvm将虚拟机分为5大区域
程序计数器,虚拟机栈,本地方法栈,Java堆,方法区
sql优化
查询尽量不要用* ,用查询的字段
使用varchar代替char 按照数据内容实际长度, char按声明大小存储设计模式
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例,比如说计数器使用单例模式保持计数器的值,并确保是线程安全的
什么是线程和进程
进程是系统执行程序的一次过程,是系统运行程序的基本单位,因此进程是动态的。
线程是比进程更小的执行单位,通常在一个进程执行的过程中会产生许多的进程为什么我们调用start方法时会执行润方法,
调用start()方法可开启一个新线程并实现称就绪状态,而run方法只是thread的一个普通方法调用
SpringCloud
服务注册与发现 服务网关 客户端负载均衡 web服务客户端 断路器 分布式统一配置管理
什么是反射
反射是指运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
静态编译和动态编译
静态编译:在编译时确定类型,绑定对象
动态编译:运行时确定类型,绑定对象反射机制优缺点
优点:运行期类型的判断,动态加载类,提高代码灵活类。<br /> 缺点: 性能瓶颈;反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的Java代码要慢很多。
Java获取反射的三种方法
- 通过new对象实现反射机制,
2. 通过路径实现反射机制
3. 通过类名实现反射机制
- 通过new对象实现反射机制,
Java创建对象有几种方式
1. 通过new创建新对象<br /> 2. 通过反射机制<br /> 3. 采用clone机制<br /> 4. 通过序列化机制
Java中实现多线程有几种方法
- 继承Thread类 重新run方法;
2.实现Runnable接口
3. 实现Callable接口
- 继承Thread类 重新run方法;
多线程有什么用?
发挥多核CPU的优势<br /> 防止线程阻塞<br /> 便于建模
在Java程序中怎么保证多线程的运行安全
使用安全类,比如Atomicinteger类<br /> 使用自动锁,比如synchronized。<br /> 使用手动类,比如Lock
线程有哪些状态
new 尚未启动
runnable 正在执行中
blocked 阻塞的(被同步锁或者IO锁阻塞)
waiting 永久等待状态
timed_waiting 等待制定时间重新被换新的状态
terminated 执行完成创建线程池有集中方式?
七种,最核心的事最后一种
ThreadPoolExecutor():是最原始的线程池创建,上面1-3创建方式都是对ThreadPoolExecutor的封装。volatile关键字的作用的什么?
在Java多线程的开发中三种特性:原子性,可见性和有序性,volatile关键字主要作用是保证内存可见性和防止指令重排序