2023年6月20日发(作者:)

【收藏】Java中⾼级⾯试题总结本篇⽂章给准备跳槽的Java程序员们整理了⼀些Java中⾼级⾯试题,希望可以帮到⼩伙伴们。1、说出⼏条 Java 中⽅法重载的最佳实践?下⾯有⼏条可以遵循的⽅法重载的最佳实践来避免造成⾃动装箱的混乱。a、不要重载这样的⽅法:⼀个⽅法接收 int 参数,⽽另个⽅法接收 Integer 参数。b、不要重载参数数量⼀致,⽽只是参数顺序不同的⽅法。c、如果重载的⽅法参数个数多于 5 个,采⽤可变参数。2、在多线程环境下,SimpleDateFormat 是线程安全的吗?不是,⾮常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使⽤,除⾮是在对外线程安全的环境中使⽤,如 将 SimpleDateFormat 限制在ThreadLocal 中。如果你不这么做,在解析或者格式化⽇期的时候,可能会获取到⼀个不正确的结果。因此,从⽇期、时间处理的所有实践来说,我强⼒推荐 joda-time 库。3、Java 中如何格式化⼀个⽇期?如格式化为 ddMMyyyy的形式?Java 中,可以使⽤ SimpleDateFormat 类或者 joda-time 库来格式⽇期。DateFormat 类允许你使⽤多种流⾏的格式来格式化⽇期。4、Java 中,怎么在格式化的⽇期中显⽰时区?使⽤SimpleDateFormat来实现格式化⽇期,但是DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使⽤,除⾮是在对外线程安全的环境中使⽤,如将SimpleDateFormat 限制在ThreadLocal 中。如果你不这么做,在解析或者格式化⽇期的时候,可能会获取到⼀个不正确的结果。因此,从⽇期、时间处理的所有实践来说,强⼒推荐 joda-time 库。5、如何测试静态⽅法?可以使⽤ PowerMock 库来测试静态⽅法。6、怎么利⽤ JUnit 来测试⼀个⽅法的异常?6、怎么利⽤ JUnit 来测试⼀个⽅法的异常?对需要测试异常的代码使⽤try,catch语句块。⽐如:public void testException(){try{ong(null);}catch(NumberFormatException expected){}}然后使⽤Junit的fail函数,对于没有抛出预期异常的代码。7、@Before 和 @BeforeClass 有什么区别?@Before :在每个测试⽅法之前都执⾏⼀次, ⽅法需要声明为public@beforeclass :只在类中执⾏⼀次, 必须声明为public static8、怎么检查⼀个字符串只包含数字?⽤Java⾃带的函数、⽤正则表达式、⽤ascii码判断。9、Java 中如何利⽤泛型写⼀个 LRU 缓存?这是⼀种混合的数据结构,我们需要在哈希表的基础上建⽴⼀个链表。但是Java已经为我们提供了这种形式的数据结构-LinkedHashMap!它甚⾄提供可覆盖回收策略的⽅法。唯⼀需要我们注意的事情是,改链表的顺序是插⼊的顺序,⽽不是访问的顺序。但是,有⼀个构造函数提供了⼀个选项,可以使⽤访问的顺序。10、Java 中,怎么获取⼀个⽂件中单词出现的最⾼频率?a、将⽂件内容存⼊String字符串中b、利⽤split()函数分割字符串,因为直接替换英⽂空格或者,逗号分隔就可以了,中⽂类似,分隔得到⼀个数组。c、遍历数组中所有的单词,统计结果Map 中,key=单词,value=单词出现的次数。d、使⽤TreeSet类型,对Map中的结果进⾏排序,依据统计次数。e、输出最⾼的排序的前N名结果11、如何检查出两个给定的字符串是反序的?思路主要是,从开始字符,和另外⼀个从末尾字符⽐较,先判断长度是否相同,不同直接不可能反⽂。然后再⽐较。12、Java 中如何将字符串转换为整数?String s="123";int i;第⼀种⽅法:i=nt(s);第⼆种⽅法:i=f(s).intValue();13、在没有使⽤临时变量的情况如何交换两个整数变量的值?加减法、乘除法、异或法。14、接⼝是什么?为什么要使⽤接⼝⽽不是直接使⽤具体类?接⼝⽤于定义 API。它定义了类必须得遵循的规则。同时,它提供了⼀种抽象,因为客户端只使⽤接⼝,这样可以有多重实现,如 List 接⼝,你可以使⽤可随机访问的 ArrayList,也可以使⽤⽅便插⼊和删除的 LinkedList。接⼝中不允许写代码,以此来保证抽象。15、Java 中,抽象类与接⼝之间有什么不同?Java 中,抽象类和接⼝有很多不同之处,但是最重要的⼀个是 Java 中限制⼀个类只能继承⼀个类,但是可以实现多个接⼝。抽象类可以很好的定义⼀个家族类的默认⾏为,⽽接⼝能更好的定义类型,有助于后⾯实现多态机制。16、除了单例模式,你在⽣产环境中还⽤过什么设计模式?这需要根据你的经验来回答。⼀般情况下,你可以说依赖注⼊,⼯⼚模式,装饰模式或者观察者模式,随意选择你使⽤过的⼀种即可。不过你要准备回答接下的基于你选择的模式的问题。17、你能解释⼀下⾥⽒替换原则吗?⾸先,这是编译器的要求,如果不这么做,⽆法通过编译。其次,⾯向对象的编程,其中继承有个⼤原则,任何⼦类的对象都可以当成⽗类的对象使⽤。18、什么情况下会违反迪⽶特法则?为什么会有这个问题?迪⽶特法则建议“只和朋友说话,不要陌⽣⼈说话”,以此来减少类之间的耦合。19、适配器模式是什么?什么时候使⽤?适配器模式提供对接⼝的转换。如果你的客户端使⽤某些接⼝,但是你有另外⼀些接⼝,你就可以写⼀个适配去来连接这些接⼝。20、什么是“依赖注⼊”和“控制反转”?为什么有⼈使⽤?控制反转(IOC)是 Spring 框架的核⼼思想,⽤我⾃⼰的话说,就是你要做⼀件事,别⾃⼰可劲 new 了,你就说你要⼲啥,然后外包出去就好~依赖注⼊(DI) 在我浅薄的想法中,就是通过接⼝的引⽤和构造⽅法的表达,将⼀些事情整好了反过来传给需要⽤到的地⽅。21、抽象类是什么?它与接⼝有什么区别?你为什么要使⽤过抽象类?a、接⼝⽤于规范,抽象类⽤于共性。b、声明⽅法的存在⽽不去实现它的类被叫做抽象类。c、接⼝(interface)是抽象类的变体。在接⼝中,所有⽅法都是抽象的。22、构造器注⼊和 setter 依赖注⼊,那种⽅式更好?每种⽅式都有它的缺点和优点。构造器注⼊保证所有的注⼊都被初始化,但是setter 注⼊提供更好的灵活性来设置可选依赖。如果使⽤ XML 来描述依赖,Setter 注⼊的可读写会更强。经验法则是强制依赖使⽤构造器注⼊,可选依赖使⽤setter 注⼊。23、依赖注⼊和⼯程模式之间有什么不同?虽然两种模式都是将对象的创建从应⽤的逻辑中分离,但是依赖注⼊⽐⼯程模式更清晰。通过依赖注⼊,你的类就是POJO,它只知道依赖⽽不关⼼它们怎么获取。使⽤⼯⼚模式,你的类需要通过⼯⼚来获取依赖。因此,使⽤ DI 会⽐使⽤⼯⼚模式更容易测试。24、适配器模式和装饰器模式有什么区别?24、适配器模式和装饰器模式有什么区别?虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被⽤于桥接两个接⼝,⽽装饰模式的⽬的是在不修改类的情况下给类增加新的功能。25、适配器模式和代理模式之前有什么不同?这个问题与前⾯的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执⾏动作的类,因此结构是⼀致的,但是适配器模式⽤于接⼝之间的转换,⽽代理模式则是增加⼀个额外的中间层,以便⽀持分配、控制或智能访问。26、什么是模板⽅法模式?模板⽅法提供算法的框架,你可以⾃⼰去配置或定义步骤。例如,你可以将排序算法看做是⼀个模板。它定义了排序的步骤,但是具体的⽐较,可以使⽤Comparable 或者其语⾔中类似东西,具体策略由你去配置。列出算法概要的⽅法就是众所周知的模板⽅法。

