做公司网站思路,杭州上城区抖音seo有多好,旅游门户网站建设项目招标,unity3d转行网站开发一、和equals
在Java中#xff0c;使用字符串常量a可以直接创建一个字符串对象#xff0c;因为Java会将所有的字符串常量都保存在一个字符串常量池中#xff0c;如果使用相同的字符串常量创建字符串对象#xff0c;则会指向同一个对象#xff0c;这样就可以避…一、和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方法有区别。