浅谈java集合
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等
集合的特点:
集合用来存储不同类型的对象(基本数据类型除外),存储长度可变。
Java集合中实际存放的只是对象的引用,每个集合元素都是一个引用变量,实际内容都放在堆内存或者方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上的数据随时就会被收回的。
ArrayList常用方法的运用
import java.util.ArrayList;
import java.util.Arrays;
/*
ArrayList常用方法的运用
*/
public class Demo1 {
public static void main(String[] args){
//ArrayList: 使用的是数组结构,对于增加删除慢,查找快
ArrayList<Integer> data = new ArrayList<>();
data.add(100); //将指定的元素添加到此列表的末尾
data.add(200);
data.add(300);
data.add(2,121); //将指定的元素添加到指定的未知
System.out.println(data.get(0)); //得到指定位置的元素
// data.clear(); //删除所有元素
System.out.println(data.get(2));
data.indexOf(0); //返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。
System.out.println(data.get(0));
data.remove(0); //删除此列表中指定位置的元素
System.out.println(data.get(0));
data.set(1,110); //set用于指定元素替换指定位置的元素,前面是位置,后面是元素
System.out.println(data.get(1));
int i = data.size(); //返回此列表中的元素素
System.out.println(i);
System.out.println(Arrays.toString(data.toArray())); //以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组。
}
}
Vector常用方法的运用
import java.util.Arrays;
import java.util.Vector;
/*
Vector常用方法的运用
*/
public class Demo2 {
public static void main(String[] args) {
//Vector : 使用的是数组结构,对于增加删除慢,查找快
Vector<Integer> data = new Vector<>();
data.add(111);
data.add(112); //将指定元素插入此Vector中的指定位置
System.out.println(data.get(0)); //返回此Vector中指定位置的元素。
data.add(1,123); //将指定元素插入此Vector中的指定位置
data.add(2,110);
System.out.println(data.get(1));
data.remove(1); //删除此Vector中的指定位置的指定元素
System.out.println(data.get(1));
System.out.println(data.hashCode()); //返回此Vector的哈希码值。
data.set(1,125); //用指定的元素替换此Vector中指定位置的元素
System.out.println(data.get(1));
System.out.println(data.size()); //返回此向量中的组件数。
System.out.println(Arrays.toString(data.toArray())); //以正确的顺序返回包含此Vector中所有元素的数组
System.out.println(data.toString()); //返回此Vector的字符串表示形式,包含每个元素的String表示形式。
}
}
LinkedList常用方法的运用
public class Demo3 {
public static void main(String[] args) {
//LinkedList : 使用的是双向链表结构,对于增加删除快,查找慢
LinkedList<Integer> data = new LinkedList<>();
//将指定元素插入此列表中的指定位置。
data.add(0,100);
//将指定的元素追加到此列表的末尾
data.add(110);
//在此列表的开头插入指定的元素。
data.addFirst(222);
//将指定的元素追加到此列表的末尾
data.addLast(333);
//返回此列表中指定位置的元素
System.out.println(data.get(0));
//返回此列表中的第一个元素
System.out.println(data.getFirst());
//返回此列表中的最后一个元素
System.out.println(data.getLast());
//删除此列表中指定位置的元素
data.remove(1);
//检索并删除此列表的头部(第一个元素)
data.remove();
//压栈
data.push(100);
data.push(200);
//弹栈
Integer i = data.pop();
System.out.println(i);
//用指定元素替换指定位置的元素
data.set(1,369);
System.out.println(data.get(1));
//返回此列表中的元素数。
System.out.println(data.size());
//以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组。
System.out.println(Arrays.toString(data.toArray()));
}
}
Iterator接口的运用
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/*
Iterator接口的运用
*/
public class Demo4 {
public static void main(String[] args) {
//Iterator
//ListIterator
ArrayList<Integer> data = new ArrayList<>();
data.add(1);
data.add(2);
data.add(3);
data.add(4);
data.add(5);
/*Iterator<Integer> iterator = data.iterator();
while (iterator.hasNext()){
Integer i = iterator.next();
System.out.println(i);
}
//返回列表中的下一个元素并前进光标位置
iterator.next();
//从列表中删除 next()或 previous() (可选操作)返回的最后一个元素。
iterator.remove();
System.out.println(data.size());*/
ListIterator<Integer> iterator = data.listIterator();
iterator.add(100);
iterator.next();
//返回列表中的下一个元素并前进光标位置。
iterator.next();
System.out.println(iterator.next());
}
}
Collection (集合的最大接口)继承关系
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行,一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”,如List和Set。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection;有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
(1)List:有序,可以存放重复的内容
(2)Set:无序,不能存放重复的内容,所以的重复内容靠hashCode()和equals()两个方法区分
(3)Queue:队列接口
(4)SortedSet:可以对集合中的数据进行排序
Map接口
Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
注意:由于Map中作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。
实现Map接口的子类:
——Hashtable:Hashtable继承Dictionary<K,V>类,实现了Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。是同步的。
——HashMap:HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。
但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。
——LinkedHashMap:是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现。Key和Value都允许空;Key重复会覆盖、Value允许重复;非线程安全;有序。
——TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。
Set接口
该Set接口放置额外的约定,超过从继承Collection接口,所有构造函数的合同,而位于该合同add , equals和hashCode方法。 为方便起见,此处还包括其他继承方法的声明。 (这些声明附带的规范是针对Set接口定制的,但它们不包含任何其他规定。)
注意:如果将可变对象用作set元素,则必须非常小心。 如果在对象是集合中的元素时以影响equals比较的方式更改对象的值,则不指定集合的行为。 这种禁令的一个特例是,不允许将一个集合作为一个元素包含在内。
方法运用:
| 变量和类型 | 方法 | 描述 |
|---|---|---|
| boolean | add(E e) | 如果指定的元素尚不存在,则将其添加到此集合(可选操作)。 |
| boolean | addAll(Collection<? extends E> c) | 如果指定集合中的所有元素尚未存在(可选操作),则将其添加到此集合中。 |
| void | clear() | 从该集合中删除所有元素(可选操作)。 |
| boolean | contains(Object o) | 如果此set包含指定的元素,则返回 true 。 |
| boolean | containsAll(Collection<?> c) | 如果此集合包含指定集合的所有元素,则返回 true 。 |
| static Set | copyOf(Collection<? extends E> coll) | 返回包含给定Collection的元素的 unmodifiable Set 。 |
| boolean | equals(Object o) | 将指定对象与此set进行相等性比较。 |
| int | hashCode() | 返回此set的哈希码值。 |
| boolean | isEmpty() | 如果此集合不包含任何元素,则返回 true 。 |
| Iterator | iterator() | 返回此set中元素的迭代器。 |
| static Set | of() | 返回包含零元素的不可修改集。 |
| static Set | of(E e1, E e2, E e3, E e4, E e5, E e6) | 返回包含六个元素的不可修改集。 |
| static Set | of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) | 返回包含七个元素的不可修改集。 |
| boolean | remove(Object o) | 如果存在,则从该集合中移除指定的元素(可选操作)。 |
| boolean | removeAll(Collection<?> c) | 从此集合中删除指定集合中包含的所有元素(可选操作)。 |
| boolean | retainAll(Collection<?> c) | 仅保留此集合中包含在指定集合中的元素(可选操作)。 |
| int | size() | 返回此集合中的元素数(基数)。 |
| Object[] | toArray() | 返回包含此set中所有元素的数组。 |
。
本文详细介绍了Java集合框架中的ArrayList、Vector和LinkedList的常用方法,并展示了如何使用Iterator接口。此外,还概述了Collection接口的继承关系,以及Map和Set接口的基本概念和用途。示例代码演示了各种集合类的方法应用,包括添加、删除、查找和遍历元素等操作。
1552

被折叠的 条评论
为什么被折叠?



