Java程序员经典面试题+答案(全)冰湖一角

这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的朋友在笔试时更好地赢得笔试和面试。

可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。

java中的保留字,现在没有在java中使用。

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位。

在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。

在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。

对于shorts1=1;s1=s1+1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

对于shorts1=1;s1+=1;由于+=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

2<<3,

因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2<<3。

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。

Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。

Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

这四个作用域的可见范围如下表所示。

说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。

作用域当前类同一package子孙类其他package

public√√√√

protected√√√×

friendly√√××

private√×××

Overload是重载的意思,Override是覆盖的意思,也就是重写。

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承具体类。抽象类中可以有静态的main方法。

clone有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。

面向对象的编程语言有封装、继承、抽象、多态等4个主要的特征。

靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstractclass,abstractclass类中的方法不必是抽象的。abstractclass类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为publicabstract类型,接口中的成员变量类型默认为publicstaticfinal。

下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4.抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然

eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为publicabstract类型。

5.抽象类中可以包含静态方法,接口中不能包含静态方法

6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是publicstaticfinal类型,并且默认即为publicstaticfinal类型。

7.一个类可以实现多个接口,但只能继承一个抽象类。

abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系!

native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用。

内部类就是在一个类的内部定义的类,内部类中不能定义静态成员(静态成员不是对象的特性,只是为了找一个容身之处,所以需要放到一个类中而已。

可以继承其他类或实现其他接口。不仅是可以,而是必须!

基本数据类型包括byte、int、char、long、float、double、boolean和short。

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。

String类是final类故不可以继承。

两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。NewString每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。

String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。

数组没有length()这个方法,有length的属性。String有有length()这个方法。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收。

error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

ClassCastException类转换异常,IllegalArgumentException非法参数异常,IndexOutOfBoundsException数组越界异常,NullPointerException空指针异常,ArrayStoreException数据存储异常。

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口

同步的实现方面有两种,分别是synchronized,wait与notify

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。

分几种情况:

1.其他方法前是否加了synchronized关键字,如果没加,则能。

2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。

3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。

4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。

一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码。

状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。

主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。

synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

comparable/comparator

(1)同步性:

Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。

(2)数据增长:

ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。

总结:即Vector增长原来的一倍,ArrayList增加原来的0.5倍。

一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。

List,Set是,Map不是

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。

Collection是集合类的上级接口,继承与他的接口主要有Set和List.

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

常用的类:Date,System,List,HashMap,String,Integer

常用的包:java.lang,java.io,java.util,java.sql,javax.servlet

常用的接口:List,Map,Document,NodeList,Servlet,HttpServletRequest,HttpServletResponse

字节流,字符流。字节流继承于InputStreamOutputStream,字符流继承于InputStreamReaderOutputStreamWriter。

我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implementsSerializable只是为了标注该对象是可被序列化的。

java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。

堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。

GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

56、世界500强面试题(百度网盘下载)

在公众号里给大家准备了一份不错的java学习资料,里面有很多学习视频和资料,后台回复「java」,即可获取。

THE END
1.百度网盘app扫一扫在哪里找百度网盘app扫一扫位置一览如何快速访问百度网盘扫一扫功能?使用百度网盘时,难免会遇到需要扫描二维码的情况,但百度网盘app的扫一扫功能隐藏较深,让许多用户难以找到。php小编香蕉了解到,不少用户对此感到困惑,因此特地撰写此文,详细介绍百度网盘扫一扫功能的位置和使用方式。 很多用户不知道百度网盘app在哪里扫描,其实很简单。 1、用户在“我的”https://m.php.cn/faq/1022535.html
2.百度网盘怎么扫一扫登录百度网盘怎么扫一扫登录,应该是用手机扫描二维码登录电脑上的百度或电脑上的百度网盘吧。方法:电脑上打开百度首页,点击登录出现登录二维码,用百度APP的搜索框照相机扫描就可登录电脑上的百度,然后点击电脑百度首页右上角的更多产品,找到百度网盘即可。话说手机百度网盘的扫一扫在哪呢?想知道的伙伴们一起来看看吧。工具:百https://m.51dongshi.com/ezdshbbvb.html
3.百度网盘怎么扩容全文浏览目前,不少网友都云盘都逐步关闭了,因此,网友就选择在百度网盘上存储文件,但是,百度网盘起步容量5GB常常都不够用,那么,百度网盘怎么扩容?下面给大家带来百度网盘扩容方法大全,其中,也包括了免费扩容的方法,一起来了解一下! 1、首先在电脑网页上,已经登录成功的百度账号,我的关注右边的【导航】,点击打开【百度网盘】 https://m.zol.com.cn/soft/jingyan/59394.html
4.网传百度网盘停止服务官方回应:这是假新闻新闻频道【环球科技报道 周涛】近日,有媒体报道百度网盘将关闭免费个人用户的存储服务。对此,环球网科技第一时间联系到百度公关部,相关人士表示:“这是假新闻”。 而在早些时候,百度云盘官方微博曾发布消息称:“谢谢大家关心!百度网盘将一如既往地向用户提供稳定可靠的个人云存储服务。” https://news.cctv.com/2016/10/25/ARTIWyRqKoFvO2oMaLgExeSb161025.shtml
5.百度网盘使用教程注册账号分享保存5、登陆后发现手机界面出现了 上方是其他功能区,可以保存照片等,最近收藏的东东都在中间部位。请注意看下方-板块区域。 6、点击下方文件,看右上角+号,是扫一扫,新建文件夹,上传照片视频,上下箭头是上传下载列表,三个点是按照时间名称排列。 7、点 好友,这里主要是加好友的百度网盘账号,以后方便联系,互相分享文件。https://www.meipian.cn/21sgh7js
6.百度网盘怎么扫码登录百度网盘扫码登录方法使用百度网盘的时候,很多小伙伴想要通过扫码来进行登录,但是没有看到扫码功能在哪里。百度网盘怎么扫码登录?下面小编就为大家带来了详细的介绍,还不知道的小伙伴快跟小编一起来看看吧! 百度网盘怎么扫码登录? 1、打开百度网盘,点击下方的首页 2、点击右上角的加号,点击扫一扫即可进行扫码登录。 以上就是小编带来https://app.3dmgame.com/gl/357471.html
7.2024百度网盘svip会员一天激活码,免费试用17天教程百度网盘是一款备受欢迎的云存储服务,而SVIP会员更是提供了诸多便利和的特权功能。现在,我们带来了2024百度网盘SVIP会员一天激活码,让你可以免费试用1-7天,体验会员的尊贵权益。 百度网盘免费领取教程 1、打开手机微信,搜索并关注【氧券】公众号。 2、在公众号的对话框内输入【百度网盘】。 https://www.jianshu.com/p/e2b700f774eb
8.百度网盘点微博登录切换账号吾爱破解选择微博登陆,登陆之后用app的扫一扫,扫电脑上的登陆界面二维码,保证ok,百度网盘电脑端也是它扫一扫,https://www.52pojie.cn/thread-1258158-1-1.html
9.微信百度云小程序二维码二维码百度网盘微信小程序入口百度网盘暂未发布微信小程序版,还望大家海涵。如果百度网盘小程序有所上线,我们会第一时间为大家收录。 百度网盘小程序信息 发布:2017-02-23名称:百度网盘 标签:工具 微信扫一扫,使用小程序 百度网盘小程序截图 百度网盘小程序简介 百度网盘暂未发布微信小程序版,还望大家海涵。如果百度网盘小程序有所上线,我们会第https://www.qqtn.com/xcx/173289.html
10.百度网盘扫一扫无法显示,密码登录安全认证无法显示解决方法1、打开控制面板,找到如下图所示的 Internet选项 2、找到图下所示的 高级 → 重置 直接点【重置】,不需要勾选删除个人设置 然后等它自己重置完成,再次打开百度网盘,刷新二维码即可https://blog.csdn.net/m0_46185017/article/details/131790707
11.警方提醒:个人账号及密码信息不要存放在网络云盘中昨日,金牛区警方通报了这起最近破获的网络新型违法犯罪案。记者了解到,在此案中,嫌疑人通过“社工库”查询获取了受害人的大量网络账户信息,并借此最终获取了受害人存放在网盘中的大量信息。 凌晨惊魂 网络账户异常 一夜被转走5万元 经过警方调查,王先生的账户内共有金额30余万元。4日凌晨4时许,王先生的账户开始https://www.sc.gov.cn/10462/12771/2016/4/14/10376142.shtml