首页 > 编程语言 > 详细

Java面试题208道

时间:2019-03-13 15:10:04      阅读:529      评论:0      收藏:0      [点我收藏+]

一、Java 基础

1.JDK 和 JRE 有什么区别?

答:JRE是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

  JDK是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的

2.== 和 equals 的区别是什么?

答:==是比较两个对象的地址,equals是比较连个对象的内容

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

答:不对!hashCode()相同,不代表连个对象就相同。hashCode值是从hash表中得来的,hash是一个函数,该函数的实现是一种算法,通过hash算法算出hash值,hash表就是 hash值组成的,一共有8个位置。

  相反,equals()相同,hashCode()一定相同。这个是正确的!

4.final 在 java 中有什么作用?

答:final的作用随着所修饰的类型而不同:

  1. final修饰类中的属性或者变量:无论属性是基本类型还是引用类型,final所起的作用都是变量里面存放的“值”不能变
  2. final修饰类中的方法:可以被继承,但继承后不能被重写
  3. final修饰类:类不可以被继承

5.java 中的 Math.round(-1.5) 等于多少?

答:-1

  计算方法:

    1. 参数的小数点后第一位<5,运算结果为参数整数部分
    2. 参数的小数点后第一位>5,运算结果为参数整数部分绝对值+1,符号(即正负)不变
    3. 参数的 小数点后第一位=5,正数运算结果为整数部分+1,负数运算结果为整数部分

  总结:大于五全部加,等于五正数加, 小于五全不加

6.String 属于基础的数据类型吗?

答:不是。String是一个对象,是java等编程语言的字符串。

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

答:String、StringBuffer、StringBuilder

  区别:String是不可变的对象,对每次对String类型的改变时都会生成一个新的对象,StringBuffer和StringBuilder是可以改变对象的。

     对于操作效率:StringBuilder > StringBuffer > String

     对于线程安全:StringBuffer 是线程安全,可用于多线程;StringBuilder 是非线程安全,用于单线程

     不频繁的字符串操作使用 String。反之,StringBuffer 和 StringBuilder 都优于String

8.String str="i"与 String str=new String("i")一样吗?

答:不一样,因为他们不是同一个对象。

9.如何将字符串反转?

答:有多种方法。我列出3种方法。

第一种:

public class Main {

    public static void main(String[] args) {
        String s1 = "asdfghjkl";        System.out.println(new Main().swapWords(s1));

    }

    public void swap(char[] arr, int begin, int end) {
        while (begin < end) {
            char temp = arr[begin];
            arr[begin] = arr[end];
            arr[end] = temp;
            begin++;
            end--;
        }
    }

    public String swapWords(String str) {
        char[] arr = str.toCharArray();
        swap(arr, 0, arr.length - 1);
        int begin = 0;
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] == ‘ ‘) {
                swap(arr, begin, i - 1);
                begin = i + 1;
            }
        }
        return new String(arr);
    }
}

第二种:

public class Main {

    public static void main(String[] args) {
        String s1 = "asdfghjkl";
        String[] s = s1.split("");
        List<String> list = list = Arrays.asList(s);
        Collections.reverse(list);
        System.out.println(list);
    }
}

第三种:

public class Main {

    public static void main(String[] args) {
        String s1 = "asdfghjkl";
        System.out.println(new StringBuilder(s1).reverse().toString());
    }
}

10.String 类的常用方法都有那些?

答:下面列举了20个常用方法。格式:返回类型  方法名  作用。

1、和长度有关:

  • int length() 得到一个字符串的字符个数

2、和数组有关:

  • byte[] getByte() ) 将一个字符串转换成字节数组
  • char[] toCharArray() 将一个字符串转换成字符数组
  • String split(String) 将一个字符串按照指定内容劈开

3、和判断有关:

  • boolean equals() 判断两个字符串的内容是否一样
  • boolean equalsIsIgnoreCase(String) 忽略太小写的比较两个字符串的内容是否一样
  • boolean contains(String) 判断一个字符串里面是否包含指定的内容
  • boolean startsWith(String) 判断一个字符串是否以指定的内容开头
  • boolean endsWith(String) 判断一个字符串是否以指定的内容结尾

4、和改变内容有关:

  • String toUpperCase() 将一个字符串全部转换成大写
  • String toLowerCase() 将一个字符串全部转换成小写
  • String replace(String,String) 将某个内容全部替换成指定内容
  • String replaceAll(String,String) 将某个内容全部替换成指定内容,支持正则
  • String repalceFirst(String,String) 将第一次出现的某个内容替换成指定的内容
  • String substring(int) 从指定下标开始一直截取到字符串的最后
  • String substring(int,int) 从下标x截取到下标y-1对应的元素
  • String trim() 去除一个字符串的前后空格

5、和位置有关:

  • char charAt(int) 得到指定下标位置对应的字符
  • int indexOf(String) 得到指定内容第一次出现的下标
  • int lastIndexOf(String) 得到指定内容最后一次出现的下标

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

