开发工具与关键技术: eclipse 和 Java
作者:杜永鹏
撰写时间:2021 年 6 月 26日
Java 集合
Java集合类是一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如:栈、队列等。除此之外,Java集合还可用于保存具有映射关系的关联数组。Java集合大致可分为List、Set、Queue和Map四种体系,其中List代表有序、重复的集合;Set代表无序、不可重复的集合;而Map则代表具有映射关系的集合,Java5又增加了Queue体系集合,代表一种队列集合实现。
1、java集合概述
为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类,所有的集合类都位于 java.util包下。集合类和数组不一样,数组元素既可以基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。Java的集合类主要由两个接口派生而出: Collection和Map, Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
2、List集合
List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。Lst集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引,
例如第一次添加的元素索引为0,第二次添加的元素索引为1…
2.1、Vector是线程安全的,ArrayList不是线程安全的。
2.2、ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍。
PS:Vector是历史遗留问题,现在已经基本不用
2.3、List常用方法:
返回值:boolean 方法(形参):add(E e) 说明:向列表的尾部添加指定的元素。
返回值:void 方法(形参):add(int index, Eelement) 说明:在列表的指定位置插入指定元素。
返回值:boolean 方法(形参):addAll(Collection c) 说明:添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序。
返回值:boolean 方法(形参):addAll(int index,Collection c) 说明:将指定 collection 中的所有元素都插入到列表中的指定位置。
返回值:void 方法(形参):clear() 说明:从列表中移除所有元素。
返回值:boolean 方法(形参):contains(Object o) 说明:如果列表包含指定的元素,则返回 true。
返回值:boolean 方法(形参):containsAll(Collectionc) 说明:如果列表包含指定 collection 的所有元素,则返回 true。
返回值:boolean 方法(形参):equals(Object o) 说明:比较指定的对象与列表是否相等。
返回值:E 方法(形参):get(int index) 说明:返回列表中指定位置的元素。
返回值:int 方法(形参):indexOf(Object o) 说明:返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
返回值:boolean 方法(形参):isEmpty() 说明:如果列表不包含元素,则返回 true。
返回值:Iterator 方法(形参):iterator() 说明:返回按适当顺序在列表的元素上进行迭代的迭代器。
返回值:int 方法(形参):lastIndexOf(Object o) 说明:返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
返回值:E 方法(形参):remove(int index) 说明:移除列表中指定位置的元素。
返回值:boolean 方法(形参):remove(Object o) 说明:从此列表中移除第一次出现的指定元素(如果存在)。
返回值:boolean 方法(形参):removeAll(Collectionc) 说明:从列表中移除指定 collection 中包含的其所有元素。
返回值:boolean 方法(形参):retainAll(Collection c) 说明:仅在列表中保留指定 collection 中所包含的元素。
返回值:E 方法(形参):set(int index, Eelement) 说明:用指定元素替换列表中指定位置的元素。
返回值:int 方法(形参):size() 说明:返回列表中的元素数。
返回值:List 方法(形参):subList(int fromIndex, int toIndex)说明:返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
返回值:Object[] 方法(形参):toArray() 说明:返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。
返回值:T[] 方法(形参):toArray(T[] a) 说明:返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
public static void main(String[] args) {
List listStr =new ArrayList();
List listInt = new LinkedList();
// List listChar=new Vector();//不建议使用
List listChar =
Collections.synchronizedList(new ArrayList());
listChar.add(‘D’);
listChar.add(‘K’);
//add
listStr.add("D");
listStr.add("K");
listStr.add("G");
listStr.add("J");
listStr.add("A");
listStr.add("K");
listStr.add("B");
System.out.println(listStr);
listStr.add(3,"M");
listStr.add(6,"M");
// listStr.add(10,“F”);//指定的index(10)不能大于list(listChar) 元素的个数、
//addAll()
List<String> listStr2=new ArrayList<String>();
listStr2.add("1");
listStr2.add("2");
listStr2.add("4");
listStr.addAll(listStr2);
listStr.addAll(0,listStr2);
//clear()
// System.out.println(listStr);
// listStr.clear();
//contains()
boolean bol1=listStr.contains("Z");
System.out.println("是否包含Z:"+bol1);
boolean bol2=listStr.contains("A");
System.out.println("是否包含A:"+bol2);
//containsAll
boolean bol3=listStr.contains(listStr2);
System.out.println("是否包含listStr2: " +bol3);
boolean bol4=listStr.contains(listChar);
System.out.println(bol4);
//get(index) index<集合的大小
System.out.println("listStr的第3个元素是:"+listStr.get(2));
System.out.println("listStr的第6个元素是:"+listStr.get(5));
//indexOf()
System.out.println("listStr中K第一次出现的索引为: "+ listStr.indexOf("K"));
//lastIndexOf
System.out.println("listStr中K最后一次出现的索引为 : " + listStr.lastIndexOf("K"));
//isEmpty
System.out.println("listStr是否为空: "+listStr.isEmpty());
System.out.println("listInt是否为空: " +listInt.isEmpty());
//remove()
System.out.println(listStr);
listStr.remove(4);
listStr.remove("M");
//removeAll()
// listStr.removeAll(listStr2);
// //retainAll()
// listStr.retainAll(listStr2);
//
//set()
listStr.set(2 , “AAA”);
//size()
System.out.println("lisStr中元素的个数"+listStr.size());
//subList(fromIndex,toIndex) [fromIndex,toIndex]
List<String> listStrChid=
listStr.subList(3 , 7);
System.out.println(listStrChid);
//toArray()
Object[] strs=listStr.toArray();
for (Object string : strs) {
System.out.print(string+" ");
}
System.out.println();
//
for (int i = 0; i < listStr.size(); i++) {
System.out.print(listStr.get(i)+" ");
}
System.out.println();
for (String str : listStr) {
System.out.print(str+" ");
}
System.out.println();
//迭代器
Iterator<String> iterator=listStr.iterator();
while(iterator.hasNext()) {
String str=iterator.next();
System.out.print(str+" ");
}
System.out.println();
System.out.println("------for iterator2-------");
for (Iterator<String> iterator2=listStr.iterator();
iterator2.hasNext();) {
String str=iterator2.next();
System.out.print(str+" ");
}
System.out.println();
System.out.println(listStr);
}
3、set集合:
Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。
Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回 false,且新元素不会被加入。
3.1、set常用方法
返回值:boolean 方法(形参):add(E e) 说明:如果 set 中尚未存在指定的元素,则添加此元素。
返回值:boolean 方法(形参):addAll(Collection c) 说明:如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中。
返回值:void 方法(形参):clear() 说明:移除此 set 中的所有元素。
返回值:boolean 方法(形参):contains(Object o) 说明:如果 set 包含指定的元素,则返回 true。
返回值:boolean 方法(形参):containsAll(Collectionc)说明:如果此 set 包含指定 collection 的所有元素,则返回true。
返回值:boolean 方法(形参):equals(Object o) 说明:比较指定对象与此 set 的相等性。
返回值:boolean 方法(形参):isEmpty() 说明:如果 set 不包含元素,则返回 true。
返回值:Iterator 方法(形参):iterator() 说明:返回在此 set 中的元素上进行迭代的迭代器。
返回值:boolean 方法(形参):remove(Object o) 说明:如果 set 中存在指定的元素,则将其移除。
返回值:boolean 方法(形参):removeAll(Collectionc)说明:移除 set 中那些包含在指定 collection 中的元素。
返回值:boolean 方法(形参):retainAll(Collection c) 说明:仅保留 set 中那些包含在指定 collection 中的元素。
返回值:int 方法(形参):size() 说明:返回 set 中的元素数(其容量)。
返回值:Object[] 方法(形参):toArray() 说明:返回一个包含 set 中所有元素的数组。
返回值:T[] 方法(形参):toArray(T[] a)说明:返回一个包含此 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。
一、HashSet类
HashSet类是Set接口的典型实现类,大多数时候使用Set集合时就是使用这个实现类。 HashSet类 按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet类具有以下特点:
3.1、不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
3.2、HashSet不是同步的(不是线程安全的),如果多个线程同时访问一个 HashSet,假设有两个或者两个以上线程同时修改了 HashSet集合时,则必须通过代码来保证其同步。
3.3、集合元素值可以是null,但只能放入一个null。当向 HashSet集合中存入一个元素时, HashSet会调用该对象hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过equals方法比较返回true,但它们的hashCode()方法返回值不相等, HashSet将会把它们存储在不同的位置,依然可以添加成功。
HashSet判断元素是否相等的依据:对象的equals()比较返回false;且hashCode值不相等,判断两个元素不相等;
二、LinkedHashSet类
HashSet类还有一个子类 LinkedHashSet, LinkedHashSet集合也是根据元素的 hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历 LinkedhashSet集合里的元素时, LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
LinkedHashSet需要维护元素的插入顺序,因此性能略低于 HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。