Java面试题集

1.是否可以从一个static方法内部发出对非static方法的调用?

不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法的调用。二static方法调用时不需要创建对象,就可以直接调用。也就是所,当一个static方法被调用时,可能还没有创建任何实例对象。如果从一个static方法中发出分static的调用,非静态方法应该关联到哪个对象上呢?所以一个static方法内部不能发出分静态方法的调用。
Static方法是静态方法,是属于类的方法
非静态方法是属于对象的方法,所以在static方法中想要调用非static方法,要先新创建一个对象,在由这个对象来调用非static方法

总结:可以调用,但是要跟随对象调用。

2.break return continue之间的区别

Break :结束选择|循环结构
Return:返回具体类型给方法调用者;或者提前结束方法体;
Continue:跳过当前循环,继续下一次循环

3.Overload和Override的区别?Overload的方法是否可以改变返回值的类型?

Override:(重写,覆盖)发生在子类与父类中
方法名,参数,返回值相同,
子类方法不能缩小父类方法的访问权限。
子类方法不能抛出不父类更多的异常(子类可以不抛出异常)
存在父类和子类之间
方法被定义为final则不能被重写

Oveload(重载) 发生在一个方法中
差参数类型,个数,顺序至少有一个不同才能构成重载
不构成重载的修饰位置有权限修饰符,返回值类型。
存在于父类子类,同类中。

Overloaded的方法是可以改变返回值的类型。

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

接口可以继承接口,抽象类不可以继承接口,但是可以实现接口。

抽象类可以继承实体类。抽象类可以实现implements接口。
抽象类是否可以继承是实体类?前提是实体类必须有明确构造函数。
抽象类可以继承实体类,就是因为抽象类的可以继承性和私有方法

抽象类中可以包含静态的main方法

5.abstractclass和interface语法上有什么区别?

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

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

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

抽象类中的抽象方法的访问类型可以是public,protected,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型

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

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

6.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

Abstract和static
不能同时使用
    用static声明的方法表名这个方法在不在生成类的实例时可直接被调用,额abstract方法不能被调用,两者矛盾

Abstract 和 native
Native:用来声明本地方法;
Native可以和所有其他所有的java标识符连用,但是abstrac除外
因为native按时这些方法是有实体的,只不过这些实体是非java的,但是abstract却显然的指明这些方法无实现体。

Abstract 与 synchronized 
Synchronized:用于防止多个线程同时调用一个对象的该方法,与static连用可防止多个线程同时调用一个类的该方法

Abstract与synchronized不能同时使用
从synchronized的功能也可以看出,用synchronized的前提是该方法可以直接被调用,显然不能和abstract连用

7.简单说说Java中的异常处理机制的简单原理和应用。

 当JAVA程序违反了JAVA的语义规则是,JAVA虚拟机就会将发生的错误表示为一个异常,违反语义规则包括2种情况。一种情况就是JAVA类内置的语义检查,例如数组索引下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时使用throw关键字引发异常。所有的异常都是java.lang,Thowable的子类。
使用try…catch捕获异常
先执行try 块中的代码,如果正常运行没有发生异常则执行完后执行finally 代码块中的代码;如若在try 中发生异常且被catch 捕捉到则执行catch 中的代码块,然后执行finally 块中的代码

 8.说一说你对面向对象的理解?

用我的话说,其实可以这么理解,假如我是上帝,我要造 人 (这是对象)。

首先,我要知道人类要有哪些最基本的东西   ?

人要有思想,人还要有肉体

这个过程呢就是(抽象)

因为人的数量很庞大,所以我需要找别人帮我一起造人,但是我不想让他知道我造人的技术(人的脸需要用多少克泥巴,需要怎么用手去捏鼻子等等),我可以把我的造人的技术封装起来,别人只需要知道他要做什么样的人类就好了。【封装】

当我自己造人的时候,我可能造着造着就累了,我可能就要用我之前造出来的某个泥人作为模板“复制”,“粘贴”了

用模板创出来的泥人具有模板的特征,就像孩子一样具有父母的性状。我们称这个过程为【继承】

但是呢  好多泥人都是我后来偷懒用模板复制出来的,为了让人类更丰富多彩一些,我对他们又进行了改变。这个过程可以叫【多态】

9.&和&&的区别?

单&:
逻辑运算符,两个为真才为真,第一个为假还会去判断第二个表达式是不是为真
位运算符:将两边十进制整数转换成二进制运算,再进行比较两个都为1才为1否则为0,再将结果转换成十进制返回回去。
双&&:短路与两边为真才为真,把最可能为假的表达式放在前面,从而达到短路的效果

10.访问修饰符public,private,protected,以及不写(默认)时的区别?

Public:所有类都可以访问
Private:本类中可以访问
Protected:同包以及有继承关系的子类可以访问
默认(default):本类和同包下可以访问

11.抽象类必须要有抽象方法吗?

1.抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。
2.如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。

12.普通类和抽象类有哪些区别?

