集合的框架
集合
一、集合框架
1、collection(接口):
int size():返回容量
boolean isEmpty():判空
boolean contains(Object o):判断是否有元素
···········
1.1、List(接口)
其存储的元素是有序且可重复的
--- ArrayList:动态数组,所有元素都是连续的
集合的长度是动态变化的,下标也是动态变化的。
--- LinkedList: 双向链表
1.2 set(接口)集合 (按哈希地址值比较的)
其存储的元素是无序且不可重复的
1.2.1HashSet(哈希表)(无序,唯一)
非线程安全。
Hashset在添加对象的时候,判断其是否为同一元素对象的过程分为两步 第一步: 调用对象的hashCode()方法,如果返回值不同,即为不同对象,直接添加成功 第二步: 调用对象的equals()方法,相等则丢弃。----第一步对应着数据结构中哈希表除留余数法找元素下标?从hashmap来看,用的二进制计算的,比除留余数效率更高。
-
// 其是按哈希值的顺序排列的
-
HashSet<Integer> hs = new HashSet<Integer>();
-
这个循环方式有两种:foreach,迭代器
-
-
区别:foreach 在循环的时候不能对数组进行删除
-
-
迭代器在循环的时候可以对数组进行删除
-
-
//迭代器来循环set集合
-
Iterator<Worker> itor = hs.iterator();
-
while(itor.hasNext()) {
-
Worker dw = itor.next();
-
if(dw.getName().equals("郭靖")) {
-
itor.remove();
-
}
-
}
1.2.2 TreeSet(二叉排序树)
-
方式一:自然排序
-
在类上实现接口:
-
public class Worker implements Comparable<Worker> {}
-
重写compareTo方法--规则
-
public int compareTo(Worker o) {
-
//这个里面写排序的规则
-
if(this.getAge()-o.getAge()!=0) {
-
return this.getAge()-o.getAge();
-
}else if(this.salary-o.getSalary()!=0) {
-
return this.getSalary()-o.getSalary();
-
}
-
return this.hashCode()-o.hashCode();
-
}
-
方式二:匿名内部类 --自定义排序
-
TreeSet<Worker> ts = new TreeSet<Worker>(new Comparator<Worker>() {
-
//这里也是写比较的规则
-
@Override
-
public int compare(Worker o1, Worker o2) {
-
//这个里面写排序的规则
-
if(o1.getAge()-o2.getAge()!=0) {
-
return o1.getAge()-o2.getAge();
-
}else if(o1.getSalary()-o2.getSalary()!=0) {
-
return o1.getSalary()-o2.getSalary();
-
}
-
return o1.hashCode()-o2.hashCode();
-
}
-
});
如果两个排序都存在,优先采用自定义排序。
1.2.3 LinkedHashSet(extends HashSet)(哈希表里是双向链表)(有序)
1.3map
1.3.1 HashMap(哈希表?数组 链表 或 红黑树)
其没有重复的键,且值允许一条Entry的键为null,允许多条Entry 的值为null。
其主干是一个Entry数组,Entry是HashMap的基本组成单元,每个Entry包含一对key-value键值对---保存了两个对象之间映射关系的集合
对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。
-
HashMap<String, String> map = new HashMap<String, String>();
-
-
//循环键
-
Set<String> ks = map.keySet();
-
for(String k : ks)
-
System.out.println(k map.get(k));
-
//循环值
-
Collection<String> vs = map.values();
-
for(String v : vs)
-
System.out.println(v);
-
//循环键值对---大数据量时使用
-
Set<Entry<String, String>> es = map.entrySet();
-
for(Entry<String, String> kv : es){
-
System.out.println();
-
}
-
//迭代器循环
-
Iterator iterator = map.entrySet().iterator();
-
while(iterator.hasnext()){
-
Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();
-
//iterator.next();
-
System.out.println(entry.getKey() entry.getValue());
-
}
1.3.2 TreeMap
按照键排序(其和TreeSet一样,需要实现comparable和comparator)
1.3.2 LinkedHashmap(数组 双向链表)
1.4迭代器
iterator: 从前往后迭代
hasNext(); //判断后面有没有下一个元素
next():返回下一个元素。
ListsIterator: 从后往前迭代
previous(); //返回元素下标
previousIndex();
hasPrevious();
ListIterator可以:
(1)双向移动(向前/向后遍历).
(2)产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引.
(3)可以使用set()方法替换它访问过的最后一个元素.
(4)可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素.
-
public interface Iterable<T> {
-
Iterator<T> iterator();
-
}
-
Collection集合及其儿子都有迭代器
-
public interface Collection<E> extends Iterable<E>{}
-
-
//反向迭代器 --- set
-
public interface List<E> extends Collection<E> {
-
ListIterator<E> listIterator(int index);//反向迭代器的方法
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfgghb
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01