java面试(基础)

2 篇文章 0 订阅
1、一个java源文件里面是否可以包含多个类(不是内部类),有什么限制
答案:可以有多个类,但是只能有一个public的类,而且public类的类名必须和文件名一致

2、&和&&的区别
答案:&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都未true的时候,整个表达式才为true,否则只有一方是false,结果都为false。
&&还具有短路的功能,当第一个表达式为false的时候,就不会再计算第二个表达式了,所以当第一个表达式为false的时候第二个表达式有什么异常的话也不会抛出了
&还可以用作位运算符,当&操作符两边的表达式不是Boolean类型时,&表示按位与操作,通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,0x31&0x0f的结果为0x01.

3、switch语句可以作用在哪些类型上
switch(express)中,express只能是一个整数表达式或者枚举常量,由于byte,short,char都可以隐含转换成int,所以,这些类型以及这些类型的包装类也是可以的,在java5以后,String也是允许被使用的。 但是String被使用时会转换成地址int类型的转换(not sure)

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

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

如果一个变量执行的数据是对象类型的,那么这时候就涉及了两块内存,对象本省占用一块内存(堆内存),变量也占用一块内存,对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,既要看这两个变量所对应的内存中的数值是否相等,这时候就需要使用==操作符进行比较

equals方法是用于比较两个独立对象的内容是否相同
equals操作表示的两个变量是否是对同一个对象的引用。
如果一个类没有自己定义equals方法,那么它讲集成Object的equals方法
boolean equals(Object o){
return this==o;
}
上面是object的equals方法,也是使用equals方法,如果类没有重写equals方法的话,都是使用==来进行比较的。 、

6、封装
封装保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚,低耦合”,防止程序相互依赖性而带来的变动影响。
在面向对象编程语言中,对象是封装的基本单位,面向对象的封装比传统语言的封装性更为清晰更为有力。
面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个模块中,也就是一个类。属性用变量定义,行为用方法定义。
把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。

7、抽象
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,讲目标集中在与当前目标相关的方面。

8、继承
在定义和实现一个类的时候,可以在一个已经存在饿类的基础上进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或者修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这就是类之间的一种关系,提高了软件的可重用性和可扩展性。

9、多态
多态是同一行为具有多个不同表现形式和形态的能力。
多态具有的优点:消除类型之间的耦合关系、可替换性、可扩充性、接口性、灵活性、简化性
多态存在的三个必要条件:继承、重写、父类引用指向子类对象
多态实现方式一、重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不变,壳不变,核心重写
重载
重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同

多态实现方式二、接口
多态实现方式三、抽象类和抽象方法

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

11、final,finally,finalize的区别
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可集成
内部类要访问局部变量,局部变量必须定义成final类型
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾回收时的其它资源回收,例如关闭文件等,JVM不保证此方法总被调用。

12、运行时异常与一般异常有何异同
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见的运行时异常。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明未抛出未捕获的运行时异常。

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

14、内部类和外部类的调用
内部类可以直接调用外部类包括private的成员变量,使用外部类引用的this,关键字调用即可。
但是外部类调用内部类需要建立内部类对象

15、多线程
一个进程是一个独立的运行环境,可以看做是一个程序,而线程可以看做是进程的一个任务。
多线程程序中,多线程并发可以提高程序的效率,CPU不会因为某个线程等待资源而进入空闲状态,它会把资源让给其它的线程。
用户线程就是我们开发程序创建的线程,而守护线程为系统线程,如JVM虚拟中的GC
线程的优先级,每个线程都有优先级别,优先级别高的可以先获取CPU资源,使该线程从就绪状态转为运行状态,也就是自定义线程的优先级别
死锁:至少两个以上线程争取两个以上CPU资源,避免死锁就避免使用嵌套锁,只需要在他们需要同步的地方加锁和避免无限等待

16、抽象类和接口的区别
抽象类和接口之间的主要区别在于,抽象类可以拥有任意范围的成员数据,同时也可以拥有自己的非抽象方法,但是接口方式中,它仅能够有静态的不能修改的成员数据,同时它所有的方法都必须是抽象的。
抽象类是对类抽象,而接口时对行为的抽象。抽象类是对整个类进行抽象,包括属性、行为,但是接口却是对类局部行为进行抽象。

