博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 面试
阅读量:4363 次
发布时间:2019-06-07

本文共 8330 字,大约阅读时间需要 27 分钟。

接口的意义 统一访问 java不支持多继承 但是可以实现多个接口 可以看成实现多继承的一种方法 一个接口有多个实现 可以达到解耦的效果

抽象类的意义 为子类提供一个公共的类型 封装子类中重复的内容 包括成员变量和方法 实现代码的复用

接口和抽象类的区别 接口是对动作的抽象 抽象类是对根源的抽象 接口可以多继承 抽象类不行 接口方法一般不能实现(除非default关键字)抽象类可以部分实现 接口中的变量是 public static final 类型 抽象类中的变量可以是各种类型

内部类的作用 可以实现很好的隐藏(一般的非内部类是不允许有private或者protected修饰的) 拥有外部类所有元素的访问权限 实现多继承 不修改接口的情况下实现同一个类中两个同名方法的调用(比如一个类继承一个类且实现一个接口 但父类和接口中有同名方法 此时可以外部类继承 内部类实现接口)

父类静态方法能否被子类重写 为什么 不能 静态方法从程序运行后就分配了内存 也就是写死了 所有引用该方法的对象所指向的都是同一块内存数据

java中集合和继承的关系

java虚拟机的特性 ?

哪些情况对象会被垃圾回收机制处理掉 内存不足 对象不再被使用且其引用不再被持有 弱引用

进程和线程的区别 进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体 是CPU调度和分派的基本单位 进程拥有资源 线程拥有少量必须的资源 但可以和同属一个进程的其他线程共享进程拥有的全部资源 一个程序至少有一个进程 一个进程至少有一个线程 线程的划分尺度小于进程 使得多线程的程序并发性高 进程在执行过程中拥有独立的内存单元 而多线程共享内存 从而提高运行效率 线程执行开销小 但不利于资源的管理和保护 而进程相反

==和equals equals和hashCode 基本数据类型用==去比较 比较的事他们的值 ==比较对象 比较的是对象的引用 也就是栈中的值(是否为同一个对象) equals没有复写的情况 比较的也是是否为同一个对象 既栈中的值是否相同 与==等效 equals若复写 则要看具体代码了(Sring的equals 先比较是否同一个对象 再比较对象是否为String 再判断长度是否相等 再判断字符是否相同) hashCode 返回一个数值(在对象的内存地址上经过一个特定的算法返回一个hash码)

常见排序算法的时间复杂度

java基本数据类型占用字节数 1字节 byte boolean 2字节 short char 4字节 int float 8字节 long double

int和Integer区别 int是基本数据类型 Integer是int的包装类 Integer变量需要实例化才能使用 int不需要 Integer是对象的引用 int是直接存储的数值 Integer默认值null int默认0

String StringBuffer StringBuilder区别 String字符串常量 每次改变都会新建一个对象 StringBuffer字符串变量 线程安全(方法加锁 所以速度会慢) StringBuilder 非线程安全(方法没加锁 所以会快) 少量数据用String 单线程大量操作用StringBuilder 多线程大量操作用StringBuilder

java三大特性 封装:将类的信息隐藏在内部 不允许外部直接访问 通过该类的方法实现对隐藏信息的操作和访问 好处:实现专业分工 减少耦合 类的内部结构能够自有修改 可以对成员进行更精准的控制 继承:从已有的类中派生出新的类 新的类可以吸收已有类的数据属性和行为 并扩展出新的能力 好处:避免了对类之间共同特征的重复描述 继承关系是传递的 提高了代码的复用 减少代码和数据的冗余 增加程序的重用性 多态:同一个行为的不同表现 存在条件:继承 重写 父类引用指向子类对象 多态的实现:重写 接口 抽象类和抽象方法 好处:使程序有良好的扩展 并可以对所有类进行通用处理

什么导致线程阻塞 执行了Thread.sleep方法 执行了wait方法 直接进入阻塞状态 线程执行了一段同步锁 但尚且无法获得相关同步锁 只能进入阻塞状态 执行某些IO操作 因为等待相关资源而进入阻塞状态 比如监听System.in 但没有接受到键盘的输入 进入阻塞状态

java基本数据类型封装类 Integer Short Long Byte Float Double Character Boolean

java多线程 锁 synchronized(this) synchronized(其他对象) synchronized 非静态方法 以上持有对象锁

synchronized 静态方法 synchronized(.class) 以上持有类锁 每个类只有一个类锁 每个对象只有一个对象锁 互不影响 忘记可以参考https://www.cnblogs.com/edwardru/articles/6030686.html

object有哪些公用方法 clone 浅拷贝 需要实现Cloneable接口 否则抛出异常(CloneNotSupportedException) getClass final 获得运行时的类型 toString 一般子类都有覆盖 finalize 用于释放资源 因为无法确定该方法什么时候被调用 所以很少使用 equals hashCode 用于哈希查找 可以减少在查找中使用equals的次数 重写equals方法一般就要重写hashCode方法 wait 使当前线程等待该对象的锁 一直wait 知道获得锁或者被中断 notify 唤醒在该对象上等待的某个线程 notifyAll 唤醒该对象上所有等待的线程