2023年6月20日发(作者:)

【收藏】Java中⾼级⾯试题总结本篇⽂章给准备跳槽的Java程序员们整理了⼀些Java中⾼级⾯试题,希望可以帮到⼩伙伴们。1、说出⼏条 Java 中⽅法重载的最佳实践?下⾯有⼏条可以遵循的⽅法重载的最佳实践来避免造成⾃动装箱的混乱。a、不要重载这样的⽅法:⼀个⽅法接收 int 参数,⽽另个⽅法接收 Integer 参数。b、不要重载参数数量⼀致,⽽只是参数顺序不同的⽅法。c、如果重载的⽅法参数个数多于 5 个,采⽤可变参数。2、在多线程环境下,SimpleDateFormat 是线程安全的吗?不是,⾮常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使⽤,除⾮是在对外线程安全的环境中使⽤,如 将 SimpleDateFormat 限制在ThreadLocal 中。如果你不这么做,在解析或者格式化⽇期的时候,可能会获取到⼀个不正确的结果。因此,从⽇期、时间处理的所有实践来说,我强⼒推荐 joda-time 库。3、Java 中如何格式化⼀个⽇期?如格式化为 ddMMyyyy的形式?Java 中,可以使⽤ SimpleDateFormat 类或者 joda-time 库来格式⽇期。DateFormat 类允许你使⽤多种流⾏的格式来格式化⽇期。4、Java 中,怎么在格式化的⽇期中显⽰时区?使⽤SimpleDateFormat来实现格式化⽇期,但是DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使⽤,除⾮是在对外线程安全的环境中使⽤,如将SimpleDateFormat 限制在ThreadLocal 中。如果你不这么做,在解析或者格式化⽇期的时候,可能会获取到⼀个不正确的结果。因此,从⽇期、时间处理的所有实践来说,强⼒推荐 joda-time 库。5、如何测试静态⽅法?可以使⽤ PowerMock 库来测试静态⽅法。6、怎么利⽤ JUnit 来测试⼀个⽅法的异常?6、怎么利⽤ JUnit 来测试⼀个⽅法的异常?对需要测试异常的代码使⽤try,catch语句块。⽐如:public void testException(){try{ong(null);}catch(NumberFormatException expected){}}然后使⽤Junit的fail函数,对于没有抛出预期异常的代码。7、@Before 和 @BeforeClass 有什么区别?@Before :在每个测试⽅法之前都执⾏⼀次, ⽅法需要声明为public@beforeclass :只在类中执⾏⼀次, 必须声明为public static8、怎么检查⼀个字符串只包含数字?⽤Java⾃带的函数、⽤正则表达式、⽤ascii码判断。9、Java 中如何利⽤泛型写⼀个 LRU 缓存?这是⼀种混合的数据结构,我们需要在哈希表的基础上建⽴⼀个链表。但是Java已经为我们提供了这种形式的数据结构-LinkedHashMap!它甚⾄提供可覆盖回收策略的⽅法。唯⼀需要我们注意的事情是,改链表的顺序是插⼊的顺序,⽽不是访问的顺序。但是,有⼀个构造函数提供了⼀个选项,可以使⽤访问的顺序。10、Java 中,怎么获取⼀个⽂件中单词出现的最⾼频率?a、将⽂件内容存⼊String字符串中b、利⽤split()函数分割字符串,因为直接替换英⽂空格或者,逗号分隔就可以了,中⽂类似,分隔得到⼀个数组。c、遍历数组中所有的单词,统计结果Map 中,key=单词,value=单词出现的次数。d、使⽤TreeSet类型,对Map中的结果进⾏排序,依据统计次数。e、输出最⾼的排序的前N名结果11、如何检查出两个给定的字符串是反序的?思路主要是,从开始字符,和另外⼀个从末尾字符⽐较,先判断长度是否相同,不同直接不可能反⽂。然后再⽐较。12、Java 中如何将字符串转换为整数?String s="123";int i;第⼀种⽅法:i=nt(s);第⼆种⽅法:i=f(s).intValue();13、在没有使⽤临时变量的情况如何交换两个整数变量的值?加减法、乘除法、异或法。14、接⼝是什么?为什么要使⽤接⼝⽽不是直接使⽤具体类?接⼝⽤于定义 API。它定义了类必须得遵循的规则。同时,它提供了⼀种抽象,因为客户端只使⽤接⼝,这样可以有多重实现,如 List 接⼝,你可以使⽤可随机访问的 ArrayList,也可以使⽤⽅便插⼊和删除的 LinkedList。接⼝中不允许写代码,以此来保证抽象。15、Java 中,抽象类与接⼝之间有什么不同?Java 中,抽象类和接⼝有很多不同之处,但是最重要的⼀个是 Java 中限制⼀个类只能继承⼀个类,但是可以实现多个接⼝。抽象类可以很好的定义⼀个家族类的默认⾏为,⽽接⼝能更好的定义类型,有助于后⾯实现多态机制。16、除了单例模式,你在⽣产环境中还⽤过什么设计模式?这需要根据你的经验来回答。⼀般情况下,你可以说依赖注⼊,⼯⼚模式,装饰模式或者观察者模式,随意选择你使⽤过的⼀种即可。不过你要准备回答接下的基于你选择的模式的问题。17、你能解释⼀下⾥⽒替换原则吗?⾸先,这是编译器的要求,如果不这么做,⽆法通过编译。其次,⾯向对象的编程,其中继承有个⼤原则,任何⼦类的对象都可以当成⽗类的对象使⽤。18、什么情况下会违反迪⽶特法则?为什么会有这个问题?迪⽶特法则建议“只和朋友说话,不要陌⽣⼈说话”,以此来减少类之间的耦合。19、适配器模式是什么?什么时候使⽤?适配器模式提供对接⼝的转换。如果你的客户端使⽤某些接⼝,但是你有另外⼀些接⼝,你就可以写⼀个适配去来连接这些接⼝。20、什么是“依赖注⼊”和“控制反转”?为什么有⼈使⽤?控制反转(IOC)是 Spring 框架的核⼼思想,⽤我⾃⼰的话说,就是你要做⼀件事,别⾃⼰可劲 new 了,你就说你要⼲啥,然后外包出去就好~依赖注⼊(DI) 在我浅薄的想法中,就是通过接⼝的引⽤和构造⽅法的表达,将⼀些事情整好了反过来传给需要⽤到的地⽅。21、抽象类是什么?它与接⼝有什么区别?你为什么要使⽤过抽象类?a、接⼝⽤于规范,抽象类⽤于共性。b、声明⽅法的存在⽽不去实现它的类被叫做抽象类。c、接⼝(interface)是抽象类的变体。在接⼝中,所有⽅法都是抽象的。22、构造器注⼊和 setter 依赖注⼊,那种⽅式更好?每种⽅式都有它的缺点和优点。构造器注⼊保证所有的注⼊都被初始化,但是setter 注⼊提供更好的灵活性来设置可选依赖。如果使⽤ XML 来描述依赖,Setter 注⼊的可读写会更强。经验法则是强制依赖使⽤构造器注⼊,可选依赖使⽤setter 注⼊。23、依赖注⼊和⼯程模式之间有什么不同?虽然两种模式都是将对象的创建从应⽤的逻辑中分离,但是依赖注⼊⽐⼯程模式更清晰。通过依赖注⼊,你的类就是POJO,它只知道依赖⽽不关⼼它们怎么获取。使⽤⼯⼚模式,你的类需要通过⼯⼚来获取依赖。因此,使⽤ DI 会⽐使⽤⼯⼚模式更容易测试。24、适配器模式和装饰器模式有什么区别?24、适配器模式和装饰器模式有什么区别?虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被⽤于桥接两个接⼝,⽽装饰模式的⽬的是在不修改类的情况下给类增加新的功能。25、适配器模式和代理模式之前有什么不同?这个问题与前⾯的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执⾏动作的类,因此结构是⼀致的,但是适配器模式⽤于接⼝之间的转换,⽽代理模式则是增加⼀个额外的中间层,以便⽀持分配、控制或智能访问。26、什么是模板⽅法模式?模板⽅法提供算法的框架,你可以⾃⼰去配置或定义步骤。例如,你可以将排序算法看做是⼀个模板。它定义了排序的步骤,但是具体的⽐较,可以使⽤Comparable 或者其语⾔中类似东西,具体策略由你去配置。列出算法概要的⽅法就是众所周知的模板⽅法。