• 软件:1711
  • 资讯:51514|
  • 收录网站:99622|

IT精英团

Java-高级:收集框架2 从单片架构到微服务架构的迁移

Java-高级:收集框架2 从单片架构到微服务架构的迁移

浏览次数:
评论次数:
编辑: 景同
信息来源: 51CTO博客
更新日期: 2021-08-11 03:40:04
摘要

Java-进阶:集合框架2,从单体式架构迁移到微服务架构,Java-进阶:集合框架2,从单体式架构迁移到微服务架构

  • 资讯详情

添加(新人物('吴王',30));

//使用迭代器遍历列表

IteratorPerson迭代器=a . iterator();

//用迭代器对象遍历

while(listitr . hasnext()){ 0

system . out . println(listitr . next());

}

//列表的唯一遍历模式

for(int I=0;I . a . size();I){ 0

system . out . println(a . get(I));

}

* * *

# # * *二。列表迭代器接口* *

## **1.概述* *

* * *列表* *?不仅有自己独特的迭代方法,还有自己独特的* *迭代器**:`列表迭代器`

# # * * 2 \.列表迭代器接口的抽象方法* *

* `add(E,E)`:将指定的元素插入列表

* `boolean hasPrevious()`:反向遍历列表,如果列表迭代器有多个元素,则返回?**真* *,也就是* *是否具有以前的元素* *

* `previous()`?返回列表* *的* *上一个元素* *

## **3\.列表反向遍历:* *

IteratorPerson迭代器=a . iterator();

ListIteratorPerson listItr=a . listiterator(a . size());

//先按顺序遍历,让光标走到最后

while(listitr . hasnext()){ 0

system . out . println(listitr . next());

}

//反向遍历

//在访问光标指向的元素之前,将上一个向前移动一个位置

while(Listitr . HasPrevious()){ 0

system . out . println(listitr . previous());

}

* * *

# # * *三。迭代器并发修改异常* *

## **1\.迭代器并发修改异常* *

` Java . util . concurrentmodificationexception `

*就是在遍历的过程中,使用了* *集合方法* *?改了吗?* *收集时间* *

## **2\.出现场景:* *

首先,在遍历集合的过程中修改集合;其次,修改collection行为不是通过迭代器对象完成的,而是直接修改Collection对象

//场景实现

listString list=new ArrayListString();

list . add(' abc1 ');

list . add(' abc2 ');

list . add(' abc3 ');

list . add(' abc4 ');

//使用迭代器获取集合,获取时判断集合中是否有' abc3 '对象。

//如果是,添加一个元素‘ABC3’

IteratorString it=list . iterator();

