java常见问题总结

1、抽象类和接口的区别

接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了自然界“如果你是……则必须能……”的理念。
“面向接口编程”中的接口是一种思想层面的用于实现多态性、提高软件灵活性和可维护性的架构部件,而具体语言中的“接口”是将这种思想中的部件具体实施到代码里的手段。
如果单从具体代码来看,对这两个概念很容易模糊,甚至觉得接口就是多余的,因为单从具体功能来看,除多重继承外(C#,Java中),抽象类似乎完全能取代接口。但是,难道接口的存在是为了实现多重继承?当然不是。抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。所以,如果你在为某个地方该使用接口还是抽象类而犹豫不决时,那么可以想想你的动机是什么。

使用接口暴露公共的方法,使用抽象类来提供公共的实现

2、单例模式和全局静态变量(类)的区别

单例的特点:
保证某类只存在唯一实例。
该类本身完成自身的初始化。
获取该唯一实例的方式非常明确,可以通过该类本身定义的静态方法getInstance()获取该类的唯一实例引用。

单例可以被延迟初始化,静态类一般在第一次加载是初始化
静态变量定义某类的实例引用特点:
该类的实例引用的静态变量可定义在任何文档类当中。
获取该类的实例引用的静态变量,可以通过定义该静态变量的类名通过点语法进行访问该引用。
任何位置可以对该静态变量进行重新赋值。
单例模式也就是静态变量方式创建一个类的实例引用所带来的缺陷的改善

3、为什么要使用工厂设计模式

在这里,可以举出一些复杂的例子。

假设有代码包A和代码包B,

代码包B是代码包A的调用者,A向B暴露接口InterfaceA。

在A的内部结构中,实现了InterfaceA的有ClassA1,ClassA2,ClassA3,……ClassA100。

但是B并不关心这些,因为对于B来说,A的功能只有一个,就是InterfaceA。

这个时候,B想要使用一个InterfaceA的实现,想要new一个出来,

但又不想与代码包A中的复杂的构造逻辑耦合,怎么办?

只能向代码包A中传递参数,交给代码包A自己选择到底是那个ClassA1还是A100被new出来。

而这个对构造过程进行选择的逻辑,就是工厂。

当然了,我这里举的例子是InterfaceA,你也可以用AbstractClassA之类的。

工厂在这里面起的作用,就是隐藏了创建过程的复杂度,以配合InterfaceA对那一百个子类的复杂度进行隐藏,这样B只要知道上转型之后的InterfaceA即可,简单清晰。


用了工厂模式,也就是强制使用interface方法,

另外可以应对这种情况,你哪天心情好把类名改了。或者把构造函数参数改了(增加或减少参数)。而代码中又有N处new了这个类。如果你又没用工厂。一个一个找来改吧。

 

4、java Map及Map.Entry详解

Map是Java中的接口,Map.Entry是Map的一个内部接口。

         Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。

         Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。

 

封装:

封装是为了屏蔽实现,就是我们不需要这个功能是怎样实现的,只要我们知道它的功能,能够干什么,我们直接拿来用就可以了,private修饰成员变量,可以这样理解,就是你自己有一个年龄,而你的年龄不想让任何人都知道,如果想要知道你的名字,那么就要通过一个方法,而这个方法你可以想成是你是否认识这个人,而这个认识你的方法你不需要管它是怎去实现的。

synchronized修饰静态方法和非静态方法的区别?

 静态: class对象的锁  非静态:本对象的锁
简单说下HashMap产生线程安全问题,如何处理
多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合
一个汉字几个字节,一个char类型的变量,可以储存一个汉字吗?
2个字节,可以
简单说下,什么是面向对象,谈谈你的理解?
  简单聊下,Java线程池的构造方法,里面参数的含义?
ThreadPoolExecutor是线程池的真正实现,参数有:corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(闲置超时时间)等
ThreadLocal解决了什么问题?
多线程资源共享问题
如何防止线程死锁?
1:按照特定顺序加锁2:代码双重判断检测死锁3:给锁对象赋值唯一对象值判断
简单说下:如何对jvm进行优化?
1:可以对jvm参数进行优化2:线程监控优化3:内存泄漏优化.....等
java8,有哪些新特性?
1:Lambda 表达式2:方法引用3:新工具4:Stream API5:Date Time API6:Optional 类7:Nashorn, JavaScript 引擎
inner join和left join有什么区别?
Left Join(左联接),以左表为中心,返回左表中符合条件的所有记录以及右表中联结字段相等的记录——当右表中无相应联接记录时,返回空值,Inner Join(等值连接), 返回两个表中联结字段相等的行 
mysql数据库常见引擎:InnoDB和Myisam的区别?MySQL默认用的是MyISAM,MyISAM不支持事务InnoDB支持InnoDB支持数据行锁定MyISAM支持锁定整个表InnoDB不支持全文索引MyISAM支持全文索引
如何给一个表增加字段? alter table tablename add username varchar(20)
Redis的几种数据结构?5种,分别是:string、hash、list、set、sorted set
Redis是单线程还是多线程?单线程
spring IOC 有几种注入方式?
3种,接口注入、setter方法注入、构造方法注入,常见的是使用注解
Spring的bean的生命周期?Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean
AOP一般的使用场景?
缓存、权限、错误处理、持久化、资源池、同步、事物、日志跟踪等
和Spring整合过哪些开源技术
MQ、quartz、mybatis、redis、dubbo、mongodb等
Mybatis中$和#的区别?
#是将传入的值当做字符串的形式$是将传入的数据直接显示生成sql语句使用#可以很大程度上防止sql注入
Mybatis的逆向工程是如何生成代码的?
官方网站寻找xml配置文件和java代码,执行即可
说说你所知道的linux常见命令?
cd 进入目录mkdir创建目录ll  /  ls  展示详情pwd 目录路径rz  -be  上传本地文件到服务器ps -ef|grep tomcat/java/8080/.... 查询正在运行的进程kill   888/ kill -9   8888杀死进程tab 自动补全rm   XXX/  没有下级目录  rm -rf  彻底删除./shutdown.sh      ./start.sh 启动tomcat,停止tomcattail-n -200 -f XXXX 查看实时文件more.......vim  xxxxx       !wq   编辑保存并退出sudo    su   root  获取root权限ssh    xxxxxx原文件   IP:/home/目的地top  查看linux服务器的使用性能

猜你喜欢

转载自2379692ss.iteye.com/blog/2376048