文章目录
- **1.&和&&的区别?**
- **2.在java 中如何跳出当前的多重循环?**
- **3.最有效率的方法算出2X8 等于几?**
- **4.** **"** **==** **"** **和 equals 方法究竟有什么区别?**
- **5. Int 和integer 的区别?**
- **6.三个与取整有关的方法:**
- **7.重载和重写的区别?**
- **8.面向对象的特征?**
- **9.String 和StringBuffuer 、StringBuilder 的区别?**
- **10.java 中有几种方法实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?**
- **11.sleep()和wait()有什么区别?**
- **12.同步和异步的区别?同步的实现方法?**
- **13.** **请对比 synchronized 与java.util.concurrent.locks.Lock 的异同** **?**
- **14.String s =new String (** **"** **syz** **"** **);创建了几个String Object?**
- **15.作用域public 、private 、protected 以及不写时的区别?**
- **16.forward 和redirect 两种跳转方式的区别?**
- **18.编程单例模式:写一个singleton 出来**
- **19.编程冒泡排序:用java 实现冒泡排序?快速排序的方法。**
- **20.** **H** **ashMap 和Hashtable 的区别?**
- **21.List 、Set 和Map 的区别?**
- **22.什么时候用assert ?**
- **23.使用java.lang.Math,生成100 个0 到99 之间的随机整数,找出最大和最小,并统计大于50 的整数个数?**
整理一下 常见得Java面试题
写在前面: 我是
「软测小刘
」,这个昵称来源于我的生活,对测试保持激情,敢于探索 细心大胆。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。
这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。
用知识改变命运,让我们的家人过上更好的生活。
1.&和&&的区别?
&:逻辑与(and ),运算符两边的表达式均为true 时,整个结果才为true 。
&&:短路与,如果第一个表达式为false 时,第二个表达式就不会计算了。
2.在java 中如何跳出当前的多重循环?
在循环语句外前面定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出循环。
比如:
ok:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
break ok;
3.最有效率的方法算出2X8 等于几?
使用位运算,效率最高:2<
4. " == " 和 equals 方法究竟有什么区别?
:表示两个变量的值是否相等,比较两个基本数据类型的数据或者引用变量,用。
equals:用于比较两个独立对象的内容是否相同。字符串的比较也用equals 。
5. Int 和integer 的区别?
Int 是Java 的8 中基本数据类型之一,integer 是int 的封装类。Int 类型的默认值为0 ,integer 默认值为null ,所以区别在于,integer 能区分出null 值和0 的区别。
6.三个与取整有关的方法:
Math.ceil():表示向上取整;Math.ceil(11.3)=12;Math.ceil(-11.3)=-12 。
Math.floor():表示向下取整;Math.floor(11.6)=11;Math.floor(-11.6)=-12 。
Math.round():表示四舍五入;Math.round(11.5)=12;Math.round(-11.5)=-11;
Math.round(11.3)=11;Math.round(-11.3)=-11;
7.重载和重写的区别?
重载(Overload ):函数名相同,参数不同。可以改变返回值类型,参数的个数和类型。
重写(Override ):和父类的的方法名称、参数完全相同。
8.面向对象的特征?
**封装:**将对象属性和方法的代码封装到一个模块中,也就是一个类中,保证软件内部具有优良的模块性的基础,实现"高内聚,低耦合"。
抽象:找出一些事物的相似和共性之处,然后归为一个类,该类只考虑事物的相似和共性之处。抽象包括行为抽象和状态抽象。
继承:在已经存在的类的基础上进行,将其定义的内容作为自己的内容,并可以加入新的内容或者修改原来的方法适合特殊的需要。
**多态:**同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,就是多态,简单点说:就是用父类的引用指向子类的对象。目的:提高代码复用性,解决项目中紧耦合问题,提高可扩展性。
**多态的机制:**靠的是父类的或者接口的引用变量可以指向子类或者具体实现类的实例对象。
9.String 和StringBuffuer 、StringBuilder 的区别?
String:字符串数值不可变;
StringBuffer :字符串可修改,可以动态构造字符数据。StringBuffer 类是可以通过Append()来修改值。线程安全。
StringBuilder :线程不安全。
三者在执行速度方面的比较:StringBuilder > StringBuffer > String
对于三者使用的总结:
1.如果要操作少量的数据用= String
2.单线程操作字符串缓冲区下操作大量数据= StringBuilder
3.多线程操作字符串缓冲区下操作大量数据= StringBuffer
10.java 中有几种方法实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
第一种:继承Thread 类。New Thread(){}.start():表示调用子类对象的run 方法。
第二种:实现Runable 接口。
第三种:线程池创建多线程。
第四种:实现Callable 接口,重写call 函数(
继承Thread 类实现多线程,重写run 方法时没有返回值也不能抛出异常,使用Callable 接口就可以解决这个问题。
Callable 接口和Runnable 接口的不同之处:
1.Callable 规定的方法是call ,而Runnable 是run
2.call 方法可以抛出异常,但是run 方法不行
3.Callable 对象执行后可以有返回值,运行Callable 任务可以得到一个Future 对象,通过Future 对象可以了解任务执行情况,可以取消任务的执行,而Runnable 不可有返回值
用synchronized 关键字修饰同步方法。
反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们,结果很难检查出真正的问题所在。
suspend() 方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread 类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。
11.sleep()和wait()有什么区别?
sleep 是线程被调用时,占着cpu 休眠,其他线程不能占用cpu ,os 认为该线程正在工作,不会让出系统资源,wait 是进入等待池等待,让出系统资源,其他线程可以占用cpu 。
sleep()和wait()方法的区别可从两个角度阐述:
1.cpu的抢占权;2.锁旗标是否释放
两者都会释放cpu的抢占权;
wait()方法执行完即可释放锁旗标,进入线程的等待队列;
sleep()执行完,不会释放,进入等待队列;
12.同步和异步的区别?同步的实现方法?
同步:发送一个请求,等待返回,然后再发送下一个请求。实现:1.Synchronized 修饰;2.wait 和notify 。
异步:发送一个请求,不等待返回,随时可以再发送下一个请求。
同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。
同步和异步最大的区别就在于,一个需要等待,一个不需要等待。
比如广播,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息。
电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。需要等待接收者的返回信息。
13. 请对比 synchronized 与java.util.concurrent.locks.Lock 的异同 ?
主要相同点:Lock 能完成synchronized 所实现的所有功能
主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能。synchronized 会自动释放锁,而Lock 一定要求程序员手工释放,并且必须在finally 从句中释放。
14.String s =new String ( " syz " );创建了几个String Object?
1.如果String 常理池(常量缓冲区)中,已经创建"xyz",则不会继续创建,此时只创建了一个对象new String(“xyz”);
2.如果String 常理池中,没有创建"xyz",则会创建两个对象,一个对象的值是"xyz",一个对象new String(“xyz”)。
15.作用域public 、private 、protected 以及不写时的区别?
private 修饰的成员变量和函数只能在类本身和内部类中被访问。
protected 修饰的成员变量和函数能被类本身、子类及同一个包中的类访问。
public 修饰的成员变量和函数可以被类、子类、同一个包中的类以及任意其他类访问。
默认情况(不写)下,属于 一种包访问,即能被 类本身以及同一个包中的类访问。
作用域
当前类
同一package
子孙类
其他package
public
protected
friendly
private
16.forward 和redirect 两种跳转方式的区别?
1.从地址栏显示来说
forward 是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2.从数据共享来说
forward:转发页面和转发到的页面可以共享request 里面的数据.
redirect:不能共享数据.
3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
4.从效率来说
forward:高.
redirect:低.
本质上说,转发是服务器行为,重定向是客户端行为。其工作流程如下:
转发过程:客户浏览器发送http 请求----》web 服务器接受此请求–》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web 容器下的url ,其不能转向到其他的web 路径上去,中间传递的是自己的容器内的request 。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http 请求----》web 服务器接受后发送302 状态码响应及对应新的location 给客户浏览器–》客户浏览器发现是302 响应,则自动再发送一个新的http 请求,请求url 是新的location 地址----》服务器根据此请求寻找资源并发送给客户。在这里location 可以重定向到任意URL ,既然是浏览器重新发出了请求,则就没有什么request 传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
18.编程单例模式:写一个singleton 出来
S ingleton 分为:饱汉模式、饥汉模式、双重锁模式
**//**饱汉模式:类加载时完成初始化,创建出实例对象(不管用不用,先创建)。
public class SingleTon {
//实例化对象放到静态代码块中,可提高执行效率,但是可能更占用空间
private final static SingleTon instence= new SingleTon();
private SingleTon(){};//私有的构造函数
//获取方法
public static SingleTon getinstance(){
return instence;
**//**饥汉模式:延迟加载,在第一次用的时候才创建出对象,存在线程安全问题。
public class SingleTon {
private static SingleTon instence= null;
private SingleTon(){};//私有的构造函数
//获取方法
public static synchronized SingleTon getinstance(){
if(instence== null){
//第一次使用的时候创建对象
instence= new SingleTon();
return instence;
19.编程冒泡排序:用java 实现冒泡排序?快速排序的方法。
冒泡排序:
int temp = 0;
int[] sortNum = {12,33,28,86,15,62,9,38};
for (int i = 0; i < sortNum.length-1; i++) { //第一个for 循环控制排序要走多少趟,最多做n-1 趟排序
for (int j = 0; j < sortNum.length-1-i; j++) { //第2 个for 循环控制每趟比较多少次
if(sortNum[j+1]
temp = sortNum[j];
sortNum[j] = sortNum[j+1];
sortNum[j+1] = temp;
System. out.println(Arrays. toString(sortNum));
1.对基本数据类型数组的排序
1>数字排序:
int[] intArray = new int[]{1,56,-5,33};
Arrays. sort(intArray);
System. out.println(Arrays. toString(intArray));
2>字符串排序(先大写后小写):
String[] strArray = new String[]{“Z”, “a”, “D”};
Arrays. sort(strArray);
System. out.println(Arrays. toString(strArray));
20. H ashMap 和Hashtable 的区别?
HashMap :实现了Map 接口,允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率高于Hashtable 。
Hashtable :不能将null 作为key 或者value 。方法是同步的,线程安全。
21.List 、Set 和Map 的区别?
List:是存储单列数据的集合,存储有顺序,允许重复。继承Collection 接口。
Set: 是存储单列数据的集合。继承Collection 接口。不允许重复。
Map:存储键和值这样的双列数据的集合,存储数据无顺序,键(key)不能重复,值(value)。可以重复。
22.什么时候用assert ?
在调试程序时使用,对一个boolean 表达式进行检查。为true ,则程序正确,如果为false ,系统则给出警告或者退出。
23.使用java.lang.Math,生成100 个0 到99 之间的随机整数,找出最大和最小,并统计大于50 的整数个数?
import java.util.Random;
public class RandomTest {
public static void main(String args[]) {
int max = 0;
int min = 0;
String sum="";
int num=0;
for (int i = 0; i