Java容器基础
2020/3/24 17:01:33
本文主要是介绍Java容器基础,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
容器介绍
容器架构图
Map
Map自成一体,其根接口不是Collection。Map接口有两个子类HashMap和TreeMap。HashMap有一个子类LinkedHashMap.
各个容器之间继承(接口实现)关系简要介绍
- Collection是Set、List、Queue的根接口。
- Map自成一体,Collection不是其父接口。
- Iterator是迭代器,用于遍历集合。
- Comparator是比较器,用于TreeSet中的排序。
Collection常用方法
增
boolean add(E e)
:向集合中添加元素boolean addAll(Collection c)
:向集合中添加参数中的所有元素
删
boolean remove(E e)
:若集合中存在e元素,则删除该元素,并返回true;否则,返回falseboolean removeAll(Collection c)
:从集合中删除参数中的所有元素void clear()
:清除集合中的所有元素
判断集合中是否存在元素
boolean contains(E e)
:判断集合中是否存在元素eboolean containsAll(Collection c)
:判断集合中是否存在参数中的所有元素
判空
boolean isEmpty()
:判断集合是否为空,如果为空返回true;否则返回false
迭代器
Iterator iterator()
:获取迭代器iterator.hasNext()
:判断容器中的元素是否遍历完毕iterator.next()
:返回迭代的下一个元素;iterator.next()的输出形式:key=valueiterator.remove()
:删除并返回上一次next()方法返回的元素iterator.forEachRemaining(lambda表达式)
:这是Java8为Iterator新增的方法,可使用lambda表达式来遍历容器中的元素
交集
boolean retainAll(Collection c)
:将集合与c中元素的交集存入集合中,原集合中的元素会被删除
长度
int size()
:获取集合的元素个数
转化成数组
Object[] toArray()
:把集合转化成数组
Collections
介绍
Collections是集合中的一个工具类,它里面提供了一系列静态方法用来操作集合元素。
Collections工具类中适用于List的静态方法
- 复制
Collections.copy(List dest,List src)
:把src集合中的元素复制到dest中- 注意点
- 如果src的长度大于dest的长度,那么会抛异常,复制失败。
- 如果src的长度等于dest的长度,那么dest中的元素会被全部替换掉。
- 如果src的长度(m)小于dest的长度(n),那么dest中的前m个元素会被src的元素替换掉,后面剩余的元素不变。
- 替换
Collections.fill(List<T> list,T obj )
:用obj将list中的所有元素都替换掉
- 随即调整
Collections.shuffle(List<T> list)
:使用默认源对集合随机调整Collections.shuffle(List<T> list,Random random)
- 排序
Collections.sort(List<T> list)
:根据元素的自然顺序来对集合中的元素进行递增排序
- 查找
Collections.min(List<T> list)
:返回经过排序后的第一个元素Collections.max(List<T> list)
:返回经过排序后的最后一个元素Collections.binarySearch(List<T> list,T obj)
:返回obj元素在list中的索引(索引从0开始计数)
Set
Set特点
元素无序且不可重复。(无序是指元素存入的顺序和元素取出的顺序是不一致的)
HashSet
HashSet存储元素时,是根据该元素的哈希码进一步计算出该元素在容器中的存储位置。而Set中不允许有重复元素,故当obj1.equals(obj2)为true时,就必须保证obj1和obj2的hashCode()是一样的。所以,自定义的类要存储到HashSet中,就必须重写equals()和hashCode()方法(两个方法必须都重写)。
TreeSet
简要介绍
TreeSet是SortedTree的实现类,所以TreeSet里面的元素需要排序。排序有两种方式:自然排序和指定排序。
自然排序
实现方式
在自定义的类对象中去继承Comparable接口,并实现compareTo(Object obj)方法;该方法比较自定义类与obj的大小,若前者大,则返回一个大于0的整数;若两者相等,则返回0;若后者大,则返回一个小于0的整数。
public class Person implements Comparable { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override //重写equals方法 public boolean equals(Object obj) { Person p = null; if (obj instanceof Person) { p = (Person) obj; //强转 if ((p.name.equals(this.name)) && (p.age == this.age)) return true; } return false; } @Override // 重写hashCode方法 public int hashCode() { int code; code = (this.name == null ? 0 : this.name.hashCode()); code = 10 * this.age + code; return code; } // 实现compareTo方法 @Override public int compareTo(Object obj) { // 自定义比较规则:按名字拼音排序,如果名字相同,则按年龄排序(递增排序) Person p = null; if (obj instanceof Person) p = (Person) obj; //强转 Comparator comparator = Collator.getInstance(Locale.CHINA); //获取按照名字拼音排序的比较器 int result = comparator.compare(this.name, p.name); if (result == 0) //名字相同 return this.age > p.age ? 1 : (this.age == p.age ? 0 : -1); else return result; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } 复制代码
注意:比较大小的规则是自己定义的。
指定排序
实现方式
- 01.自定义一个比较器(即自定义一个类),让该类继承Comparator接口,并实现compare(T t1,T t2)方法。该方法比较自定义类与obj的大小,若前者大,则返回一个大于0的整数;若两者相等,则返回0;若后者大,则返回一个小于0的整数。
- 02.在创建TreeSet时,要么所使用的泛型的类已经实现了Comparable接口,要么把该比较器的实例传入TreeSet的构造方法中。否则,会报错。因为创建TreeSet时,必须有排序方式(自然排序/指定排序二选一)。
public class MyComparator implements Comparator<Student> { @Override //实现compare方法 public int compare(Student p1, Student p2) { Comparator comparator = Collator.getInstance(Locale.CHINA); int result = comparator.compare(p1.getName(), p2.getName()); //按照中文拼音顺序来比较名字 if (result == 0) { //名字相同 return p1.getAge() > p2.getAge() ? 1 : (p1.getAge() == p2.getAge() ? 0 : -1); } return result; } } 复制代码
测试代码:
@Test public void test3() { // 使用TreeSet时,要么所使用的泛型的类已经实现了Comparable接口; // 要么自定义一个比较器来继承Comparator接口,然后把自定义的构造器传入new TreeSet(new MyComparator())中 TreeSet<Student> treeSet = new TreeSet<>(new MyComparator()); treeSet.add(new Student("包宝宝", 20)); treeSet.add(new Student("包宝宝", 19)); treeSet.add(new Student("卞哈哈", 25)); treeSet.add(new Student("陈浩hao", 30)); treeSet.add(new Student("陈浩hao", 12)); treeSet.add(new Student("陈敏敏", 23)); treeSet.add(new Student("储玉玉", 34)); treeSet.add(new Student("许啊啊", 23)); Iterator iterator = treeSet.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } 复制代码
**注意:**在继承Comparator接口时,一定要加泛型,这样在实现compare方法时,才好比较两者大小。
List
List特点
List中的元素可以重复。
ArrayList
特点
- 顺序表,是长度可变的数组
- 允许对元素随机访问,访问速度快
- 插入、删除元素的速度慢
- ArrayList是线程不安全的,若要获取线程安全的ArrayList,则:List list=Collections.synchronizedList(new ArrayList())
ArrayList常用方法
**注意:**此处介绍的方法是ArrayList特有的,Collection接口中的“普遍”方法就不介绍了。
T get(int index)
:返回list中下标为index的元素int indexOf(T e)
:返回元素e在list中的索引List<T> subList(int startIndex,int endIndex)
:获取list中下标为startIndex至endIndex-1的元素(endIndex不包括),并返回一个子集合
LinkedList
特点
- LinkedList在内部采用双向循环链表实现
- 插入、删除元素速度快
- 访问元素速度慢
LinkedList常用方法
- 获取表头元素
T getFirst()
T element()
T peek()
- **注意:**element()和peek()方法的区别在于:当链表为空时,element方法会抛异常(NoSuchElementException),而peek会返回null。
- 删除表头元素
T removeFirst()
boolean remove()
T poll()
- **注意:**remove()和poll()方法的区别:当链表为空时,remove抛异常,而poll返回null。
- 在表尾添加元素
void addLast()
void add()
boolean offer()
LinkedList特有方法
- 增
addFirst()
addLast()
- 删
removeFirst()
removeLast()
- 获取
getFirst()
getLast()
Queue
略。
Map
HashMap
简介
与HashSet一样,HashMap也是基于哈希表来存储元素的,故,在使用HashMap 存储自定义对象时,必须重写equals()和hashCode()方法。
特点
- 无序
- 线程不安全
HashMap常用方法
V get(key)
:取值V put(key,value)
:赋值boolean isEmpty()
:判空boolean containsKey(K key)
:判断map是否含有某个keyboolean containsValue(V value)
:判断map是否含有某个valueV remove(K key)
:删除key下的valueSet<K> keySet()
:获取所有的keyCollection<V> values()
:获取所有的valueSet<Map.Entry<K,V>> entrySet()
:获取所有的key和value;Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue()方法。int size()
:获取map中的元素个数map.forEach(lambda表达式)
:Java8为Map新增的遍历方法
HashMap的遍历方法
- 直接获取所有的value,然后遍历
for(String value:map.values()){ System.out.println(value); //该遍历方法的缺点就是不能获取key } 复制代码
- 获取所有的键,然后根据键来获取值
Set<String> keySet = map.keySet(); //获取所有的key for(String key:keySet){ System.out.println(key+":"+map.get(key)); } 复制代码
- 获取所有的键和值,遍历,然后分别获取键和值
for(Map.Entry<String,String> e:map.entrySet()){ System.out.println(e.getKey()+":"+e.getValue()); } 复制代码
- 使用迭代器来遍历
// 获取迭代器 Iterator it=map.entrySet().iterator(); while(it.hasNext()){ // 同时获取key和value Map.Entry<String,String> entry= (Map.Entry<String, String>) it.next(); //强转 System.out.println(entry.getKey()+":"+entry.getValue()); } 复制代码
- 使用Java8为Map新增的forEach方法来遍历
map.forEach((key,value)-> System.out.println(key+":"+value)); 复制代码
TreeMap
**注意:**如果在创建TreeMap时,没有传入比较器,那么就使用自然排序。
TreeMap常用方法
Comparator comparator()
:返回当前map使用的比较器,若没有使用比较器(即使用的是自然排序),则返回nullK firstKey()
:返回map中的第一个键K lastKey()
:返回最后一个键SortedMap subMap(K fromKey,K endKey)
:返回由map中大于等于fromKey(包括),小于endKey(不包括)的元素组成的mapSortedMap tailMap(K fromKey)
:返回由map中大于等于fromKey(包括)的元素组成的map
这篇关于Java容器基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南