面试题常见考点

java的优点 、Java三大特性 、Java是多继承吗?如何实现多继承?

Java最基础的类是什么?这个类有什么方法? Object提供什么方法?

访问权限修饰符有哪些? protected哪些可以访问

抽象类接口区别 Final.finally.finanize区别 、final域修饰字段能保证线程安全?为什么? 你这个情况是不安全的,final修饰对象只这个对象的引用地址不能再变,但对象里的属性值是可以重新调set方法改变的。final修饰常量才表示的是这个常量值不能变化

Int integer区别以及等于10等于1000返回值 、 int和Integer的区别,拆箱与装箱发生在什么时期

怎么判断两个对象相等 、Equals和==区别 、是否重写过equals方法

java 接口和抽象类、为什么java要有抽象类和接口这两种?抽象类和接口的区别。

对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并欢迎批评指正,不甚感激。 一.抽象类 在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

abstract void fun();

抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。 下面要注意一个问题:在《Java编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题吧,因为如果一个抽象类不包含任何抽象方法,为何还要设计为抽象类?所以暂且记住这个概念吧,不必去深究为什么。

[public] abstract class ClassName { abstract void fun();}

从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。 包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别: 1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。 2)抽象类不能用来创建对象; 3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。 在其他方面,抽象类和普通的类并没有区别。 二.接口 接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。在Java中,定一个接口的形式如下:

[public] interface InterfaceName { }

接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。 要让一个类遵循某组特地的接口需要使用implements关键字,具体格式如下:

class ClassName implements Interface1,Interface2,[....]{}

可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。 三.抽象类和接口的区别 1.语法层面上的区别 1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法; 2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的; 3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法; 4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。 2.设计层面上的区别 1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 “是不是”的关系,而 接口 实现则是 “有没有”的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。 2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。 下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

abstract class Door { public abstract void open(); public abstract void close();}

或者:

interface Door { public abstract void open(); public abstract void close();}

但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路: 1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能; 2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。 从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