1.抽象类不能被实例化。
2.抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
3.抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体
4.含有抽象方法的类必须申明为抽象类
5.抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
6.抽象类是否可以有构造函数?
答案是可以有。抽象类的构造函数用来初始化抽象类的一些字段,而这一切都在抽象类的派生类实例化之前发生。不仅如此,抽线类的构造函数还有一种巧妙应用:就是在其内部实现子类必须执行的代码

13.列出一些你常见的运行时异常?

 ArithmeticException(算术异常)
 ClassCastException (类转换异常)
 IllegalArgumentException (非法参数异常)
 IndexOutOfBoundsException (下标越界异常)
 NullPointerException (空指针异常)
 SecurityException (安全异常)

14.Integer与int的区别?

Integer是包装类默认值为null;
Int在修饰局部变量时是没有默认值的必须要为其初始化
在修饰成员变量时默认值为0;

15.java 中操作字符串都有哪些类?它们之间有什么区别?

String、StringBuffer、StringBuilder
String : final修饰,String类的方法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。
StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。
StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用StringBuilder对象的append、replace、delete等方法修改字符串。

16.String s = new String(“xyz”);创建了几个StringObject?是否可以继承String类?

创建了两个对象:
                一个在字符串常量池中创建了一个“xyz”对象
                在堆中通过new String创建了一个对象
不可以继承String类,因为String是被static修饰的,被final修饰的类不能被继承

17.String、StringBuffer与StringBuilder的区别?

Sting是不可变字符序列,而StringBuffer和StringBulider是可变字符序列
StringBuffer:线程安全,相对效率低
StringBulider:线程不安全,相对效率高
StringBulider> StringBuffer>Sting

18.下面这条语句一共创建了多少个对象:String s=“a”+“b”+“c”+“d”;

只创建了一个对象,在字符串池会有一个对象,因为他是一行定义的对象编译时只会初始化一次字符串缓冲池的数据。创建了一个长度为4的byte[]数组对象

19.字节流与字符流的区别?

字节流:字节流是直接操作文件,字节流是万能流什么类型的数据都可以操作,读和写都是一个一个字节进行操作
字符流:字符流操作的基本单元为Unicode码元,字符流使用缓冲区。
字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

20.什么是java序列化,如何实现java序列化?Serializable接口的作用?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容镜像流化,(将对象转换成二进制)。可以对流化后的对象进行读写操作,也可以将流化后的对象传输与网络之间,序列化是为了解决在对对象流进行读写操作时所引发的问题。把对象转换为字节序列的过程成为对象的序列化,把字节序列恢复为兑现过得过程称之为兑现的反序列化。

