JAVA⾯试题
1 throws与throw的区别
解析:throws和throw是异常处理时两个常见的关键字,初级程序员常常容易正确理解throw和throws的作⽤和区别,说明已经能⽐较深⼊理解异常处理。Throw⽤来抛出异常,如果执⾏了throw语句,程序将发⽣异常,进⼊到异常处理机制。Throws⽤来声明异常,说明这个⽅法可能会发⽣某些类型的异常,那么编译器将强制在调⽤这个⽅法的时候处理异常。API中的很多⽅法都使⽤了throws声明了异常,所以使⽤这些⽅法时编译器会提⽰需要处理异常。
参考答案:throw⽤来在⽅法体内抛出异常,⽽throws⽤来在⽅法声明处声明异常。这两个关键字有着⼀定的联系。如果⼀个⽅法中使⽤了throw关键字抛出了异常,那么要么⽴即⽤try/catch语句进⾏捕获,要么就是⽤throws进⾏声明,否则将出现编译错误。然⽽,
并不是只有使⽤了throw关键字之后才能使⽤throws关键字,语法上来说,任何⼀个⽅法都可以直接使⽤throws关键字,抽象⽅法也可以使⽤。
java常见笔试题
2 collection接⼝与map接⼝
解析:Collection和Map是Java集合框架中两个基本集合类型,要区别不同的集合⾸先要从Collection和Map开始。
参考答案:Collection接⼝是传统的集合接⼝,可以把单个对象存储进来。⽽Map接⼝是映射接⼝,存储的是键值对。
3 list与set的区别
解析:List和Set是Collection接⼝的两个⼦接⼝,也是使⽤最多的两种集合类型。程序员应该熟悉这两个接⼝的基本特征,能够更准确地选择正确的集合类型。
参考答案:List实现了列表类型的集合,List中的元素是有序(ordered)的,每个元素根据放⼊集合的顺序⽽对应⼀个索引值, 可以根据这个索引值返回集合原宿。⽽Set实现了不重复元素集合,即Set中的元素不能够重复,重复的元素将⽆法添加到集合中。
split翻译成中文4 list都有哪些实现
解析:List是⽤的较多的集合类型,List是⼀个接⼝,具体使⽤List集合类型时,需要使⽤时实现类。List接⼝的每个实现类也都实现了不同的数据结构,各⾃具有不同的特征,其中最常⽤的是List实现类。
参考答案:List接⼝中有以下⼏个常⽤实现
1 ArrayList:实现了动态数组的特征。
2 LinkedList: 实现了链表的数据结构,LinkedList也可以⽤作栈或者队列。
3 Vector:向量。
4 ArrayList
Vector类的功能 ArrayList都可以实现,区别在于Vector是现⾏同步的。
5 如何创建线程对象
解析:Java 语⾔能够⽀持多线程编程,将线程封装成Thread类型的对象,只要创建Thread类型的对象,就能够便捷地启动线程、执⾏线程体。程序员⾸先必须掌握创建线程的常⽤⽅法。
参考答案:Java语⾔中经常使⽤两种⽅法创建线程。①创建Thread类的⼦类,在⼦类中覆盖Thread类的run⽅法,实现线程的运⾏体,只要创建该⼦类对象就是线程对象。②创建Runable接⼝的实现类,在实现类中覆盖接⼝中的run⽅法,实现线程的运⾏体。使⽤
Thread(Runable)构造⽅法可以创建线程对象,参数是Runable接⼝实现类的实例。
6 什么是泛型,作⽤?
解析:泛型是JDK5中增加的特性,API中有⼤量的泛型接⼝、泛型类及泛型⽅法等。程序员需要了解泛型的作⽤,尤其在使⽤集合框架时,往往需要使⽤到泛型。
参考答案:泛型的本质就是参数化类型,也就是说把数据类型指定为⼀个参数。在需要声明数据类型的地⽅,就可以不指定具体的某个类型,⽽是使⽤这个参数。这样⼀来,就能够在具体使⽤时再指定具体类型,实现了参数的“任意化”。泛型的好处是在编译的时候能够检查类型安全,并且所有的强制转换都是⾃动和隐式的,提⾼代码的重⽤率。
7 ⾃动装箱?拆箱?
解析:⾃动装箱/拆箱指的是⼋个包装器类与⼋个基本类型的转换问题。然⽽。这个特征却需要谨慎使⽤,因为虽然表⾯上看起来⾮常⽅便,⽽实质上依然需要创建对象、进⾏转换等操作,使⽤不恰当会降低性能。
参考答案:⾃动装箱指的是可以直接将基本数据类型转换为包装器类型,⾃动拆箱指的是可以直接将包装器类型转换为基本数据类型,如下代码所⽰:
int m=100;
Integer im=m;
int n=im;
上诉代码中,直接将m赋值给包装器对象im,这就是⾃动装箱,然后直接将im赋值给基本数据类型n,这就是⾃动拆箱。虽然表⾯上看代码简洁⽅便,然⽽本质上装箱时候依然使⽤new创建了对象,⽽拆箱时也依然调⽤了⽅法进⾏运算。因此,不要在没有必要的时候,频繁使⽤装箱拆箱,会降低性能。
1 String = 与 new 的不同
使⽤“=”赋值不⼀定每次都创建⼀个新的字符串,⽽是从“字符串实例池”中查字符串。使⽤“new”进⾏赋值,则每次都创建⼀个新的字符串。
2 String与StringBuffer
String类是不可变类,字符串⼀旦初始化后,就不能被改变。⽽StringBuffer类是可变类,字符串值可以呗改变。常常在实际应⽤中看到累死这样的代码:String s=new(“hello”);s+=”world”,这两句代码⾸先创建⼀个字符hello,然后将world追加到hello结尾并重新赋值给变量s。然后,这个过程实际上是这样的:⾸先创建⼀个StringBuffer对象,然后⽤StringBuffer类的append⽅法追加字符串,最后对StringBuffer对象调⽤toString⽅法合成字符串返回。可见,使⽤+号连接字符串时,本质上是使⽤了可变的StringBuffer类,经变动肯定性能效率受到影响,所以建议需要追加字符串时,可以考虑直接使⽤StringBuffer类。参考答案:String类是不可变类,即字符串值⼀旦初始化后就不可能改变。StringBuffer是可变字符串类,类似String的缓冲区,可以修改字符串的值。
3 StringBuffer 与 StringBiulder的区别
StringBuffer是线程安全的字符串缓冲,⽽StringBuilder不是线程安全的。
4 包装器类型?
包装类器包括Byte、Short、Integer、Long、Float、Double、Character、Boolean等类,主要⽤来对byte、short、integer、long、float、double、character、boolean这⼋种基本数据类型进⾏包装,使其称为引⽤类型。
5 JAVA参数传递
解析:值传递时编写应⽤时不可避免的操作。例如某⽅法声明形式是public void f(int x){},写⽅法是,必须为其传递⼀个int类型的实际参数,如f(10)。⼜如public void g(Employee)。那么使⽤该⽅法时,必须为其传递⼀个Employee类型的实际参数,例如
g(new Employee())。所以,对于初级程序员来说,了解Java语⾔的值传递规则⾮常重要。Java语⾔是本类型传递的值,例如f(10),仅仅把10复制给形式参数x,是值的拷贝。⽽引⽤类的传递时引⽤,即虚地址,例如g(new Employee())是把实际参数的虚地址传递给形式参数e,也就是说实际参数和形式参数的虚地址相同,物理上是同⼀个对象。参考答案:基本数据类型传递的是值,引⽤类型传递的是引⽤,即虚地址。
6 static修饰属性或者⽅法
static修饰属性或⽅法后,属性和⽅法不在属于某个特定的对象,⽽是所有共享,也可以说是static成员
不依赖某个对象,在类加载时就被初始化。Static修饰的属性或⽅法,可以直接使⽤类名调⽤,⽽不⽤先实例化对象再调⽤。
7 == 操作符的作⽤
解析:实际编程中,==是⾮常常⽤的操作符。很多初级程序员会使⽤这样的代码if(s==”save”0{},结果会发现,即使当字符串s的值为save时,if条件依然不能被执⾏。是==在⽐较引⽤类型时,⽐较的是两个对象的虚地址,⽽不是内容。要⽐较两个对象的内容是否相同,往往需要使⽤equal⽅法,例如if(s.equals(“save”)){}。==⽐较基本类型时,将⽐值的⼆进制是否相等,例如(x==0.5){}。值得注意的是,与空指针null值进⾏⽐较,往往⽤==进⾏,例如if(s==null||s.equals(“”)),表⽰如果字符串是空指针或者空串。 参考答案:==可以⽤来⽐较基本类型或者引⽤类型。⽐较基本类型时,==⽤来⽐较⼆进制的值,⽐较引⽤类型时,⽤来⽐较对象的虚地址。
js parseint用法8 && 与 & 的不同
解析:实际编程中,常常需要使⽤“与”或者“或”的逻辑。其中&&和&存在⼀定区别&&可能发⽣各路问题,例如
if(s!=null&&s.length()==6)中,如果要的值为null,那么第⼀表达式的值为false,返回值肯定是false,
show overflow tooltip不会计算第⼆个表达式的值,这就是短路。然⽽使⽤&,例如if(s!=null&s.length()==6),假设s的值为,null,返回值肯定是false,但是会判断第⼆个表达式的值,将发⽣空指针异常。实际⼯作中,经常使⽤&&操作符。
参考答案:&&会发⽣短路问题,当第⼀个表达式的值为false时,将直接返回结果为false⽽不会判断第⼆个表达式的值。⽽&不会发⽣短路问题,即使第⼀个表达式的值是false,会判断第⼆个表达式的值。
9 依赖与关联的关系
解析:关联关系和依赖关系是⾮常常见的两种关系,⼆者的区别也很明显,程序员了解⼆者的区别能够更深⼊的理解⾯向对象的思想。
参考答案:依赖关系是⼀种瞬时关系,A依赖B,指的是A的某个⾏为的参数是B的类型,也就是说,A要想实现这个⾏为,必须依赖B的实例,A关联B,是⼀种长久的关系。B作为A的属性存在,只要实例化⼀个A的对象,就会为这个A的对象实例化⼀个B的对象,作为它的属性使⽤,可以在A中任何需要使⽤B的地⽅使⽤B。
occasion翻译10 JAVA的继承
解析:继承是⾯向对象语⾔的⼀⼤特征,主要作⽤是重复使⽤,⼦类通过继承⽗类,能够重复使⽤⽗类的属性和⽅法。指的注意的是,有两个策略都可使实现重复使⽤,⼀个是关联,⼀个是继承,实际编程中,关联⽤的更多。因为⼦类继承⽗类后,相当于⽗类中的细节将暴露给⼦类。初级程序员⼀定不要随意使⽤继承,避免滥⽤继承。 参考答案:继承主要为了能够重复使⽤⽗类中的成员。Java语⾔中的继承是单继承,也就是说⼀个类最多只能继承⼀个⽗类。
11 super的作⽤
解析:使⽤⼀些IDE⽣成代码时,常常会在构造⽅法中见到super这个关键字。顾名思义,super是和⽗类有关的⼀个关键字,熟悉super的⽤法对熟练掌握继承很有必要。
参考答案:如super():表⽰调⽤⽗类中的每⼀参考的构造⽅法:⼜如super(10);表⽰调⽤⽗类中的具有⼀个整型参数的构造⽅法。第⼆种⽤法是在⼦类中调⽤⽗类中的成员,如super.f();意思是调⽤⽗类中的f()⽅法。
12 final的作⽤
final修饰符是⼀个⽤途⾮常⼴泛的修饰符,可以修饰类,⽅法,以及属性。
参考答案:final类是不能够被继承的类,称为终极类,如String类就是final类,不能有⼦类。final修饰
⽅法后,是终极⽅法,不能被⼦类覆盖,但是可以被⼦类继承使⽤。final类不能被继承,final⽅法不能被覆盖,final属性不能被改变。
13 object类的作⽤,都有什么⽅法。
解析:Object类是⼀个⾮常重要的类,是所有类的⽗类,包括数组在内,也就是对⼀个Java类,不管是API中定义的,还是⾃定义的类,都直接或间接的继承了Object类。所以,如果有⼀个⽅法f(Object o),那么可以传递给这个⽅法任意⼀个类的对象,包括%%%%。因为所有对象都可以说是Object类型。
参考答案:Object类是多有类的直接或间接的⽗类。
常⽤⽅法:toString() equals finalize()
14 Object类的equals与hashcode⽅法
解析:在Object类中,equals⽅法⽐较对象的引⽤值,也就是只有物理上是同⼀对象的两个引⽤,在使⽤equals⽅法返回true。hashCode⽅法返回⼀个对象的内在地址的⼗六进制值。由于Object类是所有类的⽗类,所以任意类中都拥有这两个⽅法,并都可以进⾏覆盖。尤其是操作Set,Map对象时集合元素类的equals⽅法和hashCode⽅法⾮常必要,因为Set和Map判断元素是否重%%%是依靠这两个⽅
法进⾏。⼀般的原则是:如果存在X和Y两个对象,调⽤X.equals(Y)相同时,那么调⽤hashCode⽅法返回值也应该相同;如果
X.equals(Y)返回false时,那么调⽤hashCode⽅法返回值可能相同,也可能不同。值得注意的是,只要你覆盖了equals⽅法,⼀定%%%则覆盖hashCode ⽅法。在实际⼯作中,很多IDE环境都⽀持覆盖equals和hashCode ⽅法。
参考答案:Oject类中的equals⽅法⽤来⽐较两个引⽤值,hashCode⽤来返回引⽤的内地址的⼗六进制数值。在Set以及Map集合中,判断两个元素是否重复时,往往需要使⽤这两个⽅法。这两个⽅法往往被⼦类覆盖,覆盖的规则是:如果存在x和y两个对象,调⽤
x.equals(y)返回true时,那么调⽤hashCode⽅法的返回值也该相同;如果x.equals(y)返回false时,那么调⽤hashCode⽅法返回的值可能相同,也可能不同。
15 接⼝与抽象类
解析:接近欧的概念是⼀个设计层⾯的概念,初级程序员往往不会⾃⼰定义接⼝,但是会使⽤接⼝,理解接⼝的概念⾮常必要。接⼝定义了实现类的规范,即what to do的部分,所有实现类必须按照这个规范进⾏实现。
windows11热键设置更改参考答案:接⼝的特点是不能定义变量(只能定义静态常量static final 修饰,博友说JDK8已经修正,这个没有尝试,期待参考),⽽且所有⽅法都是抽象⽅法。⽽抽象类中可以有变量,也不强制必须有抽象⽅法。
16 类的继承与接⼝的实现
解析:类继承⽗类与类实现接⼝,本质上其实是⼀样的。都是将⽗类或者接⼝作为模板,在这个模板上进⾏扩展或者重写。程序员在实际编程中,常常需要继承⽗类或者实现接⼝。
参考答案:类继承⽗类只是单继承,也就是⼀个⼦类最多只有⼀个⽗类;⽽类实现接⼝可以多实现,就是⼀个⼦类可以同时实现多个接⼝,并覆盖所有接⼝中的所有抽象⽅法。
17 comparable接⼝的作⽤
解析:comparable接⼝是在实际编程中常常使⽤的接⼝,该接⼝定义了comareTo(Object o)⽅法,⽤来定义对象的⽐较逻辑。这个接⼝常常在其他API中会强制使⽤,例如Arrays类的sort(Object[])⽅法,就强制数组元素必须实现Comparable接⼝,与这个接⼝类似
的 另外⼀个接⼝是Comparator。
参考答案:Comparable接⼝定义了compareTo(Object o)⽅法,可以⽤来实现对象的⽐较逻辑,这个接⼝常常在其他API中强制使⽤,⽤来规范对象的⽐较逻辑
今天参加笔试,⾥⾯有设计模式,和⼀些基础题!
印象最深的是:什么不是Object的函数,我蒙的finalize,哎,⽆知!
还问了,接⼝与抽象类的不同,还有多线程的实现⽅式!下⾯基本都有。
另外还问了,观察者模式,设计模式,我⼀点不会,看来要下功夫了!
1. ⾯向对象编程的三⼤特性是什么,请简要阐述
(1).继承:
继承是⼀种联结类的层次模型,并且允许和⿎励类的重⽤,它提供了⼀种明确表述共性的⽅法。对象的⼀个新类可以从现有的类中派⽣,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派⽣类(⼦类),⽽原始类称为新类的基类(⽗类)。派⽣类可以从它的基类那⾥继承⽅法和实例变量,并且类可以修改或增加新的⽅法使之更适合特殊的需要。
(2).封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界⾯。⾯向对象计算始于这个基本概念,即现实世界可以被描绘成⼀系列完全⾃治、封装的对象,这些对象通过⼀个受保护的接⼝访问其他对象。
(3).多态性:
多态性是指允许不同类的对象对同⼀消息作出响应。多态性包括参数化多态性和包含多态性。多态性语⾔具有灵活、抽象、⾏为共享、代码共享的优势,很好的解决了应⽤程序函数同名问题。
2. String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据这个String类提供了数值不可改变字符串⽽这个StringBuffer类提供的字符串进⾏修改当你知道字符数据要改变的时候你就可以使⽤StringBuffer典型地,你可以使⽤StringBuffers来动态构造字符数据
3. 说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使⽤数组⽅式存储数据,此数组元素数⼤于实际存储数据以便增加和插⼊元素,它们都允许直接按序号索引元素,但是插⼊元素要涉及数组元素移动等内存操作,所以索引数据快⽽插⼊数据慢,Vector由于使⽤了synchronized思路⽅法(线程安全) ,通常性能上较ArrayList 差,
⽽LinkedList使⽤双向链表实现存储,按序号索引数据需要进⾏前向或后向遍历,但是插⼊数据时只需要记录本项前后项即可,所以插⼊速度较快
4. Collection 和 Collections的区别
Collection是集合类的上级接⼝,继承与他的接⼝主要有Set 和List. Collections是针对集合类的⼀个帮助类,他提供⼀系列静态⽅法实现对各种集合的搜索、排序、线程安全化等操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论