当前位置: 首页 > news >正文

Java面试基础

一、==和equals

在Java中,使用字符串常量"a"可以直接创建一个字符串对象,因为Java会将所有的字符串常量都保存在一个字符串常量池中,如果使用相同的字符串常量创建字符串对象,则会指向同一个对象,这样就可以避免不必要的内存浪费。

而对于 “new String(“a”)” 这种方式,实际上会创建两个对象。第一个对象是字符串常量"a",它会保存在字符串常量池中;第二个对象是通过构造函数创建的字符串对象,它保存在堆内存中。因此,总共会创建两个对象,一个在字符串常量池中,一个在堆内存中。

需要注意的是,如果字符串常量池中已经存在相同的字符串常量,则不会重复创建,而是直接返回该字符串常量的引用。因此,如果再使用相同的字符串常量创建字符串对象时,也只会创建一个对象。

1、String这个类的内部结构是,他有一个字符数组属性,
HahsCode得到的是什么,得到的是通过字符数组里面的每一个元素,转成10进制相加,比如1是49,2是50
equals先是比较地址,是否一样,不一样在比较字符数组的长度和每个数组的内容。

2、包装类型的类里面,其实有个对应的基本类型属性,这和包装类型的值是一样的。
包装类型的equals比较的是什么?包装类型的equals是,把包装类型转成基本类型,然后在比较值是否相等。
hasHcode是怎么得到的,hashCode是拿到这个包装类型里面的基本类型所对应的值,然后转成hash码。

3、“==” 如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。
4、equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。注意String和包装类型的equals比较特殊,他是先比较地址,然后在比较内容。

二、for、forEach、iterator区别

for循环
1、这样的遍历一般边遍历边往列表里面加item可以往i以后加,不能往i以前加
2、删除操作也是能删除i以后,不能删除i及i以前的item。
总结:for循环遍历,如果要边遍历边删除或者增加,那么只能把数据添加到当前还没有遍历到的位置。

forEach
1、foreach遍历数组,会转成普通的for遍历数据。比如int[]
2、foreach遍历集合类型,集合是指实现了Iterable接口,比如List,set,queue,注意Map不是,除非把Map转成set

区别:
效率差别:for循环和Iterator效率差不多,forEach要慢些。
条件区别:for循环需要知道数组或者集合的大小才能进行遍历,forEach和Iterator不需要
多态区别:for循环和forEach都需要先知道集合的类型,甚至是集合内元素的类型,即需要访问内部的成员,不能实现多态;Iterator是一个接口类型,他不关心集合或者数组的类型,而且他还能随时修改和删除集合的元素

适用场景区别:
for循环一般用来处理比较复杂的循环,可预知大小的集合或数组。因为涉及索引的操作,**可能会由于开发者的问题导致索引混乱,因此不太安全。**涉及集合元素更新操作的建议用for循环。
forEach 基本和Iterator类似。
Iterator是最强大的,他可以在不需要知道元素和集合的类型的情况下随时修改或者删除集合内部的元素,当你需要对不同的容器实现同样的遍历方式时,迭代器是最好的选择。

删除元素:
foreach方式遍历元素的时候,是先生成iterator,然后使用iterator遍历。在生成iterator的时候,会保存一个expectedModCount参数,这个是生成iterator的时候List中修改元素的次数。如果你在遍历过程中删除元素,List中modCount就会变化,如果这个modCount和exceptedModCount不一致,就会抛出异常。这个是为了安全的考虑。

如果遍历过程中,使用List的remove修改了元素,可能会出现不正常的现象。
如果使用iterator的remove方法则会正常,因为iterator的remove方法会在内部调用List的remove方法,但是会修改excepedModCount的值,因此会正常运行。

注意:List的Remove方法和iterator的remove方法有区别。

相关文章:

  • Sqlserver2012和Sqlserver2019数据库设置最大并行数解决数据库CPU高问题
  • 在 Mac 中卸载 Node.js
  • 火山引擎ByteHouse:如何用OLAP引擎提升数字营销效果?
  • Mybatis—基础操作
  • 框架安全-CVE 漏洞复现DjangoFlaskNode.jsJQuery框架漏洞复现
  • ts 简易封装 axios,统一 API
  • 中国电子云-隐私计算-云原生安全可信计算,物理-硬件-系统-云产品-云平台,数据安全防护
  • Python Django 之模板语法详解
  • SpringMVC Day 11 : 零 xml 配置
  • Docker Tomcat 搭建文件服务器
  • 历年网规上午真题笔记(2016年)
  • 为什么汽车行业普遍选择使用CATIA?
  • lua-web-utils库
  • Java算法:二分查找
  • MPLAB X IDE 仿真打断点提示已中断的断点?
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • CSS居中完全指南——构建CSS居中决策树
  • java8-模拟hadoop
  • JDK 6和JDK 7中的substring()方法
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • vue自定义指令实现v-tap插件
  • Zepto.js源码学习之二
  • 创建一个Struts2项目maven 方式
  • 大整数乘法-表格法
  • 复杂数据处理
  • 给第三方使用接口的 URL 签名实现
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 设计模式 开闭原则
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 思否第一天
  • 源码安装memcached和php memcache扩展
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​Spring Boot 分片上传文件
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #pragma预处理命令
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (三)docker:Dockerfile构建容器运行jar包
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net 高效开发之不可错过的实用工具
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET连接MongoDB数据库实例教程
  • .net连接MySQL的方法
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @我的前任是个极品 微博分析
  • [145] 二叉树的后序遍历 js
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [c++] C++多态(虚函数和虚继承)