java 四种引用 强引用 如果对象具有强引用 则GC不会回收 软引用 内存足够就不回收 可用来实现内存敏感的高速缓存 弱引用 一旦GC扫描到 便会被回收 虚引用 相当于没有引用任何时候都有可能被回收

hashCode的作用 hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable 也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用 equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的 hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode 值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题。这样一来实际调用 equals方法的次数就大大降低了

try catch finally try里面有return finally还执行么 程序会先执行return之前的语句 包括return语句中的表达式 再执行finally 再执行return 任何执行try和catch中的return语句之前 都会先执行finally 如果finally存在 如果finally中有return语句 那么程序就return了

Exception和Error包结构 OOM遇到过哪些 SOF遇到过哪些

Throwable是 Java 语言中所有错误或异常的超类。 Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息 Java将可抛出(Throwable)的结构分为三种类型: RuntimeException及其子类都被称为运行时异常 运行时异常(RuntimeException) RuntimeException及其子类都被称为运行时异常 编译器不会检查它 也就是不throw或者try catch也能编译通过 被检查的异常(Checked Exception) Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常 编译器会检查它 要么throw 要么try catch 错误(Error) Error类及其子类 和运行时异常一样,编译器也不会对错误进行检查

重载和重写的区别 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。 重写方法名称、参数个数,类型,顺序,返回值类型都是必须和父类方法一致的。它的关系是父子关系

static class 和non static class区别 用static修饰的只能是内部类 不需持有外部类的引用 只能访问外部类的静态数据和方法 非静态内部类持有外部类的引用 能访问外部类的所有方法和变量 不能脱离外部类实体被创建

java实现多线程的三种方式 继承Thread 重写run方法 实现Runnable接口 实现callable接口通过FutureTask包装来创建线程

ThreadLocal的设计理念与作用 共享资源这么困难,那么就干脆不要共享,何不为每个线程创造一个资源的复本。将每一个线程存取数据的行为加以隔离,实现的方法就是给予每个线程一个特定空间来保管该线程所独享的资源 顾名思义它是local variable(线程局部变量)。它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量 它主要由四个方法组成initialValue(),get(),set(T),remove(),其中值得注意的是initialValue(),该方法是一个protected的方法,显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值,这个方法是一个延迟调用方法,在一个线程第1次调用get()或者set(Object)时才执行,并且仅执行1次。ThreadLocal中的确实实现直接返回一个null ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本

ThreadPool(线程池)用法与优势 合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控

wait和sleep的区别 wait来自object sleep来自Thread sleep没有释放锁 wait会释放锁 wait notify notifyall 只能在同步方法或同步代码块执行 sleep可以任何地方 sleep需要捕获异常 wait不需要 补充:yield 方法是停止当前线程 让同等优先级或更高优先级的线程有执行的机会 如果没有那么yield将不起作用 并且由可执行状态马上变为执行状态 join方法用于在某一个线程执行过程中调用另一个线程执行 等到被调用的线程执行结束后 再执行当前线程

foreach和普通for循环效率对比 需要循环数组结构的数据(比如ArrayList)时建议采用for循环 因为for循环采用下标访问 需要循环链表结构的数据(比如LinkList)时采用foreach foreach采用的是迭代器 可以下标访问用for 不能下标访问 需要指针访问时用foreach

java 反射 定义:在运行状态中 对于任意一个类 都能知道这个类的属性和方法 对于任意一个对象都能调用他的任何属性和方法 作用:只要给定全类名 就可以通过反射获取所有类的信息 可以动态的创建对象和编译 原理:JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。

常用泛型特点 List 能否转化为List ?

死锁的必要条件 怎么处理 https://blog.csdn.net/rabbit_in_android/article/details/50530960

进程的几种状态 运行(已获得必要的资源 占用处理机 处理机正在执行该进程) 就绪(进程等待分配CPU) 阻塞(等待某个事件) 挂起(在执行状态的进程通过挂起即可进入就绪状态,就绪状态和阻塞状态都分为活动态和静止态。由活动态向静止态转换就是通过挂起实现的) 创建(进程已拥有了自己PCB,但进程自身还未进入主存,即创建工作尚未完成,进程还不能被调度运行) 终止(当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结)

IPC通信的几种方式 https://blog.csdn.net/q5390498/article/details/50837699

什么是虚拟内存 https://www.cnblogs.com/java2016/p/5551573.html

虚拟地址 逻辑地址 线型地址 物理地址 https://www.cnblogs.com/zengkefu/p/5452792.html

字符串操作 https://blog.csdn.net/u012369373/article/details/49894551

找出 10亿条数据中最大的1000个 https://blog.csdn.net/zyq522376829/article/details/47686867

计算int里面的二进制有几个1 https://zhidao.baidu.com/question/1370480689655286419.html

main函数相关 http://www.jb51.net/article/78360.htm

