马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
系列文章目次
Java口试题·区别题·JavaSE
前言
本文先容JavaSE区别题。
什么是区别题呢?
就是“请你先容一下面向对象编程和面向过程编程的区别和接洽?”这种标题。
private/默认/protected/public权限修饰符的区别
public修饰符表现全部人皆可直接访问
protected修饰符表现本类和子类可以直接访问
默认修饰符表现本包下的类可以直接访问
private修饰符表现只有自己可以直接访问
&和&&区别和接洽,I和II区别和接洽
|和||的区别和接洽与&和&&的区别和接洽类似,下面我们用&和&&举例
&和&&的接洽:
&和&&都可以用作逻辑与运算符,但是要看使用时的详细条件来决定。
情况1:当上述的利用数是boolean范例变量时,&和&&都可以用作逻辑与运算符。
情况2:当上述的表达式结果是boolean范例变量时,&和&&都可以用作逻辑与运算符。
表现逻辑与(and),当运算符双方的表达式的结果或利用数都为true时,整个运算结果才为true,否则,只要有一方为false,结果都为false。
&和&&的区别:
1、&逻辑运算符称为逻辑与运算符,&&逻辑运算符称为短路与运算符,也可叫逻辑与运算符。
&:无论任何情况,&双方的利用数或表达式都会举行盘算。真假逻辑与&&雷同。
&&:当&&左边的利用数为false或左边表达式结果为false时,&&右边的利用数或表达式将不参加盘算,此时终极结果都为false。&&服从更高。
2、&还可以用作位运算符。当&双方利用数或双方表达式的结果不是boolean范例时,&用于按位与运算符的利用。
if和switch的差别之处
同
if和switch都是做选择结构的
异
if一样平常用来实现范围判定,switch一样平常用来实现单数值判定,但switch也能实现范围判定
if的判定条件只能继承boolean型,switch的判定条件一样平常为int型,但也可以是short、char、byte、罗列范例(1.5后)、String(1.7后)
switch会用到break来退出选择结构,如果没有break跳出,会实行下面case里的语句,if不会用
==和equals的区别和接洽
==
1、根本范例,比力的是值
2、引用范例,比力的是地点
3、不能比力没有父子关系的两个对象
equals()
1、体系类一样平常已经覆盖了equals(),比力的是内容。
2、用户自界说类如果没有覆盖equals(),将调用父类的equals(好比是Object),而Object的equals的比力是地点(return (this == obj);)
3、用户自界说类必要覆盖父类的equals()
留意:Object的==和equals比力的都是地点,作用雷同
数组做形参和可变参数做形参接洽和区别
接洽:
1、实参都可以是数组
2、方法体中,可变参数当做数组来处理处罚
区别:
1.个数差别 可变参数只能有一个 数组参数可以多个
2.位置差别 可变参数只能是末了一个 数组参数位置恣意
3.实参差别 可变参数实参可以0,1,2…个,也可以是一个数组,数组的实参只能是数组
接口和抽象类的异同之处
雷同点
抽象类和接口均包罗抽象方法,类必须实现全部的抽象方法,否则是抽象类
抽象类和接口都不能实例化,他们位于继承树的顶端,用来被其他类继承和实现
两者的区别重要体现在两方面:语法方面和计划理念方面
语法
接口中只能界说全局静态常量,不能界说变量。抽象类中可以界说常量和变量。
接口中全部的方法必须都是抽象方法。抽象类可以不都是抽象方法。
抽象类中可以有构造方法,但不能用来实例化,而在子类实例化是实行,完成属于抽象类的初始化利用。接口中不能界说构造方法。
一个类只能有一个直接父类(可以是抽象类),但可以充实实现多个接口。一个类使用extends来继承抽象类,使用implements来实现接口。
计划理念
抽象类表现了一种继承关系,目标是复用代码,抽象类中界说了各个子类的雷同代码,可以以为父类是一个实现了部分功能的“半制品”,而子类是“制品”。父类和子类之间必须存在“is-a”的关系,即父类和子类在概念本质上应该是雷同的。
接口并不要求实现类和接口在概念本质上同等的,仅仅是实现了接口界说的约定大概本领而已。接口界说了“做什么”,而实现类负责完成“怎么做”,表现了功能(规范)和实现分离的原则。接口和实现之间可以以为是一种“has-a的关系”
面向过程和面向对象的区别
两者都是软件开发头脑,先有面向过程,后有面向对象。在大型项目中,针对面向过程的不敷推出了面向对象开发头脑。
区别
1、编程思绪差别:面向过程以实现功能的函数开发为主,而面向对象要起首抽象出类、属性及其方法,然后通过实例化类、实行方法来完乐成能。
2、封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。
3、面向对象具有继承性和多态性,而面向过程没有继承性和多态性,以是面向对象上风是显着。
4、面向过程思量怎么做;面向对象思量找谁来做
方法重载和方法重写(覆盖)的区别
重载overload:同一个类中,在一个类内里为一种运动提供多种实现方式并进步可读性
重写override:子类和父类间,父类方法无法满足子类的要求,子类通过方法重写满足要求
重载与修饰符、返回值、抛出非常无关,方法名必须雷同,参数列表必须差别(个数、种类、序次)
重写修饰符>=父类修饰符,返回值<=父类返回值,方法名、参数列表必须雷同,抛出的非常<=父类抛出的非常
final、finally、finalize的区别
1、final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。将变量或方法声明为final,可以包管它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
2、finally在非常处理处罚时提供 finally 块来实行任何打扫利用。如果有finally的话,则不管是否发生非常、是否捕获,finally语句都会被实行。(只有体系退出能克制finally实行)
3、finalize是方法名。Java 技能允许使用finalize()方法在垃圾网络器将对象从内存中打扫出去之前做须要清算工作。finalize()方法是在垃圾网络器删除对象之前被调用的。它是在 Object 类中界说的,因此全部的类都继承了它。子类覆盖finalize()方法以整理体系资源大概实行其他清算工作。finalize()方法不应该被自动调用。
Error和Exception的区别
、
1、Error类,表现仅靠步调自己无法规复的严厉错误,好比说内存溢出、动态链接非常、假造机错误。应用步调不应该抛出这种范例的对象。如果出现这种错误,除了积极使步调安全退出外,在其他方面是无能为力的。以是在举行步调计划时,应该更关注Exception类。
2、xception类,由Java应用步调抛出和处理处罚的非严厉错误,好比所需文件没有找到、零作除数,数组下标越界等。它的各种差别子类分别对应差别范例非常。分为Checked非常和Runtime非常两类。
(1)RuntimeaException及其全部子类。
不要求步调必须对它们作出处理处罚,好比InputMismatchException、ArithmeticException、NullPointerException等。纵然没有使用try-catch或throws举行处理处罚,仍旧可以举行编译和运行。如果运行时发生非常,会输出非常的堆栈信息并中断步调实行。
(2)Checked非常(非运行时非常)
除了运行时非常外的其他非常类都是Checked非常。步调必须捕获大概声明抛出这种非常,否则出现编译错误,无法通过编译。包罗两种处理处罚方式:通过try-catch捕获非常,通过throws声明抛出非常从而交给上一级调用方法处理处罚。
非常处理处罚中throws和throw的区别
1、作用差别:throw用于步调员自行产生并抛出非常;throws用于声明在该方法内抛出了非常
2、使用的位置差别:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的反面,不能单独使用。
3、内容差别:throw抛出一个非常对象,且只能是一个;throws反面跟非常类,而且可以有多个。
Integer与int的区别
int是java提供的8种原始数据范例之一。Java为每个原始范例提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,比方,要想表达出没有到场考试和考试结果为0的区别,则只能使用Integer。
别的,Integer提供了多个与整数干系的利用方法,比方,将一个字符串转换成整数,Integer中还界说了表现整数的最大值和最小值的常量。
String、StringBuffer、StringBuilder区别与接洽
1、String类是不可变类,底层实现为字符数组,即一旦一个String对象被创建后,这个堆空间里的字符数组是不可改变的,直至这个对象烧毁。以是每次改变字符串的值,着实是在堆空间内创建新的字符串对象。
2、StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦天生了终极必要的字符串,调用toString方法可以将其变革为String。
3、JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法根本雷同。差别是StringBuffer是线程安全的,而StringBuilder是线程不安全的,以是性能相对高。通常情况下,创建一个内容可变的字符串,应该优先思量使用StringBuilder。
java.sql.Date和java.util.Date的接洽和区别(相识)
java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的sql包装器
java.util.Date会拿到全部值
java.sql.Date和java.sql.Time只会从数据库里读取某部分值,分别是日期与时间
Vector和ArrayList的区别和接洽
实现原理雷同,功能雷同,都是长度可扩展的数组结构,许多情况下可以互用,初始长度都是10
两者的重要区别如下
1、Vector是早期JDK接口,ArrayList是更换Vector的新接口
2、Vector线程安全服从慢,ArrayList服从快,线程不安全
3、认真实元素个数邻近数组长度,数组长度必要增长时,Vector酿成2倍,ArrayList酿成1.5倍
ArrayList和LinkedList的区别和接洽
两者都实现了List接口,都具有List中元素有序、不唯一的特点。
ArrayList底层实现为长度可扩展的数组,在内存中分配一连空间。遍历元素和随机访问元素的服从比力高。
LinkedList底层实现为双向链表。插入、删除元素时服从比力高。
HashMap和Hashtable的区别和接洽
实现原理雷同,功能雷同,底层都是哈希表结构,查询速率快,在许多情况下可以互用
两者的重要区别如下
1、Hashtable是早期JDK提供的接口;HashMap是新版JDK提供的接口
2、Hashtable继承Dictionary类;HashMap实现Map接口
3、Hashtable线程安全,服从低;HashMap线程不安全,服从高
4、Hashtable不允许null值;HashMap允许null值
5、Hashtable初始值为11;HashMap初始值为16
聚集和数组的比力(为什么引入聚集)
数组不是面向对象的,存在显着的缺陷,聚集完全补充了数组的一些缺点,比数组更机动更实用,可大大进步软件的开发服从而且差别的聚集框架类可实用于差别场所。详细如下:
1、数组的服从高于聚集类.
2、数组能存放根本数据范例和对象,而聚集类中只能放对象。
3、数组容量固定且无法动态改变,聚集类容量动态改变。
4、数组无法判定此中现实存有多少元素,length只告诉了array的容量。
5、聚集有多种实现方式和差别的实用场所,而不像数组仅采取序次表方式。
6、聚集以类的情势存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂利用,大大进步软件的开发服从。
Collection和Collections的区别
Collection是Java提供的聚集接口,存储一组不唯一,无序的对象。它有两个子接口List和Set。
Java中尚有一个Collections类,专门用来利用聚集类,它提供一系列静态方法实现对各种聚集的排序、二分法查找、线程安全化等利用。
输入流和输出流接洽和区别,节点流和处理处罚流接洽和区别
起首直观地讲,流就像管道一样。在步调和文件之间,输入输出的方向是针对步调而言,向步调中读入东西,就是输入流,从步调中向外读东西,就是输出流。输入流是得到数据,输出流是输出数据。
而节点流,处理处罚流是流的另一种分别,按照功能差别举行的分别。节点流,可以从或向一个特定的地方(节点)读写数据。处理处罚流是对一个已存在的流的毗连和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理处罚流的构造方法总是要带一个其他的流对象做参数。一个流对象颠末其他流的多次包装,称为流的链接。
字符流字节流接洽区别;什么时间使用字节流和字符流?
字符流和字节流是流的一种分别,按照处理处罚流的数据单元举行的分别。两类都分为输入和输出利用。在字节流中输出数据重要是使用OutputStream完成,输入使的是InputStream,在字符流中输出重要是使用Writer类完成,输入流重要使用Reader类完成。这四个都是抽象类。
字符流处理处罚的单元为2个字节的Unicode字符,分别利用字符、字符数组或字符串,而字节流处理处罚单元为1个字节,利用字节和字节数组。字节流是最根本的,全部的InputStrem和OutputStream的子类都是,重要用在处理处罚二进制数据,它是按字节来处理处罚的,但现实中许多的数据是文本,又提出了字符流的概念,它是按假造机的编码来处理处罚,也就是要举行字符集的转化。
这两个之间通过 InputStreamReader,OutputStreamWriter来关联,现实上是通过byte[]和String来关联的。
罗列常用字节输入流和输出流并分析其特点,至少5对。
FileInputStream从文件体系中的某个文件中得到输入字节。
FileOutputStream文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。文件是否可用或可否可以被创建取决于底子平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件举行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。
ByteArrayInputStream包罗一个内部缓冲区,该缓冲区包罗从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。
ByteArrayOutputStream此类实现了一个输出流,此中的数据被写入一个 byte 数组。缓冲区会随着数据的不停写入而自动增长。可使用toByteArray()和toString()获取数据。
FilterInputStream包罗其他一些输入流,它将这些流用作其根本数据源,它可以直接传输数据或提供一些额外的功能。FilterInputStream类自己只是简单地重写那些将全部哀求通报给所包罗输入流的 InputStream 的全部方法。FilterInputStream的子类可进一步重写这些方法中的一些方法,而且还可以提供一些额外的方法和字段。
FilterOutputStream类是过滤输出流的全部类的超类。这些流位于已存在的输出流(底子 输出流)之上,它们将已存在的输出流作为其根本数据吸收器,但大概直接传输数据或提供一些额外的功能。 FilterOutputStream 类自己只是简单地重写那些将全部哀求通报给所包罗输出流的 OutputStream 的全部方法。FilterOutputStream 的子类可进一步地重写这些方法中的一些方法,而且还可以提供一些额外的方法和字段。
ObjectInputStream对从前使用ObjectOutputStream写入的根本数据和对象举行反序列化。
ObjectOutputStream和ObjectInputStream分别与FileOutputStream和FileInputStream一起使用时,可以为应用步调提供对对象图形的长期存储。ObjectInputStream用于规复那些从前序列化的对象。其他用途包罗使用套接字流在主机之间通报对象,大概用于编组息争组远程通讯体系中的实参和形参。
StringBufferInputStream此类允许应用步调创建输入流,在该流中读取的字节由字符串内容提供。应用步调还可以使用ByteArrayInputStream从byte数组中读取字节。 只有字符串中每个字符的低八位可以由此类使用。
ObjectOutputStream 将 Java 对象的根本数据范例和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的长期存储。如果流是网络套接字流,则可以在另一台主机上或另一个历程中重构对象。
历程和线程有什么接洽和区别?
1、界说:
(1)历程是运行中的步调,是举行资源分配和调治的单元。
(2)线程是历程的一条实行路径,处理处罚器调治的根本单元
2、历程和线程的关系:
(1)一个线程只能属于一个历程,而一个历程可以有多个线程,但至少有一个线程。
(2)资源分配给历程,同一历程的全部线程共享该历程的全部资源。
(3)线程在实行过程中,必要协作同步。差别历程的线程间要使用消息通讯的办法实现同步。
(4)处理处罚机分给线程,即真正在处理处罚机上运行的是线程。
(5)线程是指历程内的一个实行单元,也是历程内的可调治实体。
3、线程与历程的区别:
(1)调治:线程作为调治和分配的根本单元,历程作为拥有资源的根本单元。
(2)并发性:不但历程之间可以并发实行,同一个历程的多个线程之间也可以并发实行。
(3)拥有资源:历程是拥有资源的一个独立单元,线程不拥有体系资源,但可以访问附属于历程的资源。
Java创建线程后,调用start()方法和run()的区别
两种方法的区别
1、start:
用start方法来启动线程,真正实现了多线程运行,这时无需等候run方法体代码实行完毕而直接继承实行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于停当(可运行)状态,并没有运行,一旦得到cpu时间片,就开始实行run()方法,这里方法run()称为线程体,它包罗了要实行的这个线程的内容,run方法运行竣事,此线程随即停止。
2、run:
run()方法只是类的一个平常方法而已,如果直接调用run方法,步调中依然只有主线程这一个线程,其步调实行路径照旧只有一条,照旧要序次实行,照旧要等候run方法体实行完毕后才可继承实行下面的代码,如许就没有到达写线程的目标。
总结:调用start方法方可启动线程,而run方法只是thread的一个平常方法调用,照旧在主线程里实行。
把必要并行处理处罚的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。而且run()方法必须是public访问权限,返回值范例为void。
两种方式的比力
现实中每每采取实现Runable接口,一方面由于java只支持单继承,继承了Thread类就无法再继承继承别的类,而且Runable接口只有一个run方法;另一方面通过结果可以看出实现Runable接谈锋是真正的多线程。
简述sleep( )和wait( )有什么区别?
想像小明正在喝水,忽然小明睡着了,水还在流到小明的嘴里;但如果有人跟小明说等等,小明就会把水放下。这里的水指代的是CPU资源,小明指代一个线程。
sleep不开释锁,不开释资源
wait开释锁,开释资源
sleep到达休眠时间后,自动竣事,属于线程类下
wait只能等候其他线程叫醒,属于Object类下
Java反射技能重要实现类有哪些,作用分别是什么?
在JDK中,重要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
1、Class类:代表一个类
2、Field 类:代表类的成员变量(属性)
3、Method类:代表类的成员方法
4、Constructor 类:代表类的构造方法
总结
以上是JavaSE的区别题,感谢各位客长收看。
|