interface Alram { void alarm();} abstract class Door { void open(); void close();} class AlarmDoor extends Door implements Alarm { void oepn() { //.... } void close() { //.... } void alarm() { //.... }}

String stringbuffer stringbuilder 区别 、 string可否继承,为什么不能继承,为什么这么设计,final修饰的作用。String,Stringbuffer,StringBuilder的区别,为什么被final修饰就不能被继承。 String类的intern方法的作用?字符串常量池在什么位置?String类讲了一下。new一个类会创建几个对象之类的。常量池在1.8之后放哪?

Try catch finally里面的return谁先执行

集合都有哪些接口,哪些类 、用过哪些集合类、集合框架有哪些、java集合类有哪些

容器vector、list、map、set

java的集合类,ArrayList安全版本是怎么实现的、 可以怎么加锁、arraylist的底层实现,对比set,linkedlist的优势,如果需要线程安全,采用什么。ArrayList与LinkedList的区别 、ArrayList插入无序数后如何排序

hashmap结构,线程安全吗,put方法的考察 、HashMap 的实现 、Hashmap在 1.8以前怎么解决冲突的 、HashMap怎么遍历,遍历的同时remove掉元素可以吗?

Hashmap底层 、hashmap得结构、HashMap:如何解决Hash冲突,原理等等、HashMap、ConcurrentMap在jdk1.7和1.8的区别,分段锁和CAS/synchronized 、hashmap的原理,hash冲突怎么解决,为什么默认初始容量为2的指数。HashMap底层结构,插入操作,扩容操作,为什么要扩充2倍长度 、Hashmap如何实现线程安全,concurrentHashmap原理 、hashMap的扩容机制?(2倍扩容)为什么是2倍扩容 、JDK1.7中HashMap使用的头插法还是尾插法,解释一下原因;Hashmap底层 、Hashmap为什么用红黑树,为什么链地址法可以避免冲突 、Hashmap.

用hashmap实现一张表的数据存储,key是teacher的id,value是班级。如果要判断两个teacher的id是否相同用什么方法?只需要重写hashcode方法

在hash冲突比较严重的情况下,使用拉链法解决冲突。这是如果两个key相同的对象要存入hashmap,请问会发生什么情况?答发生value值的覆盖

集合类有哪些是线程安全的(vector和hashtable) vector是怎么实现线程安全的 红黑树查找的时间复杂度 红黑树和二叉树的区别 、哪些线程安全的集合类,介绍一下

集合工具类(Collections)用过吗?用过哪些方法?打乱是哪个方法(PS:没用过不知道这个方法😓)

HashMap和TreeMap区别? TreeMap底层是什么?(红黑树还是二叉树?)

HashSet和TreeSet :新建一个 TreeMap 作为实际存储 Set 元素的容器。TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。

说出你知道的解决哈希冲突的所有方法,hashmap为什么用链地址法,链表>=8时转成红黑树,为什么用红黑树?那又小于8以后会变成链表吗?如果在6,7,8来回变会怎么样? HashMap中解决Hash冲突的方式有哪些(1.7使用拉链法,1.8使用红黑树);

JDK1.8中HashMap相比于JDK1.7有什么改进(避免循环死锁);

数据的长度是有限的,但我们可能会往数组里面添加很多数据进去,数组总有被填满的时候,那样开发地址法也不管用了,当然,实际业务中,如果可以预料数据的大小,我们可以采用这样的方式解决部分问题,但问题是这样确实不是万无一失的解决办法,

更合适的方式是什么呢?其实就是hashMap中使用较多的链地址法,也就是一开始我们图中展示的,基本结构仍然是一个数组,但是数组的每个单元维护的不再是一个个数据,而是一个个链表,也就是类似于linkedList这样的结构,当新插入的多个数据通过计算hash函数得到的是相同的数组下标时候,我们只需要把值往这个索引位置维护的链表中插入即可

hashtable解决冲突的方法 、hash冲突的解决方式;Hashtable和Cocurrenthashmap区别 、HashMap和HashTable有什么区别 、HashTable与CocurrentHashMap的有什么区别

CHM, currentHashMap得实现原理 、concurrenthashmap的原理,如何加锁,怎么获得他的size()。ConcurrentHashMap 的实现 、ConcurrentHashMap的实现以及与HashTable的区别

HashMap跟ConcurrenHashMap机制,如何保证并发的。

list的线程安全集合知道哪些?CopyOnwriteAarryList说一下。 CopyOnWriteArrayList的底层以及与vector的区别

初始化去怎么做的

1.8后,cas以及synchronized在ConcurrentHashMap中用到了哪些地方、cas用到了哪些地方、什么什么原子操作方法用过没

java重载讲一下

static关键字、final 关键字 、static关键字 、static从加载到使用, static int a = 10;会直接初始化为10吗

array和list的优缺点,使用场景

jdbc的反射

如果我们在程序运行的时候得到一个字符串,而这个字符串是某个类的类名,要实例化这个类就需要用到反射。通过反射com.mysql.jdbc.Driver类,实例化该类的时候会执行该类内部的静态代码块,该代码块会在Java实现的DriverManager类中注册自己,DriverManager管理所有已经注册的驱动类,当调用DriverManager.geConnection方法时会遍历这些驱动类,并尝试去连接数据库,只要有一个能连接成功,就返回Connection对象,否则则报异常。

异常怎么处理的、error和exception的区别

Java8接口default方法的意义(脑袋嗡嗡的)

JDK8的一些新特性在项目中有用到吗

日常中遇到过什么异常或者错误

#

用过什么设计模式,了解单例模式吗(没怎么用过,但是知道一些,没再问) 、设计模式,观察者模式 、用过什么设计模式、介绍设计模式,随便说一种 、JDK哪里用到享元模式、那里用到原型模式、单例模式

手写单模式,写了懒汉式和双重检验,问了双双重检验为什么要这么写,为什么锁住了还要加null判断 。防止在加锁的时候另一个线程刚好创建了一个实例

git命令

git常用命令?tag标签?分支

讲一讲红黑树的特点

介绍链表、平衡二叉树、红黑树的时间复杂度。链表的时间复杂度对插入,修改为O(1),查询为O(N),平衡二叉树为O(logN),红黑树我就介绍了下概念,

说是特殊的二叉排序树,以及根节点,叶子结点粉笔是什么颜色的结点以及规则。时间复杂度说不太了解使用的少。

红黑树原理?跟二叉树的区别?

1.Nio,AIO,BIO

讲一下java的线程安全

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

线程

并发,为什么要用多线程?多线程的好处?最大化利用CPU和CPU时间片

介绍多线程

JAVA中的线程

多线程和单线程的区别: 一个数据集进行排序,使用单线程还是多线程处理,他们的优劣

多线程编程的好处是什么? --充分利用并发

进程与线程的区别,进程切换需要切换哪些,线程共享进城什么?父进程的意义?子进程会得到父进程哪些?

进程(Process):进程是程序的一次执行。

线程(Thread),线程可以理解为进程中的执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:

进程间是独立的,这表现在内存空间,上下文环境;线程运行在进程空间内。

一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。 同一进程中的两段代码不能够同时执行,除非引入线程。

线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。 线程占用的资源要少于进程所占用的资源。 进程和线程都可以有优先级 在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。

进程通信方式

创建线程所消耗的资源:

还会涉及到CPU时间问题,创建过多的线程,会在线程切换的时候消耗CPU工作时间,当线程数达到一个极限值以后CPU就会什么都不用做了,只是在切换每一个线程,但是每个线程都没有实际的执行。 一般来说将线程数设置为CPU的2倍我认为是比较合理的,或者比CPU稍微多一点点。

线程所具有的资源:程序计数器、寄存器、栈。

这些线程具有自己的程序计数器、栈。但严格来说这些东西还在同一块内存区域上。所以不同线程之间是可以相互访问到的,虽然你不会这样做。

使用多线程的原因:

1.IO并发,可能是使用线程最多的地方

2.多核并发,(并行化)

3.易用性

线程的实现方式,有什么优缺点。

开启线程的方法、runnable和callable的区别

继承Thread类、实现Runnable接口、实现Callable接口,重写call()方法,在main函数中调用start()方法。

相同点:

