- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
Java高频面试题及答案(贴近实战版)
1.说说Java的面向对象三大特性,举个实际开发中的例子
答案:三大特性是封装、继承、多态。
封装:把属性和方法藏在类内部,只暴露必要接口。比如写用户类User时,把password设为private,只提供setPassword(加密码校验逻辑)和getPassword(返回加密后的值),避免外部直接修改密码。
继承:子类复用父类代码,同时扩展功能。比如BaseController里写好getCurrentUser()(获取当前登录用户),所有业务控制器(如OrderController)继承它,不用重复写这个方法,还能加自己的createOrder()方法。
多态:父类引用指向子类对象,调用方法时自动匹配子类实现。比如用ListStringlist=newArrayList(),后续想换成LinkedList,直接改new后面的类就行,遍历、添加的代码不用动——因为ArrayList和LinkedList都实现了List的方法。
2.HashMap和ConcurrentHashMap有啥区别?实际项目里什么时候用后者?
答案:核心区别在线程安全和性能:
HashMap:线程不安全,JDK1.8里是“数组+链表/红黑树”结构,多线程操作可能出现死循环(JDK1.7)或数据覆盖。适合单线程场景,比如方法内的临时集合。
ConcurrentHashMap:线程安全,JDK1.8用“CAS+synchronized”替代了1.7的分段锁,效率更高。比如项目里的全局缓存(如存商品分类数据),多个线程同时读和写,用它不会出并发问题;要是用HashMap,多线程put可能导致get不到数据。
3.线程安全问题怎么解决?synchronized和volatile有啥不一样?
答案:解决线程安全常用3种方式:加锁(synchronized/Lock)、用线程安全类(AtomicInteger、ConcurrentHashMap)、避免共享变量(比如局部变量)。
synchronized和volatile的关键区别:
synchronized是“重量级锁”(JDK1.6后有锁优化),能保证原子性、可见性、有序性。比如两个线程抢着改intcount,用synchronized(this){count++},能确保每次只一个线程改,结果不会错。
volatile只能保证可见性和有序性,不能保证原子性。比如用volatileintcount,线程A改了count,线程B能马上看到,但如果两个线程同时count++,还是会错(因为count++是“读-改-写”三步,volatile管不了中间步骤)。实际开发里,volatile常用在“状态标记”,比如volatilebooleanisStop,一个线程改isStop为true,另一个线程能立刻看到并停止循环。
4.说下ArrayList和LinkedList的区别,项目里怎么选?
答案:底层结构和操作效率不一样:
ArrayList:底层是动态数组,查数据快(通过索引直接拿),增删慢(尤其是中间位置,要移动后面的元素)。比如项目里存“用户列表”,经常要按索引查用户,很少删中间数据,就用ArrayList。
LinkedList:底层是双向链表,查数据慢(要从头或尾遍历),增删快(改前后节点的指针就行)。比如存“消息队列”,经常要在头部删消息、尾部加消息,用LinkedList更高效;但要是用for循环遍历LinkedList,会特别慢(每次get(i)都要从头走),得用迭代器。
5.Spring里的依赖注入(DI)是啥意思?实际开发怎么用?
答案:DI就是“不用自己new对象,让Spring帮你把依赖的对象传进来”,解决类之间的耦合。比如Service里要用到Dao,不用自己写UserDaodao=newUserDaoImpl(),让Spring注入。
实际用法有3种:
@Autowired:按类型注入。比如在UserService里写@AutowiredprivateUserDaouserDao,Spring会找实现了UserDao的类(比如UserDaoImpl),自动赋值。
@Resource:按名称注入。如果有两个UserDao实现类(UserDaoMysql、UserDaoOracle),用@Resource(name=userDaoMysql)指定要哪个。
构造器注入:在Service的构造方法里加参数,比如public
文档评论(0)