JAVA面试题集锦

JAVA面试题集锦

单例模式
1.手写单例模式
2.线程安全的单例模式

什么是单例
单例类在整个程序中只能有一个实例,这个类负责创建自己的对象,并确保只有一个对象被创建。

代码实现要点
a) 私有构造器
b) 持有该类的属性
c) 对外提供获取实例的静态方法

饿汉式:线程安全、反射不安全、反序列化不安全

登记式(静态内部类):线程安全、防止反射攻击、反序列化不安全

枚举式:线程安全、支持序列化、反序列化安全、防止反射攻击

懒汉式:线程不安全、延迟加载、(两种加同步,效率低)

双检锁:线程安全、volatile

ThreadLocal:不加锁,以空间换时间,为每个线程提供变量的独立副本,可以保证各自线程中是单例的,但是不同线程之间不保证

CAS:无锁乐观策略,线程安全

instance=new Singleton7()会执行如下操作:
(1) 分配对象内存空间
(2) 初始化对象
(3) instance指向(1)中分配的空间

在某些编译器上,可能出现指令重排:

(1) 分配对象内存空间
(2) instance指向(1)中分配的空间 (但此时对象没有初始化)
(3) 初始化对象

问题:
1.Exception和Error的区别
2.运行时异常和一般异常的区别
3.写出几种常见的运行时异常
4.int和Integer的区别

标准回答:
1.Exception和Error的区别
Exception和Error都继承自Throwable,在Java中只有Throwable类型的实例才可以被抛出或捕获。
Error指正常情况下不太可能出现的情况,绝大部分的Error或导致程序崩溃,处于非正常的不可恢复的状态,
如OutOfMemoryError、StackOverflowError。
是程序中不应该试图捕获的严重问题。
Exception是程序正常运行中可以预料的意外情况,可以捕获并处理。

2.运行时异常和一般异常的区别
受检查异常:在编译时被强制检查的异常。在方法的声明中声明的异常。
(举例:ClassNotFoundException、IOException)
不受检查异常:不受检查异常通常是在编码中可以避免的逻辑错误,根据需求来判断如何处理,不需要再编译期强制要求。

3.写出几种常见的运行时异常(考察编程经验)
运行时异常RuntimeException是所有不受检查异常的基类。
NullPointerException、ClassCastException、NumberFormatException、IndexOutOfBoundsException。

4.int和Integer的区别

int是整型,是java的8中基本数据类型之一。
Integer是int对应的包装类,它有一个final修饰的int字段,并提供了数学运算、字int和字符串之间转换等常用的方法。
Integer和String一样,也是不可变类型。
查看源码可发现,在java5之后,valueOf方法使用了一个缓存机制,默认缓存是-128到127。
在创建这个范围的整数时,不需要new新对象,而是使用缓存,提高性能
缓存在Boolean,Short,Byte和Character中同样存在。
把基本数据类型转换成包装类型是装箱(boxing),把包装类型转换成基本类型是拆箱(unboxing)。
Java中有自动装箱和拆箱的功能。但在性能敏感的场合,尽量避免无意义的拆箱、装箱行为。
另外,原始数据类型int不能和java泛型结合使用,原始数据类型是线程不安全的。

1.编程实现大数的加法

   例如:
   String a="123456777…"a.size 大于1000位
   String b="345678999…"b.size 大于1000

2.编程实现大数的乘法

 例如:
   String a="123456777…"a.size 大于1000位
   String b="345678999…"b.size 大于1000

3.字符串处理
1)找出字符串中出现最多的字符
2)找出字符串中第一次重复出现的字符
3)在字符串中找出第一个只出现一次的字符
4)统计手机号各个数字个数,按照升序输出

  例如15380327315 其中数字12个,数字21个,数字33个以此类推

5)输入为一个字符串和字节数,输出为按字节截取字符串,但是要保证汉字不能被截半个,
例如“人ABC” 4,应该截取为“人AB”,输入“人ABC们DEF” 6,应该截取为“人ABC”,而不是“人ABC+们的半个”
6)请写出从如下代码中截取efg的代码

  < p id="text">abcdefg</p>

7)设计一种反转字符串的算法,例如源字符串为src=“abddefg”,反转后字符串ded=“gfeddba”
8)写函数将句子按照一定的分割符分割后返回

  String inverseSentence(String in,String sep){
   }
  举例:输入"I love the game" 输出 "game the love I"

9)给定一个字符串,反转字符串中每个字符的顺序,同时保留单词和空格的初始位置

  输入:"Let's take LeetCode contest"
  输出:"s'teL ekat edoCteeL tsetnoc"

10)判断字符串是不是合法的ipv4地址 xxx.xxx.xxx.xxx 0~255

4.数组

1)求和最大的子序列
给定一整数序列A1,A2,…An(可能有负数),求A1An的一个子序列AiAj,使得Ai到Aj的和最大,并输出子序列的内容。
2)数组去重排序
有一个数组中有100个数字,请输出:没有重复并按照升序排序的数字
3)有一个正整数数组,存在重复元素,非降序排列。要求将数组元素打印到屏幕上,请手写程序,并满足一下条件:
a) 按升序输出数组元素
b) 重复元素仅打印一次
c) 时间复杂度O(n)
示例:原始数据[2,3,3,6,6,9,10,10,10,16,18],依次在屏幕上打印 2,3,6,9,10,16,18
4)奇偶调换
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,
所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

5)给出随机的100个数,序号为1-100,按从小到大顺序输出,并输出相应的序号。

以上来源于网络

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值