  1. 两者都是接口;

  2. 两者都可用来编写多线程程序;

  3. 两者都需要调用Thread.start()启动线程;

不同点:

  1. 两者最大的不同点是:实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果;

  2. Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛;

注意点:

  • Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞!

多线程在jvm中的具体调用情况 threadlocal

进程 / 线程

线程方法

wait()和sleep()的区别?java并发 wait 和sleep的区别

wait和sleep的区别

Wait(),sleep()区别?

ThreadLocal讲一下?

谈谈volatile关键字、讲一下volitale关键字,说一下为什么不保证原子性。 vector的底层原理、volatile的具体使用场景 、volatile的内部原理:JMM内存模型,冲刷线程中的缓存。

加锁方式

volatile,为什么单例模式二重校验锁下实例要声明为volatile

java中的锁机制 、 锁有哪些 他们的区别 哪个锁比较弱 lock的源码看过吗

Java中有哪些锁(我回答了synchronized,然后说了锁升级的过程,又说了ReentrantLock)

乐观锁和悲观锁,哪些锁是乐观锁,哪些是悲观锁(我说synchronized是悲观锁,乐观锁有哪些锁不了解)   

Java中包含的锁有哪些

  • 公平锁/非公平锁

  • 可重入锁

  • 独享锁/共享锁

  • 互斥锁/读写锁

  • 乐观锁/悲观锁

  • 分段锁

  • 偏向锁/轻量级锁/重量级锁

  • 自旋锁

乐观群与悲观锁的区别,使用场景,例子。

自旋锁这种设计有用吗?占用cpu,为什么呢?

问synchronized底层实现,偏向锁、自旋锁、轻量级锁、重量级锁,能否从重量级到轻量级,synchronized加在类和方法上的区别;为什么是可重入的?不可中断解释一下。synchronized,说一下它的锁的不同粒度

Synchronized用法,锁。

CAS底层通过什么实现 :发现AtomicBoolean的compareAndSet()调用的是unsafe里的compareAndSwapInt()方法,.unsafe是AtomicBoolean类中的静态成员变量。unsafe的compareAndSwapInt()方法是native方法。不同不同操作系统, 不同的处理器, 都要走不同的编指令cmpxchg()方法的实现.

synchronized,锁升级,讲一讲轻量锁与偏向锁,两个线程在轻量锁下有什么操作

synchronized和reentrantlock的区别,当都被interrupt时,有什么区别 、sychronized和lock、synchronized和reentrantLock的区别 --先说到了自旋锁

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值