答:抽象类中不一定要包含抽象(abstrace)方法。也就是了,抽象中可以没有抽象(abstract)方法。反之,类中含有抽象方法,那么类必须声明为抽象类。

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

答:

  1. 抽象类不能被实例
  2. 抽象类不能有构造函数,抽象方法也不能被声明为静态
  3. 抽象类可以有抽象方法
  4. 抽象类的抽象方法必须被非抽象子类继承

13.抽象类能使用 final 修饰吗?

答:不能,抽象类中的抽象方法是未来继承之后重写方法,而用final修饰的类,无法被继承。

14.接口和抽象类有什么区别?

答:

  1. 抽象类是被子类继承,接口是被类实现
  2. 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
  3. 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量
  4. 接口是设计的结果 ,抽象类是重构的结果

15.java 中 IO 流分为几种?

答:可以分4种。

  1. 字节输入流(InputStream
  2. 字节输出流(OutputStream
  3. 字符输入流(Reader
  4. 字符输出流(Writer

16.BIO、NIO、AIO 有什么区别?

参考:https://blog.csdn.net/u010310183/article/details/81700405

17.Files的常用方法都有哪些?

参考:https://www.cnblogs.com/cocoxu1992/p/10460994.html

二、容器

18.java 容器都有哪些?

答:List、Set、Map

19.Collection 和 Collections 有什么区别?

答:Collection是集合类的顶级接口,其派生了两个子接口 Set 和 List。

  Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

总的来说:Collection是一个接口,而Collections是个类。

20.List、Set、Map 之间的区别是什么?

答:

  • List:
    • 可以允许重复对象
    • 可以插入多个null元素
    • 是一个有序容器
  • Set:
    • 不允许重复对象
    • 只允许一个null元素
    • 无序容器
  • Map:
    • Map不是Collection的子接口或实现类。Map是一个接口
    • Map 的每个Entry都特有两个对象,也就是一个键一个值,Map可能会持有相同的值对象但键对象必须是唯一的
    • Map里可以拥有随意个niull值但最多只能有一个null键

21.HashMap 和 Hashtable 有什么区别?

答:

22.如何决定使用 HashMap 还是 TreeMap?

答:

23.说一下 HashMap 的实现原理?

答:

24.说一下 HashSet 的实现原理?

答:

25.ArrayList 和 LinkedList 的区别是什么?

答:

  • ArrayList 与 LinkedList都实现了List接口
  • ArrayList 是线性表,底层是使用数组实现的,它在尾端插入和访问数据时效率较高
  • LinkedList 是双向链表,它在中间插入或者插入时效率较高,在访问数据时效率较低

26.如何实现数组和 List 之间的转换?

答:

27.ArrayList 和 Vector 的区别是什么?

答:

28.Array 和 ArrayList 有何区别?

答:Array 与 ArrayList 都是用来存储数据的集合。ArrayList 底层是使用数组实现的,但是ArrayList对数组进行了封装和功能扩展 

29.在 Queue 中 poll()和 remove()有什么区别?

答:

30.哪些集合类是线程安全的?

答:

31.迭代器 Iterator 是什么?

答:

32.Iterator 怎么使用?有什么特点?

答:

33.Iterator 和 ListIterator 有什么区别?

答:

34.怎么确保一个集合不能被修改?

答:

三、多线程

35.并行和并发有什么区别?

答:

  • 并发在单核和多核都可存在,就是同一时间有多个可以执行的进程。但是在单核中同一时刻只有一个进程获得CPU,虽然宏观上你认为多个进程都在进行
  • 并行是指同一时间多个进程在微观上都在真正的执行,这就只有在多核的情况下了

36.线程和进程的区别?

答:

  • 线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位
  • 进程:是资源分配的基本单位。一个进程包括多个线程

区别:地址空间、资源拥有

  1. 线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源
  2. 每个进程都有自己一套独立的资源(数据),供其内的所有线程共享
  3. 不论是大小,开销线程要更“轻量级”
  4. 一个进程内的线程通信比进程之间的通信更快速,有效。(因为共享变量)

37.守护线程是什么?

答:守护线程是个服务线程,服务于其他线程

典型案例:垃圾回收线程

38.创建线程有哪几种方式?

答:

  • 继承Threa类创建线程
  • 实现Runnable接口创建线程
  • 通过Callable和Future创建线程

39.说一下 runnable 和 callable 有什么区别?

答:

40.线程有哪些状态?

答:创建、就绪、运行、阻塞、死亡

41.sleep() 和 wait() 有什么区别?

 答:

  • sleep() 可以在任何地方使用
  • wait() 只能在同步方法或同步块中使用

42.notify()和 notifyAll()有什么区别?

答:

  • notify是唤醒某个线程
  • notifyAll是唤醒所有暂停线程

43.线程的 run()和 start()有什么区别?

答:

  • run() 相当于线程的任务处理逻辑的入口方法
  • start() 的作用是启动相应的线程

44.创建线程池有哪几种方式?

45.线程池都有哪些状态?

46.线程池中 submit()和 execute()方法有什么区别?

47.在 java 程序中怎么保证多线程的运行安全?

48.多线程锁的升级原理是什么?

49.什么是死锁?

50.怎么防止死锁?

51.ThreadLocal 是什么?有哪些使用场景?

答:ThreadLocal用于保存某个线程共享变量。使用场景:解决数据库连接,Session管理

52.说一下 synchronized 底层实现原理?

答:

53.synchronized 和 volatile 的区别是什么?

54.synchronized 和 Lock 有什么区别?

55.synchronized 和 ReentrantLock 区别是什么?

56.说一下 atomic 的原理?

四、反射

57.什么是反射?

答:可以将一个程序(类)在运行的时候获得该程序(类)的信息的机制,也就是获得在编译期不可能获得的类的信息,因为这些信息是保存在Class对象中的,而这个Class对象是在程序运行时动态加载的 

58.什么是 java 序列化?什么情况下需要序列化?

答:系列化就是把java对象转换为字节序列的方法。

  • 把对象的字节序列化到永久的保存到硬盘中
  • 在网络上传递对象的字节序列

59.动态代理是什么?有哪些应用?

答:

  • 动态代理指的是可以任意控制任意对象的执行过程
    • 本来应该自己做的事情,因为没有某种原因不能直接做,只能请别人代理做。被请的人就是代理
    • 比如春节买票回家,由于没有时间,只能找票务中介来买,这就是代理模式
  • 应用:Spring 的 AOP

60.怎么实现动态代理?

答:

  • JDK动态代理
  • cglib动态代理

五、对象拷贝

61.为什么要使用克隆?

62.如何实现对象克隆?

63.深拷贝和浅拷贝区别是什么?

六、Java Web

64.jsp 和 servlet 有什么区别?

答:

  • jsp经编译后就成了Servlet(Jsp的本质就是Servlet,JVM只能识别Java类,不能识别Jsp代码,Web容器将Jsp的代码编译成JVM能够识别的java类)
  • jsp更擅长表现于页面显示,servlet更擅长于逻辑控制
  • Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到

65.jsp 有哪些内置对象?作用分别是什么?

66.说一下 jsp 的 4 种作用域?

67.session 和 cookie 有什么区别?

68.说一下 session 的工作原理?

69.如果客户端禁止 cookie 能实现 session 还能用吗?

70.spring mvc 和 struts 的区别是什么?

71.如何避免 sql 注入?

72.什么是 XSS 攻击,如何避免?

73.什么是 CSRF 攻击,如何避免?

七、异常

74.throw 和 throws 的区别?

75.final、finally、finalize 有什么区别?

76.try-catch-finally 中哪个部分可以省略?

77.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

78.常见的异常类有哪些?

八、网络

79.http 响应码 301 和 302 代表的是什么?有什么区别?

80.forward 和 redirect 的区别?

81.简述 tcp 和 udp的区别?

82.tcp 为什么要三次握手,两次不行吗?为什么?

83.说一下 tcp 粘包是怎么产生的?

84.OSI 的七层模型都有哪些?

85.get 和 post 请求有哪些区别?

86.如何实现跨域?

87.说一下 JSONP 实现原理?

九、设计模式

88.说一下你熟悉的设计模式?

89.简单工厂和抽象工厂有什么区别?

十、Spring/Spring MVC

90.为什么要使用 spring?

答:spring是一个开源框架,是个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架

  • 方便结构简化开发
  • AOP编码的支持
  • 声明式事物的支持
  • 方便程序的测试
  • 方便集成各种优势框架
  • 降低Java EE API 的使用难度

91.解释一下什么是 aop?

 答:AOP即面向切面编程,是OOP编程的有效补充。使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。

AOP分为静态AOP和动态AOP:

  • 静态AOP是指AspectJ实现的AOP,他是将切面代码直接编译到Java类文件中。
  • 动态AOP是指将切面代码进行动态织入实现的AOP,JDK动态代理。

92.解释一下什么是 ioc?

答:即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

  IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

93.spring 有哪些主要模块?

答:core模块、aop模块、data access模块、web模块、test模块

94.spring 常用的注入方式有哪些?

答:详细解析:https://blog.csdn.net/a909301740/article/details/78379720

  • 构造方法注入
  • setter注入
  • 基于注解注入

95.spring 中的 bean 是线程安全的吗?

答:

96.spring 支持几种 bean 的作用域?

答:singleton、prototype、request、session、globalSession五中作用域。

97.spring 自动装配 bean 有哪些方式?

答:可分为四种:

    • byName:按照bean的属性名称来匹配要装配的bean
    • byType:按照bean的类型来匹配要装配的bean
    • constructor:按照bean的构造器入参的类型来进行匹配 
    • autodetect(自动检测):先使用constructor进行装配,如果不成功就使用byType来装配

Java面试题208道

原文:https://www.cnblogs.com/dzcici/p/10523231.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!