java笔试题错题集收录---下次不要跳坑了啊!!!(持续更新)

  1. hashMap在单线程中大大提高效率,在多线程的情况下hashTable大大提高效率。在HashTable中使用synchronized关键字来实现安全机制,但是synchronized是对整张hash表进行锁定即让整个线程独享hash表,在安全的同时大大浪费了内存空间。currentHashMap采用了分段加锁来确保安全。

  2. 一个java文件可以包含多个java类,但是只能包含一个public外部类,并且public类的类名必须与java文件名相同,包括大小写。

  3. 类变量在不设置初始值的情况下,会默认赋值,而局部方法中声明的变量和final声明的变量必须初始化,不会默认赋值。

  4. 17^5中 ^是位异运算符号,运算规则是两个值转换为二进制,在进行异或运算(同0异1)最后转换为十进制数。

  5. java分为运行时异常和非运行时异常(受检异常),运行时异常不需要去捕获,异常出现时,jvm会自动帮我们处理。非运行异常需要程序员手动去捕获或者抛出异常进行显示的处理,因为Java认为Checked异常都是可以被修复的异常。

  6. main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面。
    前台线程和后台线程的区别和联系:
    1、后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。
    2、可以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。
    3、不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。
    4、托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。

  7. 静态块并不是最先初始化的!而是静态域,静态域包括静态变量、静态方法、静态块,其中需要初始化的是静态块和静态变量,而他们初始化的顺序是他们的先后顺序决定的!

  8. i++也是一个表达式是有返回值的,返回值是i自增前i的值,执行i=i++之后虽然i自增为1,但是又被i++的返回值给重新赋值了。

  9. 函数重载:方法名称相同,参数个数、参数顺序、参数类型不同。函数重载跟返回值半毛钱关系没有!

  10. preparedStatement和statement的区别与联系:在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。 PreparedStatement 接口继承 Statement , PreparedStatement 实例包含已编译的 SQL 语句, 所以其执行速度要快于 Statement 对象。

  11. 为了更好的组织类,java中提供了包机制,用于区别类名的命名空间,同时包也提供了访问控制权限,拥有包访问权限的类才能访问某个包中的类。

  12. list的add方法是在末尾添加,有两个参数的是在索引位置进行添加,remove方法删除索引位置的数据。

  13. 最基本最基本最基本的访问控制权限范围:public>protected>default(包权限)>private。

  14. 抽象类和接口的区别:接口中只能定义public static final 修饰的常量,抽象类中可以定义普通变量;接口中没有构造方法,抽象类中有构造方法只是不能被实例化;接口可以多实现,而抽象类只能单继承;接口在jdk1.8之前只能定义public abstract修饰的方法,1.8之后可以定义默认和静态方法,jdk1.9之后可以定义私有方法,抽象类中没有限制。

  15. 线程局部存储TLS是解决多线程中对访问同一变量冲突的一种技术,TLS会为每一个线程维护一个和该线程绑定变量的副本。

  16. 在数据库操作中,为了保证并发读取数据的正确性,提出事务隔离级别。分别为未授权读取,也称为读未提交(read uncommitted);授权读取,也称为读提交(read committed);可重复读取(repeatable read);序列化(serializable)。而事务隔离级别是由数据库系统实现的,是数据库本身的一个功能。不是java程序去是实现的,我们只是去设定事务的隔离级别。

  17. String中subString方法返回一个左闭右开的子字符串的字符串。

  18. java多线程实现的四种方法:
    1、继承Thread类,重写run方法
    2、实现Runnable接口,重写Run方法
    3、实现Callable接口进而重写call方法通过FutureTask包装器来创建Thread线程
    4、使用Executor框架创建线程池,实现有返回结果的多线程。(JUC提供)

  19. static只能修饰内部类,不能修饰外部类。修饰内部类的修饰词还有default、public、protected、private,而修饰外部类的修饰词有public、abstract、final、default(默认)。

  20. 构造方法不需要同步化。构造方法每次构造出新的对象,不存在多个线程同时访问同一个对象中的属性,也就不存在同步问题。

  21. 如果父类中的某个方法使用了synchronized关键字,而其子类覆盖了父类的这个方法,默认情况下子类是不是同步的,必须显式的在这个子类方法上加一个关键字synchronized才可以。当然,可在子类中调用父类的相应方法,这样虽然子类中的方法不是同步的,但是子类调用了父类的同步方法,相当于子类方法也同步了。

  22. 一般关系数据模型和对象数据模型之间存在以下关系:表对应类、记录对应对象、表的字段对应类的属性。

  23. volatile:具有有序性和可见性(差一个原子性);synchronized:具有有序性、可见性和原子性(三个都有);

  24. volatile和synchronized两个关键字的区别:volatile是线程同步的轻量级实现,所以volatile的性能要比synchronized好。但是volatile只能用于变量而synchronized可以修饰方法和代码块。synchronized在javase1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入了偏向锁和轻量级锁以及其他各种优化之后性能有了显著的提升,在实际的开发的过程中,synchronized的使用频率要高一点。多线程访问volatile关键字不会发生阻塞,而synchronized会发生阻塞。volatile关键字能够保证数据的可见性但不能保证数据的原子性,而synchronized关键字两者都可以保证。volatile关键字主要解决变量在多线程之间的可见性,synchronized关键字主要解决多线程之间访问资源的同步性。

  25. 何时使用super关键字?子类构造函数调用父类的构造函数时使用super;子类重写父类的方法后,若子类调用父类的方法时,会使用super关键字。

  26. is-a,理解为是一个,代表继承关系。 如果A is-a B,那么B就是A的父类。
    like-a,理解为像一个,代表组合关系。 如果A like a B,那么B就是A的接口。
    has-a,理解为有一个,代表从属关系。 如果A has a B,那么B就是A的组成部分。

  27. java中对字段属性是静态绑定,而方法时动态绑定,子类中试图访问父类的私有属性,编译会不通过,这里属于静态绑定,不是动态绑定的问题,去掉private关键字就好了。

  28. webservice是跨平台,跨语言的远程调用技术;webservice通信机制的实质是xml数据的交换;它采用了soap协议(简单对象协议)进行通信。

  29. 在 hibernate 开发中,POJO 类对象三态分别为持久态、游离态、瞬时态。
    (官方解释)transient: never persistent, not associated with any Session
    persistent: associated with a unique Session
    detached: previously persistent, not associated with any Session

  30. 在运行时,由java解释器自动引入,不需要import语句的是java.lang包

  31. hashmap可以插入null的key或者value值,插入的时候会检查是否存在相同的key值,如果不存在,则直接插入;如果存在,就会替换原来的key值所对应的value值。put()前面的值为key值,后面的值为value值

  32. java中final定义的变量不一定要在定义时完成初始化操作,也可以在构造方法中完成初始化

  33. java中,数据类型分为基本数据类型和引用数据类型,其中基本数据类型也叫做原生类或者内置类型。

  34. 线程中的两个方法,run和start之间的区别:
    1.start方法
    用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。
    2.run方法
    run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。

  35. 数组元素在内存中一个接着一个按线性存放的,通过第一个元素就可以访问第一个元素后的其他元素,这样的数组称为“真数组”。避免了覆盖数据的可能性,这也是java语言健壮性的特征之一。

  36. 序列化是将看得懂的格式转化为看不懂的格式,反序列化就是将看不懂的转化为看的懂得格式(通俗易懂的理解方式)!

  37. 为什么要给线程枷锁?java允许多线程并发控制,当多个线程同时操作一个可共享的数据资源时,将会导致数据不准确,相互之间产生冲突,因此加入同步锁来避免该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性。

  38. 监视器在内部是怎样做到线程同步的?监视器和锁在虚拟机中是一起使用的。监视器监视一块同步代码块,确保当前该代码块只允许一个线程执行。每个监视器和一个对象引用相关联,线程在获取锁之前不允许执行同步代码。

  39. 什么是死锁?死锁是指多个进程因为竞争资源而造成相互等待的现象,如果没有外力的作用,进程都无法执行推进。

  40. 产生死锁的条件?不可剥夺条件、互斥条件、循环等待条件、请求和保持条件。

  41. 如何确保有多个进程可以访问多个资源而不导致死锁?产生死锁的条件有四个,破坏了其中一个就行,最简单的方法局势,使用多线程时,指定获取锁的顺序,并强制线程按照指定的顺序获取锁。

  42. Socket套接字,服务器端:new ServerSocket(端口号)得到一个server,通过server的accept方法创建一个Socket;客户端:new Socket(IP,端口号)直接创建一个Socket。

  43. hibernate的原理:读取并解析配置文件;读取并配置映射文件,创建sessionFactory;创建session并打开session;创建traction事务;持久化操作;提交事务;关闭session;关闭sessionFactory;

  44. SessionFactory接口:初始化Hibernate,创建session,对SessionFactory是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级二级缓存;session接口:负责保存、更新、删除、加载和查询对象,是一个非线程安全的,避免多个线程共享一个session,是轻量级,一级缓存。

  45. 使用hibernate的好处:封装了对jdbc访问数据库的,简化了操作;基于jdbc主流的orm持久性框架,简化了dao访问数据库的操作;使用反射机制,而不是字节码增加程序实现透明性;轻量级性能非常好的框架,支持各种数据库。

  46. 1.Statement、PreparedStatement和CallableStatement都是接口(interface)。 2.Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。 3. Statement接口提供了执行语句和获取结果的基本方法; PreparedStatement接口添加了处理 IN 参数的方法; CallableStatement接口添加了处理 OUT 参数的方法。 4. Statement: 普通的不带参的查询SQL;支持批量更新,批量删除; PreparedStatement: 可变参数的SQL,编译一次,执行多次,效率高; 安全性好,有效防止Sql注入等问题; 支持批量更新,批量删除; CallableStatement: 继承自PreparedStatement,支持带参数的SQL操作; 支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持; Statement每次执行sql语句,数据库都要执行sql语句的编译 , 最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。

  47. PreparedStatement是预编译的,使用PreparedStatement有几个好处 1. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。 2. 安全性好,有效防止Sql注入等问题。 3. 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch; 4. 代码的可读性和可维护性。

  48. Object类中有如下方法:getClass、clone、hashcode、notify、notifyAll、equals、finalize、toString、wait

  49. java创建对象的方法有如下方法:1.直接new对象;2.调用object的clone方法;3.反射;4.反序列化

  50. java中一律采用Unicode编码,无论中文字符还是英文字符都是占2个字节;java虚拟机中采用Utf-16保存一个字符;ResourceBundle能够依据Local的不同,选择性的读取与Local对应后缀的properties文件,以达到国际化的目的。

  51. String、StringBuffer、StringBuilder都是final修饰的,至于为什么后两者是可变对象,因为当finl修饰类时并非限定其对象可变,而限制了该类不能被继承。

  52. 类方法是带有static修饰的方法,内部不能有this去调用,可以直接调用,可以创建实例对象调用类的实例方法。

  53. 访问权限有public、private、protected、default,但是default不能修饰变量。

  54. abstract一般只能修饰方法和类,不能修饰普通变量。

  55. ThreadLocalMap中使用开放地址法来处理散列冲突,而HashMap中使用的是分离链表法。之所以采用不同的方式主要是因为:在ThreadLocalMap中的散列值分散得十分均匀,很少会出现冲突。并且ThreadLocalMap经常需要清除无用的对象,使用纯数组更加方便。

  56. 反射的本质就是从字节码中查找,动态获取类的整容结构,包括属性,构造器,动态调用对象的方法

  57. springboot和springCloud的区别:1.springboot专注于快速方便的开发单个个体服务,而springcloud关注全局微服务的协调和整理,它将springboot中的个体微服务整合起来;2.springboot可以独立开发,而springcloud依赖于springboot。

  58. springcloud五大组件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值