黑马程序员──集合框架

来源:互联网 发布:mac版spss 编辑:程序博客网 时间:2024/06/18 12:50

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



集合框架


集合的由来:

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多
个对象的操作,就对对象进行存储,集合就是存储对象最常用的一
种方式。


数组和集合的区别:

数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。

集合中存储的都是对象的引用(地址)





Collection接口有两个子接口:
List        Set
List:可存放重复元素,元素存取是有序的。
Set:不可以存放重复元素,元素存取是无序的。

Collection定义了集合框架的共性功能。
1,添加
 add(e);
 addAll(collection);

2,删除
 remove(e);
 removeAll(collection);
 clear();

3,判断。
 contains(e);
 isEmpty();

4,获取
 iterator();
 size();

5,获取交集。
 retainAll();

6,集合变数组。
 toArray();


List接口中常用类:

ArrayList:数组结构  线程不安全,查询速度快。增删稍慢。

LinkedList:链表结构,增删速度快。查询稍慢

Vector: 数组结构  线程安全,但速度慢,已被ArrayList替代。

List:
特有方法。凡是可以操作角标的方法都是该体系特有的方法。


add(index,element);
addAll(index,Collection);


remove(index);



set(index,element);


get(index):
subList(from,to);
listIterator();
int indexOf(obj):获取指定元素的位置。
ListIterator listIterator();

取出List集合中元素的方式:

get(int index):通过脚标获取元素。
iterator():通过迭代方法获取迭代器对象。元素的方式(可以删除)
listiterator()(特有迭代器,可以进行增删改查)

高级for循环

public class CollectionIterator {public static void main(String[] args) {ArrayList<String> al = new ArrayList<String>();//新建集合对象al.add("haha");al.add("haha2");//添加元素al.add("haha3"); Iterator<String> it = al.iterator();//获取迭代器while(it.hasNext())//判断是否有元素{System.out.println(it.next());//取出元素,但不能并发访问。}}}


LinkedList:  特有方法

addFirst();
addLast();

getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

removeFirst();(可用于取出元素,特有方式。)
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
class LinkedListDemo {public static void main(String[] args) {LinkedList link = new LinkedList();link.addLast("java01");link.addLast("java02");link.addLast("java03");link.addLast("java04");while(!link.isEmpty())//判断是否为空{sop(link.removeLast());//获取、删除元素。}}

在JDK1.6出现了替代方法。

offerFirst();
offerLast();

peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。

pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。

Vector:特有取出方式-->枚举

class VectorDemo {public static void main(String[] args) {Vector v = new Vector();v.add("java01");v.add("java02");v.add("java03");v.add("java04");Enumeration en = v.elements();//获取枚举while(en.hasMoreElements())//判断下一个元素是否存在{System.out.println(en.nextElement());//取出下一个元素}}}

Set接口:

HashSet:哈希表数据结构

 线程不安全,存取速度快。

 通过hashCode 方法和equals方法来保证元素的唯一性。如果元素的HashCode值相

 同,才会判断equals是否为true。如果元素的hashcode值不同,不会调用equals。 

自定义类要重写hashCode 方法和equals方法

<span style="white-space:pre"></span>public int hashCode(){return name.hashCode()+age*37;}public boolean equals(Object obj){if(!(obj instanceof Person))return false;Person p = (Person)obj;return this.name.equals(p.name) && this.age == p.age;}
       

TreeSet: 二叉树数据结构 

 线程不安全,可以对Set集合中的元素进行排序。

 通过compareTo或者compare方法中的来保证元素的唯一 性。元素是以二叉树的形式存放的。

TreeSet中存储的对象要具有比较性需要实现Comparable -->覆写 compareTo

或者自定义比较器:实现Comparator -->覆写 compare

当两者排序都存在时,以比较器为主。

Comparable -->覆写 compareTo
class Person implements Comparable<Person>//实现Comparable接口{private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public int compareTo(Person p)//重写方法{int num = this.name.compareTo(p.name);if (num==0)return new Integer(this.age).compareTo(new Integer(p.age));return num;}

Comparator -->覆写 compare

自定义比较器。

class MyCom implements Comparator<Person>//实现Comparator{public int compare(Person p1,Person p2)//重写方法。{int num = p1.getName().compareTo(p2.getName());//判断主要条件。if(num==0)//主要条件相同时,判断次要条件。return   new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));return num;}}

泛型:<>

特点:

提高了程序的安全性
将运行期遇到的问题转移到了编译期
省去了类型强转的麻烦
泛型类的出现优化了程序设计

特殊:静态方法不能引用类上的泛型。

<?>类型不确定时用通配符表示。

<? extends E> 可以接收E类型或者E的子类型
<? super E> 可以接收E类型或者E的父类型
泛型限定   用于扩展泛型。

Map:

Map与Collection在集合框架中属并列存在

Map存储的是键值对,具有映射关系。

Map存储元素使用put方法,Collection使用add方法。

Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素。

Map集合中键要保证唯一性


Map集合常用类:

HashMap:底层是哈希表数据结构,线程不安全,速度快,允许存放null键,null值。

Hashtable:底层是哈希表数据结构 ,线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。

TreeMap:底层是二叉树数据结构,对键进行排序,排序原理与TreeSet相同。


常用方法:

1,添加。
put(K key, V value) 如果出现添加时,出现相同的键。那么后添加的值会覆盖原有键对应值。
putAll(Map<? extends K,? extends V> m) 


2,删除。
clear() 
remove(Object key) 


3,判断。
containsValue(Object value) 
containsKey(Object key) 
isEmpty() 




4,获取。
get(Object key) 
size() 
values() 

entrySet() 
keySet() 


重点方法演示:

entrySet() 
keySet() 

public class MapDemo {public static void main(String[] args) {TreeMap<String,String> tm = new TreeMap<String,String>();//建立集合tm.put("java01", "haha1");tm.put("java02", "haha2");tm.put("java03", "haha3");tm.put("java01", "haha1");tm.put("java02", "haha2");tm.put("java03", "haha3");Set<String> keyset = tm.keySet();//获取键Set集合Iterator<String> it =keyset.iterator();//迭代while(it.hasNext()){String key=it.next();String value= tm.get(key);System.out.println(key+":....:"+value);}Set<Map.Entry<String,String>> entryset = tm.entrySet();//Map.Entry<String,String>集合中的映射关系  就像夫妻的结婚证一样。for(Map.Entry<String,String> me :entryset)//高级for循环。{String key = me.getKey();String value = me.getValue();System.out.println(key+"  entry  "+value);}<span style="color:#ff0000;"></span>

集合框架工具类:

Collections: sortreverseOrder()

toArray 集合变数组

为了限定对元素的操作。不需要进行增删了。


Arrays :asList( ) 数组变成list集合

可以使用集合的思想和方法来操作数组中的元素。
注意:将数组变成集合,不可以使用集合的增删方法。
因为数组的长度是固定。

sort 折半查找 




以上内容为本人笔记,仅供参考。



















0 0
原创粉丝点击