Java集合框架的作者Joshua Bloch认为通过ADT的样式声明,是一种非常值得推荐的编程时间技巧,是Java多态性应用。
Java语言中提供了很多有用的集合类型,利用这些类型可以很方便地进行排序,查找等操作,这些Java中内置的集合类统称为Java的集合框架。
LinkedList
也就是我们常说的链表,声明的方法与ArrayList别无二致。他们都实现了List接口。
链表的缺点是在访问环节,由此引出了迭代器的概念,
迭代器在访问或删除每个元素时,保留了当前元素在列表中的位置。所以它的速度十分的快。
LinkedLIst的声明方法
LinkedList<E>name=new LinkedList<>(); //List<E> name=new LinkedList<>();
一些增删改查的操作它都可以实现。
迭代器的声明方法
Iterator<E>name=集合对象.iterator();
迭代器主要有三种方法 hasNext);next();remove();
name.next()才是我们可以认知到的第一个元素,所以迭代器的使用为
Iterator<E> name=集合对象.iterator();
while(name.hasNext())
{
变量=name.next();
System.out.println(变量)
}
注意:next的时候要细心。
数学集合
存储一系列没有重复元素的集合被称为数学集合(set)
声明方式
Set<类型> name =new HashSet<>();
Set<类型> name =new TreeSet<>();
set不支持按图索骥,但是他查找元素的速度非常快,并且它没有重复的元素。有两个实现了set接口的集合类:TreeSet和HashSet。前一个利用的是二叉搜索树,后面的利用的是散列表。
set不支持利用索引来进行遍历元素,因此只好使用专用的迭代器,方法是一样的。
Iterator<String> it=对象.iterator();
while(it.hasNext)
{
String word=it.next();
System.out.println(word);
}
//另外一种迭代方法.
for(String word : 对象)
{
System.out.println(word);
}
set的集合运算
1.并集 A.addAll(B); //包含在A或B所有元素的集合。
2.交集 A.retainAll(B);//同时包含在A和B中的元素。
3.差 A.removeAll(B);//包含在A中,但不包含在B中的元素。
4.超集或子集 A.containsAll(B) ;//如果A包含B的所有元素,那么就返回true;
(注意:这些方法直接在你提供的集合上进行修改,而不是创建返回新的元素。)
彩票实现
import java.util.*;
public class Main {
public static final int NUMBERS=6;
public static void main(String[] args) {
Set<Integer> winnning=Winnticket();
Set<Integer> tickets=getticket();
Set<Integer> matches=new TreeSet<>(tickets);
matches.retainAll(winnning);
System.out.println("你的彩票"+tickets);
System.out.println("中奖号码"+winnning);
if(matches.size()>0)
{
System.out.println("你中了"+matches.size()+"位");
}
else {
System.out.println("你没有获奖");
}
}
public static Set<Integer> Winnticket(){
Set<Integer> win=new TreeSet<>();
Random r=new Random();
while (win.size()<NUMBERS)
{
int number =r.nextInt(10)+1;
win.add(number);
}
return win ;
}
public static Set<Integer> getticket(){
Set<Integer> ticket=new TreeSet<>();
Scanner console=new Scanner(System.in);
while (ticket.size()<NUMBERS)
{
ticket.add(console.nextInt());
}
return ticket;
}
}
Map(映射)
类似于C++的映射,具体的原理依然是一对一的,一个key对应着一个value,但是key们的value值可能相同。不可以用C++的类似于数组的方法去查找。但是Java提供了许多的方法足以满足需要。Map没有对应的迭代器,但是依然可以输出。
声明方式:
Map<类型,类型> name=new HashMap<>();//推荐
Map<类型,类型> name=new TreeMap<>();
clear() | 删除map中所有的键值对 |
containsKey(key) | 顾名思义,返回值为true?false |
containsValue(Value) | 同上,顾名思义 |
get(Key) | 返回与key相关联的value,不存在则返回NUll |
isEmpty() | 顾名思义 |
KeySet() | 返回所有键的集合。(set) |
put(key,value) | 添加,不多说 |
putAll(map) | 将给定的map所有键值放在当前map中 |
remove(key) | 删除一个key和与之相关联的value |
size() | 顾名思义 |
values() | 返回所有值的集合(set) |