while(it . HasNeXt()){ 0

string s=it . next();

//判断得到的元素s是否有‘abc3’

if(s . equals(' abc3 '){ 0

list . add(' ABC3 ');

}

system . out . println(s);

}

## **3\.原因:* *

在迭代* *的过程中,使用集合的方法来操作元素。结果迭代器不知道集合中的变化,容易导致数据不确定。迭代器对象是根据当前数据集生成的(换句话说,迭代器依赖于数据集,它们必须对应)

公共类列表演示

公共静态void main(String[]args){ 0

listener a=new linked list();

//迭代器

ListIteratorPerson listItr=a . listiterator();

a .添加(新人员(' zs ',10));

添加(新人物(' lisi ',20));

添加(新人物('吴王',30));

while(listItr.hasNext()){ Person p = listItr.next(); //这种添加元素的方式,会产生异常 //a.add(new Person("zhaoliu", 40)); //解决: 利用ListIterator对象添加元素 listItr.add(new Person("zhaoliu", 40)); } } System.out.println(s); //针对List还有另外一种,在遍历集合同时修改集合的解决方案 for (int i = 0; i < a.size(); i++){ if("lisi".equals(a.get(i).name)){ a.add(new Person("zhaoliu", 40)); } } System.out.println(a); //如果使用 ListIterator 的add方法向集合中添加元素,这个元素的位置处在当前遍历到的元素之后的位置 //如果使用 集合对象的 add(e) 方法添加元素,插入的元素处在表尾位置

}


* * *
## **四、ArrayList 、LinkedList 集合**
## **1\. ArrayList 集合**
*   底层采用的是?**数组**?结构,**线程不安全**,查询快,增删慢

//创建了一个长度为0的Object类型数组
ArrayList al=new ArrayList();
al.add("abc");
//本质:
//底层会创建一个长度为10的Object数组 Object[] obj=new Object[10]
//obj[0]="abc"
//如果添加的元素的超过10个,底层会开辟一个1.5*10的长度的新数组
//把原数组中的元素拷贝到新数组,再把最后一个元素添加到新数组中


## **2\. LinkedList 集合**
*   底层采用?**链表**?结构,**线程不安全**,查询慢,增删快
*   每次查询都要从链头或链尾找起,查询相对数组较慢,但是删除直接修改元素记录的地址值即可,不要大量移动元素
*   LinkedList 的索引决定是从链头开始找还是从链尾开始找,如果该元素小于元素长度一半,从链头开始找起,如果大于元素长度的一半,则从链尾找起
*   LinkedList 提供了大量的操作开始和结尾的方法
*   子类的特有功能:不能多态调用:
> addFirst(E) 添加到链表的开头?
> addLast(E) 添加到链表的结尾?
> E getFirst() 获取链表的开头?
> E getLast() 获取链表的结尾?
> E removeFirst() 移除并返回链表的开头?
> E removeLast() 移除并返回链表的结尾
## **3\. Vector 集合(基本不用)**
*   Vector 集合数据存储的结构是?**数组**?结构,为JDK中最早提供的集合,它是线程同步的,线程安全的
*   Vector 集合已被 ArrayList 替代
* * *
## **五、Set 接口**
## **1\. 特点**
*   它是个?**不包含重复元素**?的集合,**没索引**
*   是一个**不包含重复元素**的?**collection**
*   无序集合,没有索引,不存储重复元素
*   Set无序:**存储和取出的顺序不同**,
*   Set集合取出元素的方式可以采用:**迭代器**、**增强for**
*   代码的编写上,和?**ArrayList**?完全一致
*   Set集合常用实现类:
*   `HashSet 集合`
*   `LinkedHashSet 集合`
* * *
## **六、 HashSet (哈希表)**
## **1\. 特点:**
*   底层数据结构为?**哈希表**
*   存储、取出都比较快
*   线程不安全,运行速度快
*   **不保证 set 的迭代顺序**
*   **不保证该顺序的恒久不变**
## **2\. 哈希表的数据结构:**
*   **加载因子**:表中填入的记录数/哈希表的长度?
    例如:加载因子是 0.75 代表:数组中的16个位置, 其中存入 16 * 0.75 = 12个元素。
*   如果在存入第十三个( > 12 )元素,导致存储链子过长,会降低哈希表的性能,那么此时会扩充哈希表(**再哈希**),底层会开辟一个长度为原长度2倍的数组,把老元素拷贝到新数组中,再把新元素添加数组中。?
    当?`存入元素数量 > 哈希表长度 * 加载因子`,就要**扩容**,因此加载因子决定扩容时机
## **3\. 字符串对象的哈希值:**
*   对象的哈希值,是普通的十进制整数,**Object**?类的方法?`public int hashCode()`?来计算,计算结果?**int**?整数
*   String 类重写了`hashCode()`?方法,见源码
## **4\. 哈希表的存储过程**
> **存取原理**:?
> 每存入一个新的元素都要走以下**三步**:
> 1\. 首先调用本类的?`hashCode()`?方法算出哈希值
> 2\. 在容器中找是否与新元素哈希值相同的老元素,如果没有直接存入,如果有转到第三步
> 3\. 新元素会与该索引位置下的老元素利用?`equals 方法`一一对比,一旦?`新元素.equals(老元素)`,返回?**true**,停止对比,说明重复,不再存入,如果与该索引位置下的老元素都通过?**equals**?方法对比返回?**false**,说明没有重复,存入
![哈希表](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202108/f33nd05pfdc.jpg)
哈希表的存储过程
## **5\. 哈希表的存储自定义对象**
*   自定义对象需要重写 hashCode() 和 equals(),来保证存入对象的不重复

//重写hachCode() 方法
public int hashCode(){
return name.hashCode() +age +id; //算法为name的hashCode值+age+id
}
//重写equals
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(obj instanceof Student){
Student s = (Student)obj;
return name.equals(s.name) && age == s.age && id == s.id;
}
return false;
}


## **6\. LinkedHashSet 集合**
*   `LinkedHashSet`?基于链表的哈希表实现,继承自?`HashSet`
*   LinkedHashSet 自身特性:
# **结尾**
![查漏补缺:Java岗 千+道面试题Java基础+全家桶+容器+反射+异常等](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202108/0caxxsdpaua.jpg)
这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。
**[资料领取方式:戳这里免费获取](https://gitee.com/vip204888/java-p7)**
**由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!**
对Java序列化的高级理解
« 上一篇
Csharp讀寫文件內容搜索自動彈出自动完成模式
下一篇 »
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
你会是第一个来这里评论的人吗?