集合的概述:
集合是一系列对象的聚集。集合在程序设计中是一种重要的数据结构。在一定意义上,java中数组就是一种集合。集合实际上是用一个对象代表一组对象,在集合中的每个对象称为一个元素,集合中的元素一般都是相同的类型。
Coleection API中的接口和类主要位于java…util包中,其中最基本的接口就是Colection和Map接口。Collection接口是元素的集合,Map接口是键-值对的集合。
List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
Set下有HashSet,LinkedHashSet,TreeSet
List下有ArrayList,Vector,LinkedList
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
Collection接口下还有个Queue接口,有PriorityQueue类
Set集合
set集合的几个特点:
1.set集合不允许出现重复数据
2.允许包含值为null的元素,最多只能有一个
treeset的几个特点:
1.不能有重复的元素
2.具有排序功能(底层数据结构式红黑树)
3.treeset中的元素必须实现comparable接口并重写compareTo()方法,
HashSet的几个特点
1.不能有重复值
2.无须的
3.是基于HashMap实现的
Map
Map 集合主要有:HashMap,TreeMap
HashMap特点:
1.HashMap是无序的散列映射表
2.底层实现是hash表
TreeMap特点
1.适用于按自然顺序或自定义顺序遍历键
2.底层是二叉树
3.提供compareTo,可以自定义排序方法
List有序集合:
List 有序可重复 常用的有ArrayList、LinkedList、Vector
ArrayList:
1.数据机构是数组,查询快(遍历块),增删慢(增删移动数据量大)
2.线程不安全,效率高
LinkedList:
1.数据结构是链表,查询慢(需要移动指针较慢),增删快(链表优势)
2.线程不安全,效率高
Vector
1.数据结构也是数组,类似于ArrayList
2.不同点是他的线程安全
对于Collection集合我们应该如何选择用哪一个?
用哪一个,可以考虑各个子集合的优缺点来选择
如果是元素不能重复就选择用Set
要排序的话选用TreeSet或LinkedHashSet
不用排序就用HashSet
元素可以重复的选用List
要求线程安全的选用Vector否则选用ArrayList、LinkedList
查询多的话使用ArrayList
增删多的话使用LinkedList
总结
Set和List都是Collection的子接口,都有各自的方法
Collection重要的一些方法:
个接口各自的详细方法可查看API进行了解
有了对集合的大体认识可进行如下实现:
package unit7;
import java.util.*;
//一、产生10个1-100的随机数,并放到一个数组中,把数组中大于等于10的数字放到一个list集合中,并打印到控制台。
public class practicelist1 {
public static void main(String[] args)
{
ArrayList<Integer> list = new ArrayList<>();
int arr[] = new int[10];
Random ra = new Random();
for(int i=0;i<arr.length;i++)
{
arr[i]=ra.nextInt(100)+1;
if(arr[i]>=10)
list.add(arr[i]);
}
System.out.println(list);
}
}
package unit7;
import java.util.ArrayList;
//定义一个方法listTest(ArrayList<Integer> al, Integer s),要求返回s在al里面第一次出现的索引,如果s没出现过返回-1
public class practicelist1{
public static void main(String[] args)
{
ArrayList<Integer> list2 = new ArrayList<>();
list2.add(4);
list2.add(6) ;
list2.add(7);
list2.add(6);
list2.add(5);
list2.add(9);
System.out.println("索引值 为:" +listTest(list2 ,6));
}
public static int listTest(ArrayList<Integer> al,Integer s)
{
for(int i=0;i<al.size();i++)
{
if(al.get(i)==s)
return i;
}
return -1;
}
}
package unit7;
import java.util.*;
//已知数组存放一批QQ号码,QQ号码最长为11位,最短为5位String[] strs = {"12345","67891","12347809933","98765432102","67891","12347809933"}。
//将该数组里面的所有qq号都存放在LinkedList中,将list中重复元素删除,将list中所有元素分别用迭代器和增强for循环打印出来。
public class practicelist1{
public static void main(String[] args)
{
String[] strs = {
"12345","67891","12347809933","98765432102","67891","12347809933"};
LinkedHashSet<String> set = method01(strs);
System.out.println(set);
System.out.println(method02(strs));
//迭代器打印输出
Iterator<String> it = method01(strs).iterator() ;
while(it.hasNext())
{
String value = it.next();
System.out.println(value+ " ");
}
System.out.println();
//for增强打印
for(String s: method02(strs))
{
System.out.println(s+" ");
}
}
private static LinkedHashSet<String> method01(String[] strs)
{
LinkedHashSet<String> set = new LinkedHashSet<>();
for(int i=0;i<strs.length;i++)
{
set.add(strs[i]);
}
return set;
}
private static LinkedList<String> method02(String[] strs)
{
LinkedList<String> list = new LinkedList<>();
for(int i=0;i<strs.length;i++)
{
list.add(strs[i]);
}
//如果此元素在,除了本次位置的其他元素内找到则删除该元素;
for(int i=0;i<list.size();i++)
{
for(int j=i+1;j<list.