序列化的实现:将需要被序列化的类实现Serializable接口,改接口没有需要实现的方法,implements Serializable 只是为了标注该兑现格式可被序列化的,然后使用一个输出流(如:FileOutputStrwam)来构造一个ObjectOutputStream对象流对象,接着使用ObjectOutputStream的对象的writeObjecr(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话使用输出流

1.    把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
2.    在网络上传送对象的字节序列。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

21.线程的sleep()方法和yield()方法有什么区别?

Sleep()方法给其他线程运行机会是不考虑线程的优先级,因此会给优先级低的线程有运行的机会;yield()方法只会给相同优先级或更高优先级的线程运行机会

线程执行sleeo()方法后转入TIMED_WAITNG状态,而执行yield()方法后转入rady状态

Sellp()方法声明抛出去InterruptedException,而yield()方法没有声明任何异常;

Sellp()方法比 yield()方法(跟操作系统CPU调度相关)具有更好的移植性

22.Lis、Map、Set三个接口存取元素时,各有什么特点?

存放时:
    1.    List以特定的索引(有顺序的存放)来存放元素,可以有重复元素
    2.    Set存放元素是无序的,而且不可重复
    3.    Map保存键值对的映射,映射关系可以是一对一(键值)或者是多对一,
注意:键无序且不可重复,值可以重复

取出时:
    1.    List取出元素for循环,forEach循环,Iterator迭代器迭代
    2.    Set取出元素forEach循环,Iterator迭代器迭代
    3.    Map取出元素须转换成Set,然后进行Iterator迭代器迭代,或转换成Entry对象进行Iterator迭代器迭代

23.Collection 和 Collections 有什么区别?

    java.util.Collection是一个集合接口(集合类的一个顶级接口)。
    它提供了对集合对象进行基本操作的通用接口方法。
    Collection接口在Java 类库中有很多具体的实现。
    Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式
    其直接继承接口有List与Set。
    Collection
    ├List
    │├LinkedList
    │├ArrayList
    │└Vector
    │ └Stack
    └Set

    java.util.Collections 是一个包装类(工具类/帮助类)。
    它包含有各种有关集合操作的静态多态方法。
    此类不能实例化,就像一个工具类,用于对集合中元素进行排序、
    搜索以及线程安全等各种操作,服务于Java的Collection框架。

24.HashMap 和 Hashtable 有什么区别?

    Hashtable、HashMap、TreeMap都是最常见的Map接口的实现,是以键值对的形式存储和操作数据的容器类型。

    Hashtable是早期Java类库提供的一个哈希表实现,本身是线程安全的,不支持null键和值。由于线程安全导致的性能开销,所以已经很少被推荐使用。

    HashMap是应用更加广泛的哈希表实现,行为上大致与Hashtable一致,主要区别在于HashMap不是线程安全的,且支持null键和值等。通常情况下,HashMap进行put或者get操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选。

    TreeMap则是基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get、put、remove之类操作都是O(log(n))的时间复杂度,具体顺序可以由指定的Comparator来决定,或者根据键的自然顺序来判断。

25.创建线程有哪几种方式?(非常重要,自己回顾一下)

    继承Thread类
    实现Runnable接口
    实现Callable接口
    应用程序可以使用Executor来创建线程池
    实现Runnable接口这种方式最受欢迎,因为不需要继承Thread类,无法多继承,可以多实现,干很多其他事。同时线程池是非常高效的,很容易实现和使用。

26.字节流如何转为字符流

    字节输入流转字符输入流通过InputStreamReader实现,该类的构造函数可以传入InputStream对象。
    字节输出流转字符输出流通过OutputStreamWriter实现,该类的构造函数可以传入OutputStream对象。

27.Java中什么时候进行回收,垃圾回收有什么目的

    垃圾回收是内存中存在没有引用的对象或超过作用域的对象时进行。
    垃圾回收的目的是识别并且丢弃应用中不再使用的对象来释放和重用资源。

28.abstract方法不能够和static连用,为什么?

    static修饰的为静态方法,而abstract修饰的为抽象方法,无方法体的方法,无法调用
    abstract方法需要子类重写,而静态方法不能被重写,二者相互矛盾

29.Java类的初始化顺序

类的大致加载顺序:
静态块,普通方法块,构造方法,成员变量
实际顺序:
父类的静态代码块 || 父类的静态成员 —>子类的静态代码块 || 子类的静态成员 —>
父类普通代码块 || 父类的普通成员 —> 父类的构造方法 —>子类的普通代码块 || 子类的普通成员—> 子类的构造方法

30.ArrayList与LinkedList的区别

1.是否保证线程安全:ArrayList和LinkedList都是不同步的,也就是不保证线程安全;

2.底层数据结构:ArrayList使用的是数组,LinkedList使用的是双向链表。

3.插入和删除是否受元素位置的影响:①ArrayList采用数组储存,所以插入和删除元素的时间复杂度受元素位置的影响。会将目标元素的后面所有元素进行移动。②LinkedList采用链表存储,所以插入和删除操作不受元素位置的影响。直接断开链表进行插入与删除,不必大规模操作之后的元素。

4.是否支持快速随机访问:LinkedList不支持高效的随机元素访问,而ArrayList支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。

5.内存空间占用:ArrayList的空间浪费主要体现在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为一个节点(双链表)要放前指针、值、后指针)。

31.this 和 super 的区别:

this 代表本类对象的引用,super 代表父类对象的引用;
this 用于区分局部变量和成员变量;
super 用于区分本类变量和父类变量;
this.成员变量,this.成员方法(),this(【参数】)代表调用本类内容;
super.成员变量,super.成员方法(),super(【参数】)代表调用父类内容;
this 和 super 不能同时出现在同一个构造方法里,因为他们俩只要出现就必须得放第一行,会冲突!
(用的都是地址值)

32.在Java中,子类可以从父类中继承哪些?

(1)继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里。

(2)继成默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里。

(3)无法继承private修饰的属性和方法。

(4)无法继承父类的构造方法。

33.谈谈final, finally,finalize的区别

final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。

   因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。

   被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,

   不能重载finally—再异常处理时提供finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入finally 块(如果有的话)finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。

   它是在Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。

  finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的

34.Math.round(11.5)等於多少?Math.round(-11.5)等于多少?

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

35.几种常用的数据结构及内部实现原理?

链表:一个链表由很多节点组成,每个节点包含表示内容的数据域和指向下一个节点的链域两部分。正是通过链域将节点连接形成一个表。围绕链表的基本操作有添加节点、删除节点和查找节点等。

 堆栈:限定了只能从线性表的一端进行数据的存取,这一端称为栈顶,另一端为栈底。入栈操作是先向栈顶方向移动一位,存入数据;出栈操作则是取出栈顶数据,然后向栈底移动一位。体现LIFO/FILO的思想。

 队列:限定了数据只能从线性表的一端存入,从另一端取出。存入一端成为队尾,取出一端称为队首。体现LILO/FIFO的思想。

 二叉树:树中的每个节点最多有两个子节点。这两个子节点分别称为左子节点和右子节点。在建立二叉搜索树时,要求一个节点的左子节点的关键字值小于这个节点而右子节点的关键字值大于或等于这个节点。常见的遍历操作有前序、中序和后序遍历。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值