public interface Collection<E>
extends Iterable<E>
public boolean add(E e);
public boolean addAll(Collection<? extends E>c);
public void clear();
public boolean contains(Object o);
public boolean isEmpty();
public boolean remove(Object o);
public int size();
public Object [] toArray();
public Iterator<E> iterator();
contains() 和 remove() 一定要依靠 equals() 的支持;
public E get(int index);
public E set(int index , E element);
public ListIterator<E> listIterator();
List属于接口,如果想使用接口进行操作,就必须存在子类;使用 ArrayList 子类实现(和Vector子类)
public static void main(String [] args) throws IOException {
List<String> all = new ArrayList<String>();
System.out.println("size:" + all.size() + "Null:" + all.isEmpty());
all.add("Hello");
all.add("Hello");
all.add("World");
System.out.println("size:" + all.size() + "Null:" + all.isEmpty());
// Collection接口定义了size()方法取得集合长度
// List子接口增加了 get() 方法,可取取得所有的数据
for (int x = 0 ; x < all.size() ; x++) {
String str = all.get(x);
System.out.println(str);
}
}
}
通过对ArrayList()子类的使用分析在:List集合中所保存的数据是按照保存的顺序存放的,而且允许重复数据;List子接口有get()方法,可以获得集合中指定序列的内容
public class TestDemo {
public static void main(String [] args) throws IOException {
Collection<String> all = new ArrayList<String>();
System.out.println("size:" + all.size() + "Null:" + all.isEmpty());
all.add("Hello");
all.add("Hello");
all.add("World");
System.out.println("size:" + all.size() + "Null:" + all.isEmpty());
Object[] obj = all.toArray();//变为对象数组读取数据
for (int x = 0 ; x < obj.length ; x ++) {
System.out.println(obj[x].toString());
}
/*for (int x = 0 ; x < all.size() ; x++) {
String str = all.get(x);// 由于Collection类中没有get()方法所以无法使用
System.out.println(str);
}*/
}
}
class Book {
private String title ;
private double price ;
public Book(String title , double price) {
this.price = price;
this.title = title;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true ;
}
if (obj == null) {
return false;
}
if(!(obj instanceof Book)) {
return false ;
}
Book book = (Book) obj;
if (this.title.equals(book.title) && this.price == book.price){
return true;
}
return false;
}
@Override
public String toString() {
return this.title + "\t" + this.price + "\n";
}
}
public class TestDemo {
public static void main(String [] args) {
List<Book> all = new ArrayList<Book>();
all.add(new Book("Java",11.1));
all.add(new Book("python",22.2));
all.add(new Book("C/C++",33.3));
all.add(new Book("PHP",44.4));
// 切记:remove和contains方法需要在类中覆写equls()类
all.remove(new Book("PHP",44.4));
System.out.println(all);
}
}
Set子接口只是简单点额继承了Collection接口,并没有效仿List接口对原接口的功能方法进行扩充。
public class TestDemo {
public static void main(String [] args) {
Set<String> all = new HashSet<String>();
all.add("Hello");
all.add("Hello");//不保存重复的数据
all.add("World");
all.add("HUAWEI");
System.out.println(all + ">>>" + all.size());
}
}
通过观察发现:Set集合下没有重复的数据元素(Set 子接口的特征)即:HashSet 子类特征属于 无序排列
public class TestDemo {
public static void main(String [] args) {
Set<String> all = new TreeSet<String>();
all.add("Hello");
all.add("Hello");//不保存重复的数据
all.add("World");
all.add("Array");
System.out.println(all + ">>>" + all.size());
}
}
分析得出:TreeSet子类没有重复数据,以及所保存的内容默认自动升序排序。
class Book implements Comparable<Book>{
private String title ;
private double price ;
public Book(String title , double price) {
this.title = title;
this.price = price;
}
@Override
public String toString() {
return this.title + "\t" + this.price;
}
/*
* 集合本质上就是动态对象数组,而动态的对象数组排序使用的是比较器
* 所以我们使用comparable比较器
*
* 由于存在重复的元素,compareTo会认为是同一个对象,(Set子接口的特性)
* 所以 set子接口的重复判读就是依靠Comparable
* 为此我们可以使用String的compareTo方法进行同对象的比较
*/
@Override
public int compareTo(Book o) {
if (this.price > o.price) {
return 1;
} else if(this.price < o.price) {
return -1;
} else {
// 我们调用String类的compareTo方法来比较
return this.title.compareTo(o.title);
}
}
}
public class TestDemo {
public static void main(String [] args) {
Set<Book> all = new TreeSet<Book>();
all.add(new Book("Java",11.1));
all.add(new Book("Java",11.1)); //信息完全重复
all.add(new Book("php",11.1)); //信息部分重复
all.add(new Book("Python",33.3)); //信息完全不重复
System.out.println(all);
}
}
通过观察发现,Comparable接口支持了TreeSet类的重复数据的判断,并不支持对HashSet类的重复数据的判读
通过上述的各段代码发现:Comparable接口(比较器)只负责对TreeSet子类的重复元素的判断;(依靠comparTo()方法,如若发现数据相同则判断为是同样的对象元素,则 return 0;)
如果要判断数据元素的重复,只能依靠Object中的方法:
public int hashCode();
public boolean equals(Object obj);
代码:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(price);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + ((title == null) ? 0 : title.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price))
return false;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
return true;
}
Collection、List、Set三个接口,List接口是最有利于输出操作的(ArrayList子类),故此集合的输出:
public interface Iterator<E> {
public boolean hasNext();
public E next<E>();
}
Iterator是一个接口,如若取得接口的实例化需要依靠Collection接口iterator()方法
public Iterator<E> iterator();// java.util.Collection
public class TestDemo {
public static void main(String [] args) {
Set<String> all = new HashSet<String>();//Set子接口
all.add("Mirror");
all.add("wangyuyang");
all.add("wangyuyang");
Iterator<String> iter = all.iterator();// 实例化接口
while (iter.hasNext()) { //判断是否为空
String str = iter.next();// 获取元素数据
System.out.println(str);
}
}
}
Set的特性会自动不保留重复数据,并无序输出
public class TestDemo {
public static void main(String [] args) {
List<String> all = new ArrayList<String>();//List子接口
all.add("Mirror");
all.add("wangyuyang");
all.add("wangyuyang");
Iterator<String> iter = all.iterator();// 实例化接口
while (iter.hasNext()) { //判断是否为空
String str = iter.next();// 获取元素数据
System.out.println(str);
}
}
}
显示添加的所有元素并原样添加的顺序输出
public boolean hasPreviout();
public E previous();
public ListIterator<E> listIterator();
public class TestDemo {
public static void main(String [] args) {
List<String> all = new ArrayList<String>();//Set子接口
all.add("A");
all.add("B");
all.add("C");
System.out.println("正向迭代输出");
ListIterator<String> iter = all.listIterator();
while (iter.hasNext()) { //判断是否为空
String str = iter.next();// 获取元素数据
System.out.println(str);
}
System.out.println("***********");
System.out.println("逆向迭代输出");
while(iter.hasPrevious()) {
System.out.println(iter.previous());
}
}
}
上例程序实现了双向迭代的功能;利用hasNet()方法判断是否为空,next()方法输出元素内容,实现正向迭代输出;利用ListIterator接口中的hasPrevious()和Previous()方法来实现逆向迭代输出。
如果利用ListIterator接口实现逆向迭代输出,就需要先进行正向迭代输出;也就是说在实现逆向迭代输出前必须实现正向迭代输出。
Enumeration 和 Vector类同时发布的输出接口;早期的Vector类定义的集合就需要Enumeration 来输出。
public interface Enumberation<E>{
public boolean hasMoreElements(); //判断是否有下一个元素
public E nextElement(); // 获取当前元素内容
}
public Enumeration<E> elements() // 取得Enumeration接口对象
public class TestDemo {
public static void main(String [] args) {
Vector<String> all = new Vector<String>();//Set子接口
all.add("A");
all.add("B");
all.add("C");
Enumeration<String> enu = all.elements();
while(enu.hasMoreElements()) {
System.out.println(new String(enu.nextElement()));
}
}
}
public class TestDemo {
public static void main(String [] args) {
List<String> all = new ArrayList<String>();//Set子接口
all.add("A");
all.add("B");
all.add("C");
for (String str : all) {
System.out.println(str);
}
}
}
Collection每次都会保存一个对象,而Map接口主要负责一对对象的信息。
public V put(K key , V value);
public V get(Object key);
public Set<Map Entry<K,V>> entrySet();
public Set<K> keySet();
public class TestDemo {
public static void main(String [] args) {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("壹", 1);
map.put("贰", 2);
map.put("叁", 3);
map.put("叁", 33);
System.out.println(map);
}
}
通过代码分析可以发现:HashMap实现的输出是无序的;发现的重复的Key会进行覆盖,使用新的内容key的value覆盖原来的value
public class TestDemo {
public static void main(String [] args) {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("壹", 1);
map.put("贰", 2);
map.put(null, 3);
System.out.println(map.get("壹")); //返回 1
System.out.println(map.get("陸"));//key不存在返回 null
System.out.println(map.get(null));// 返回 3
}
}
通过HashMap和get()方法的代码观察发现,Map主要的目的是实现数据的信息的查找,Collection主要的目的是实现信息数据的输出。
public class TestDemo {
public static void main(String [] args) {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("壹", 1);
map.put("贰", 2);
map.put("叁", 3);
Set<String> set = map.keySet();// 取得key
Iterator<String> iter = set.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());//输出全部的key
}
}
}
public class TestDemo {
public static void main(String [] args) {
Map<String,Integer> map = new Hashtable<String, Integer>();
map.put("壹", 1);
map.put("贰", 2);
map.put("叁", 3);
System.out.println(map);
}
}
通过设置key或value为Null值来比较Hashtable和HashMap两个子类之间区别:Hashtable子类不允许存在null值,而HashMap允许Key或Value中为null值。*
public static interface Map.Entry<K,V>;//(等同于一个外部接口)
在Map中保存的实际上是被Map.Entry接口包装的一个对象,Map.Entry接口的对象包装的是:Key和Value值对数据元素。
public Set<Map.Entry<K,V>> entrySet();
public class TestDemo {
public static void main(String [] args) {
Map<String,Integer> map = new Hashtable<String, Integer>();
map.put("壹", 1);
map.put("贰", 2);
map.put("叁", 3);
// 将Map集合变为Set结合
Set<Map.Entry<String, Integer>> set = map.entrySet();
// 将Set集合实例化iterator接口对象
Iterator<Map.Entry<String, Integer>> iter = set.iterator();
while(iter.hasNext()) {
// 因为iter内容保存的是Map.Entry接口的对象,所以利用Map.Entry对象将Key和Value取出
Map.Entry<String, Integer> men = iter.next();
System.out.println(men.getKey() + "==" + men.getValue());
}
}
}
使用的Map集合,Key的类型可以自定义;那么这个自定义的类型必须覆写Object类之中的hashCode() 和 equals()方法,因为只有依靠这两个方法,才可以判断是否元素重复。【首先的Key类型是String,尽量不要使用自定义的对象类型去定义key;因为String类中默认了hashCode() 和 equals()】
class Book{
private String title ;
public Book(String title) {
this.title = title;
}
@Override
public String toString() {
return this.title;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((title == null) ? 0 : title.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
return true;
}
}
public class TestDemo {
public static void main(String [] args) {
Map<Book,String> map = new HashMap<Book, String>();
map.put(new Book("java"),new String ("开发"));
System.out.println(map.get(new Book("java")));
}
}
或者:
public class TestDemo {
public static void main(String [] args) {
Map<String,Book> map = new HashMap<String, Book>();
map.put(new String ("开发"),new Book("java"));
System.out.println(map.get(new String("开发")));
}
}
public class TestDemo {
public static void main(String [] args) {
Map<String,Book> map = new HashMap<String, Book>();
map.put("开发",new Book("java"));
System.out.println(map.get("开发"));
}
}
Stack 表示:栈操作;栈是一种先进后出的数据结构;而Stack是Vector的子类。
public class Stack<E>
extends Vector<E>
需要注意:Stack虽是Vector子类,可是不会使用Vector方法。
public E push(E item);
public E pop();
public class TestDemo {
public static void main(String [] args) {
Stack<String> all = new Stack<String>();
all.push("A");
all.push("B");
all.push("C");
all.push("D");
System.out.println(all.pop());
System.out.println(all.pop());
System.out.println(all.pop());
System.out.println(all.pop());
}
}
如果栈中数据已经全部执行出栈而依旧继续执行出栈pop操作,则报错:空栈异常(栈中无数据则无法出栈执行操作)
public static <T> boolean addAll(Collection<E> c,……);
public class TestDemo {
public static void main(String [] args) {
List<String> all = new ArrayList<String>();
Collections.addAll(all, "A","B","C","D");
System.out.println(all);
}
}
Collections工具类是负责给集合操作接口Collection提供辅助的操作方法