17、final有哪些用法
(1)被final修饰的类不可以被继承
(2)被final修饰的方法不能被重写
(3)被final修饰的变量不可以被修改,如果修饰的引用,那么表示引用不可变,引用指向的内容可变
(4)被final修饰的方法,JVM会尝试将其内联,以提高运行效率
(5)被final修饰的常量,在编译阶段会存入常量池中。

18、String和StringBuffer区别
String是字符串常量,被final修饰,StringBuffer字符串变量(线程安全),StringBuilder字符串变量(线程不安全)
String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象,所以尽量不对String进行大量的拼接操作,否则会产生很多临时对象,到时GC开始工作,影响系统性能。
StringBuffer是对对象本身操作,而不是产生新的对象,因此在通常在有大量拼接的情况下建议用StringBuffer。
StringBuffer是线程安全的可变字符串,其内部实现是可变数组,StringBuilder是java5.0新增的,功能和StringBuffer类似,但是非线程安全。因此,在多线程问题的前提下,使用StringBuilder会取得更好的性能。

19、如何在两个线程之间共享数据
通过在线程之间共享对象就可以了,然后通过wait,notify,notifyAll、await,signal,signalAll进行唤起和等待,比如阻塞队列blockingQueue就是为线程之间共享数据而设计的

20、要在线程安全的使用hashmap
HashMap是自动扩容的
要线程安全的使用hashmap,有三种方式
//Hashtable,hashtable底层就是基于线程安全的
Map<String, String> hashtable = new Hashtable<>();
 
//synchronizedMap
Map<String, String> synchronizedHashMap = Collections.synchronizedMap( new HashMap<String, String>());
 
//ConcurrentHashMap
Map<String, String> concurrentHashMap = new ConcurrentHashMap<>();

21、ArrayList和linklist,vector的区别
ArrayList是基于动态数组实现的数据结构,linklist是基于链表的数据结构
对应随机的ArrayList,get和set的效率较高,linklist要移动指针
对于新增和删除操作,linklist的效率会更高一些,因为ArrayList要移动数据
ArrayList内部是使用可增长数组实现的,所以get和set方法是花费常数时间的,但是如果插入和删除元素,开销会很大,因为要移动数据,除非数据是在末尾
linklist是使用双链表实现的,所以get会非常消耗资源,除非位置离头部很近,否则插入和删除花费常数时间。
ArrayList和linklist都是不同步的,vector是同步的。
ArrayList和vector都是使用object的数组形式来存储的。
vector自动增长会增长原来的一倍,ArrayList自动增长百分之五十


22、java中double和float的区别
float是单精度浮点数,内存中占用4字节,double是双精度浮点数,内存中占用8字节


23、在多线程中,如何确保资源不会同时被多个线程使用
在多线程中,可以通过使用同步的概念来控制对多个线程之间共享的资源的访问。使用synchronize关键字,我们可以确保只有一个线程可以一段时间内使用共享资源。

24、继承的好处
使用继承的主要优点是代码的可重用性,因为继承使子类能够重用其父类的代码。
多态性(可扩展性)是另外一个好处,允许引入新的功能而不影响现在的派生类。

25、override和overload的区别
overload是方法的重载,override是覆盖的意思,也就是重写
属性没有重写,只有方法有重写

26、Thread和Runnable实现多线程的区别和联系
Tread类实现了Runnable接口,都需要重写Run方法
实现Runnable的类更具有健壮性,避免了单继承的局限
Runnable更容易实现资源共享,能多个线程同时处理一个资源

27、token和session的区别
token和session其实都是为了身份验证,session翻译为会话,而token翻译为令牌。
session服务器会保存一份,可能保存到缓存、文件、数据库;同样,session和token都有过期时间,都需要去管理过期时间;
其实token和session的问题是一种时间换空间的博弈问题,session是空间换时间,token是时间换空间,两者的选择要看具体情况而定。

28、java的反射机制
java反射机制是在运行状态下,对于任意一个类,都能够知道这个类的所有的属性和方法。对于任意一个对象,都能够调用他的任意的方法和属性。这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wyu-jat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值