1、设计模式(写>=3种常用的设计模式)
设计模式是在软件工程中解决常见问题的经验性解决方案。以下是一些常用的设计模式:
-
单例模式(Singleton):
意图:确保一个类只有一个实例,并提供一个全局访问点。
应用场:当需要控制一个类的实例数量,例如管理共享资源时。 -
工厂模式(Factory Method):
意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
应用场景:当创建对象的过程需要根据不同的情况而变化时,例如在不同操作系统上创建不同类型的图形界面。 -
观察者模式(Observer):
意图:当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
应用场景:当对象间存在一对多的关系,当一个对象改变状态,其他对象需要作出响应时,例如实现消息通知机制。 -
策略模式(Strategy):
意图:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
应用场景:当有多种算法可以实现同一功能,客户端需要能够动态选择使用哪种算法时,例如实现不同排序算法的切换。 -
装饰器模式(Decorator):
意图:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。
应用场景:当需要在不修改对象的结构的情况下,动态地给对象增加一些功能时,例如给文本添加不同类型的装饰(加粗、斜体等)。
这些设计模式是软件设计中经常使用的基础模式,它们有助于解决特定问题,提高代码的可维护性和扩展性。
2、A有个子类terA,类B继承了A,B的子类terB继承了A的子类terA,写出各类代码含有泛型
3、Java反射(写一个类,利用反射获取全部public属性和方法)
4、三个线程,t1 、t2 、t3,要求线程1,2同时执行,3在它们执行完成后才能执行
方式2:CountDownLatch
5、不使用同步锁(synchronized )的情况下防止阻塞(同步锁可以实现资源共享有没有更好的实现办法。同步锁的替代?)?
(1)使用 java.util.concurrent 包中的并发集合: 这些集合类(如 ConcurrentHashMap, ConcurrentLinkedQueue 等)使用了并发控制机制,允许多个线程在没有锁的情况下访问和修改数据。
(2)使用原子变量: java.util.concurrent.atomic 包提供了一组原子类(如 AtomicInteger, AtomicLong, AtomicReference 等),它们使用底层的硬件指令来保证操作的原子性,从而避免了锁的使用。
AtomicInteger counter = new AtomicInteger(0);
// 线程1 counter.incrementAndGet();
// 线程2 int value = counter.get();
(3)使用乐观锁
总的来说,乐观锁通过允许多个线程在没有锁的情况下尝试执行操作,并在冲突发生时通过重试机制来解决问题,从而减少了线程阻塞的可能性。然而,如果系统中写操作非常频繁,乐观锁可能会导致频繁的重试和性能下降
(4)使用Java 8引入的StampedLock是一个更灵活的锁,支持乐观读、悲观读写和读写锁的转换,可以在性能和灵活性之间做出权衡。、
(5)ReadWriteLock:允许多个读取者同时访问共享资源,但只允许一个写入者,适用于读多写少的场景。
6、Java创建阻塞队列,要有添加和删除的方法
7、线程池添加和删除(关闭)
8、Java中任意一种集合的插入与查询代码
9、Linux常用命令
9.1 查找和删除命令:查找一个文件并删除它
9.2 使用java命令合理分配年轻代和老年代,防止OOM
java -Xms1g -Xmx1g -XX:NewSize=256m -XX:MaxNewSize=256m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:+UseParallelGC -jar your-application.jar
9.3 deamon(守护进程)方式启动应用,启动java程序配置区分
10、开发中令人深刻的技术问题
要提前准备这个,根据自己情况来,可以适当吹吹