如果重写一个对象的equals方法 还要考虑什么 重写equals方法的要求: 1、自反性:对于任何非空引用x,x.equals(x)应该返回true。 2、对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。 3、传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。 4、一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。 5、非空性:对于任意非空引用x,x.equals(null)应该返回false。 当然还要复写hashCode方法

java的一次编写处处运行时如何实现的 https://blog.csdn.net/liufang1a2b/article/details/47279151

ResourceBundle https://blog.csdn.net/revivedsun/article/details/51330396

java为什么没有全局变量 ?

Local是什么 https://blog.csdn.net/revo/article/details/651998

面向对象编程的原则是什么 单一职责原则 开闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 最少知识原则 https://blog.csdn.net/zcxwww/article/details/51406226

静态类型的特点 静态变量是和类绑定到一起的,而不是类的实例对象。每一个实例对象都共享同样一份静态变量。也就是说,一个类的静态变量只有一份,不管它有多少个对象。类变量或者说静态变量是通过static这个关键字来声明的。类变量通常被用作常量。静态变量通常通过类名字来进行访问。当程序运行的时候这个变量就会创建直到程序结束后才会被销毁。类变量的作用域和实例变量是一样的。它的初始值和成员变量也是一样的,当变量没被初始化的时候根据它的数据类型,会有一个默认值。类似的,静态方法是属于类的方法,而不是类对象,它的调用并不作用于类对象,也不需要创建任何的类实例。静态方法本身就是final的,因为重写只会发生在类实例上,静态方法是和类绑定在一起的,不是对象。父类的静态方法会被子类的静态方法屏蔽,只要原来方法没有声明为final。非静态方法不能重写静态方法,也就是说,你不能在子类中把一个静态方法改成实例方法。 非静态变量在每一个对象实例上都有单独的一份值

&和&&区别 对于:& -- > 不管怎样,都会执行"&"符号左右两边的程序 对于:&& -- > 只有当符号"&&"左边程序为真(true)后,

java是如何处理整型溢出和下溢的 Java根据类型的大小,将计算结果中的对应低阶字节存储到对应的值里面。

静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢? 当类加载器将类加载到JVM中的时候就会创建静态变量,这跟对象是否创建无关。静态变量加载的时候就会分配内存空间。静态代码块的代码只会在类第一次初始化的时候执行一次。一个类可以有多个静态代码块,它并不是类的成员,也没有返回值,并且不能直接调用。静态代码块不能包含this或者super,它们通常被用初始化静态变量。

jvm和dvm的区别 jvm基于栈 编译和运行都会慢些 dvm基于寄存器 编译和运行都会快些 jvm执行的是.class文件 dvm执行的是 .dex文件 jvm只能运行一个实例 也就是所有的应用都运行在同一个jvm中 dvm一个应用启动都运行在单独的虚拟机中

volatile https://www.cnblogs.com/zackey/p/6424722.html

java对象的生命周期 https://blog.csdn.net/sodino/article/details/38387049

类加载器与双亲委派模型 https://www.jianshu.com/p/5f79217f2e18 https://www.cnblogs.com/wxd0108/p/6681618.html

jvm内存区域 开线程影响哪块区域 https://www.jianshu.com/p/ece1bb5fa88b

进程调度 https://blog.csdn.net/baidu_32045201/article/details/78634519

并发集合 http://www.importnew.com/24594.html

cas https://www.jianshu.com/p/fb6e91b013cc

开启线程的方式 https://www.cnblogs.com/felixzh/p/6036074.html

java注解 https://blog.csdn.net/u014563989/article/details/60570794

ReentrantLock https://blog.csdn.net/albertfly/article/details/52403508

java内存区域划分 https://www.cnblogs.com/whgk/p/6138522.html

NIO http://www.importnew.com/19816.html

垃圾收集器 http://www.importnew.com/23752.html

String为什么要设计成不可变的 https://blog.csdn.net/renfufei/article/details/16808775

转载于:https://juejin.im/post/5ac6be206fb9a028cb2ddda3

你可能感兴趣的文章
TCP/IP协议1
查看>>
Kubenertes资源分配之Request和Limit解析
查看>>
java extends和implements区别
查看>>
转-网站发布“试图加载不同的格式”解决
查看>>
bzoj [SDOI2014]数表 莫比乌斯反演 BIT
查看>>
PAT1099
查看>>
64位操作系统下启用32位模式
查看>>
当你没有能力去改变别人命运的时候 就不要随意去伸出援手......
查看>>
yaml中使用harbor
查看>>
小米Adnroid默认禁止悬浮框的使用,导致开发的悬浮框无法接收事件
查看>>
2、连接MongoDB服务器
查看>>
作业三
查看>>
动态生成Excel到客户端
查看>>
计蒜客 蒜头君的兔子
查看>>
七步从AngularJS菜鸟到专家(4和5):指令和表达式
查看>>
java httpclient post xml demo
查看>>
Git commit 提交信息有误,撤消 操作
查看>>
最长上升子序列的二分优化
查看>>
Struts2中一个action调用多个方法以及动态方法的调用
查看>>
调用webservice
查看>>