黑马程序员——集合基础(一)

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

一、集合

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

2集合与数组辨析

A) 容器长度:

集合长度可变

数组长度固定

B) 存储内容类型:

集合存储引用数据类型

数组存储任意类型

C) 是否可存储不同类型数据:

集合可以存储不同类型数据

数组只能存储相同数据类型

 

二、Java中的集合

1JDK为我们提供了一套完整的容器类库,这些容器可以用于存储各种类型的对象,并且长度都是可变的,我们把这些类统称为集合类,它们都位于java.util包中。

2分类:

A) 单列集合Collection

List:元素有序、包含重复元素

Set:元素无序、不包含重复元素

B) 双列集合Map:键值映射关系

C) 其他功能接口:

a迭代器Iterator

bComparable

cComparator

3、集合类的关系图

三、Collection接口:单列集合的根接口

1主要方法

A、添加:

boolean add(E e) 向该集合添加一个元素

boolean addAll(Collection c) 添加一个集合中的所有元素到该集合

B、删除:

boolean remove(Object o) 删除集合中指定的对象

boolean removeAll(Collection c) 从集合中删除集合c中的所有元素

void clear() 将集合中的元素全部删除,集合长度变为0

C、判断:

boolean contains(Object o) 集合中是否包含指定元素

boolean containsAll(Collection c) 集合中是否包含集合c中所有的元素

boolean isEmpty() 集合是否为空

D、获取:

Int size() 集合中元素的个数

E、取交集:

boolean retainAll(Collection c) 仅保留此collection中那些也包含在指定collection中的元素

F、集合转为数组:

Object[] toArray() 返回包含此 collection 中所有元素的数组

G、返回迭代器 (获取集合中所有元素)

Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器

 

2Iterator接口:单列集合的迭代器。迭代器会像地震搜救队的方式一样去遍历集合中的每一个元素。Iterator仅用于遍历集合,Iterator本身并不提供盛装对象的能力。Iteator必须依附于Collection对象,它包含对所属集合的数据结构中的数据项的引用。如果需要创建Iterator对象,则必须有一个被迭代的集合

A主要方法

boolean hasNext()  如果仍有元素可以迭代,则返回 true

E next()  返回迭代的下一个元素

 

B使用固定格式:

格式一:
	Collection c = new ArrayList();
	Iterator it = c.iterator();
	while(it.hasNext()){
    		System.out.println(it.next());
	}
格式二:
	for(Interator it = c.iterator();it.hasNext();){
      		System.out.println(it.next());
	}

 

四、List

List:单列集合,可存放重复元素,元素有序。

1主要子类:

ArrayList:底层数据结构是数组结构。线程不安全的。所以ArrayList的出现替代了Vector。增删慢,改查快。

LinkedList:底层是链表数据结构。线程不安全的,同时对元素的增删操作效率很高。

Vector:底层数据结构是数组结构。jdk1.0版本。线程安全的。无论增删还是查询都非常慢.已被ArrayList替代。

2、特殊方法

A、添加:

void add(int index, E element) 在指定的索引位插入元素

B、删除:

E remove(int index) 删除指定索引位的元素。返回被删的元素

C、获取:

E get(int index) 通过索引获取指定元素

List<E> subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图

int indexOf(Object o) 获取指定元素第一次出现的索引位,如果该元素不存在返回-1,通过-1,可以判断一个元素是否存在

int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1

D、修改:

E set(int index, E element) 用指定元素替换列表中指定位置的元素

E、返回迭代器:

ListIterator<E> listIterator() 返回此列表元素的列表迭代器(按适当顺序)。 

注意:用于应对并发修改异常

3、ListIteratorlist特有的迭代器,内含避免并发修改异常的算法。

ListCollection多了修改的功能,当要对List集合中的数据遍历过程中需要修改数据,那就要用到list里的listIterator(),不然会发生异常。因为子类的特有数据修改时子类最清楚,父类是不知道的。

A主要方法:

boolean hasNext() 以正向遍历列表,如果仍有元素可以迭代,则返回 true

E next()  返回迭代的下一个元素

boolean hasPrevious() 以逆向遍历列表,如果仍有元素可以迭代,则返回 true

E previous() 返回迭代的前一个元素

void add(E e)  将指定的元素插入列表

void remove() 从列表中移除由 next 或 previous 返回的最后一个元素

void set(E e) 用指定元素替换 next 或 previous 返回的最后一个元素

 

五、LinkedList

LinkedList:与ArrayList不同,LinkedList是方便添加删除的List

主要方法:

A、添加:

public void addFirst(E e)

public void addLast(E e)

Jdk1.6以后:

public boolean offerFirst(E e) 在此列表的开头插入指定的元素。

public boolean offerLast(E e) 在此列表末尾插入指定的元素

B、获取:

public E getFirst()

public E getLast()

Jdk1.6以后:

public E peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null

public E peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null

C、删除:

public E removeFirst() 

public E removeLast() 

Jdk1.6以后:

public E pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null

public E pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null

六、Vector

Vector:安全的ListVector中提供了一个独特的取出方式,就是枚举Enumeration。此接口Enumeration的功能与 Iterator 接口的功能是重复的。

主要方法:

public E elementAt(int index) 返回指定索引处的组件。

public E firstElement() 返回此向量的第一个组件(位于索引 0) 处的项

public E lastElement() 返回此向量的最后一个组件

public void setElementAt(E obj, int index) 将此向量指定 index 处的组件设置为指定的对象

public void removeElementAt(int index) 删除指定索引处的组件

public Enumeration<E> elements() 返回此向量的组件的枚举

 

七、Set

Set:单列集合,无序,元素不得重复。与Collection方法一致。Set集合取出元素只能使用迭代器。

Set主要子类

1HashSet:线程不安全,存取速度快。底层结构为哈希表结构,即区分元素时使用hash值。可以通过hashCodeequals方法的重写,保证元素唯一性。具体代码体现为:先判断哈希值是否相等,再判断equals方法是否返回truetrue则为相同元素,存储元素失败,false则为不同元素,存储元素成功。

例如:

package test;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo {
	public static void main(String[] args) {
		HashSet<MyDog> hashSet = new HashSet<MyDog>();
		hashSet.add(new MyDog("kitty",2));
		hashSet.add(new MyDog("kitty",2));
		hashSet.add(new MyDog("tom",3));
		hashSet.add(new MyDog("coffee",4));
		hashSet.add(new MyDog("jim",1));
		
		Iterator<MyDog> it = hashSet.iterator();
		while (it.hasNext()) {
			MyDog myDog = it.next();
			System.out.println(myDog);
		}
	}
}

class MyDog {
	private String name;
	private int age;
	public MyDog() {
		super();
	}
	public MyDog(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Dog [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof MyDog) {
			MyDog a = (MyDog)obj;
			return this.name.equals(a.name);
		}
		else 
			return false;
	}
}


 

2TreeSet: 线程不安全,可以对集合中的元素进行排序。通过Comparable让集合内元素具备比较性,通过Comparator让集合具备比较某种类型元素的能力。当ComparatorComparable冲突时,以Comparator作为标准。

例如:

package set;
class Student implements Comparable<Student>{//该接口强制让学生具备比较性
	private String name;
	private int age;
	public Student() {
		super();
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public int compareTo(Student s) {
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
			return this.name.compareTo(s.name);
		return -1;
	}	
}

class MyComparator implements Comparator<Student>{
	@Override
	public int compare(Student s1, Student s2) {
		int num = s1.getName().compareTo(s2.getName());
		if(num==0)
			return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
		return num;
	}
}

package set;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
	public static void main(String[] args) {
		TreeSet<Student> ts = new TreeSet<Student>();
		ts.add(new Student("lisi002",20));
		ts.add(new Student("lisi003",24));
		ts.add(new Student("lisi005",25));
		ts.add(new Student("lisi009",28));
		ts.add(new Student("lisi002",20));
		
		Iterator<Student> it = ts.iterator();
		while (it.hasNext()) {
			Student stu = it.next();
			System.out.println("name:"+stu.getName()+",age:"+stu.getAge());
		}
	}
}

 

3LinkedHashSet:在HashSet集合的基础上,使迭代顺序可预测

 

 

八、其他

1Collection体系最常用的集合为ArrayList

2当数据从数据库读出时,通常是使用ArrayList接收多个对象,从而使用该集合进行数据的传递。通常页面展示数据时,使用ArrayList作为最后数据的容器。

3TreeSet的排序功能在日常开发中使用的并不广泛。

4LinkedList常用于发生修改的数据。

5foreach循环:又叫增强for循环,是迭代器的简写形式

(1)是针对数组和Collection集合进行遍历的一种方式。

(2)格式:

for(数组或者Collection集合中的元素的数据类型 变量名 数组或者Collection集合对象) {

直接使用变量名即可,这个时候的变量名其实就是元素。

 }

例如:A与B的效果一样
	A:	for(String s : al){
			System.out.println(s);
		}
		
	B:	Iterator<String> it = al.iterator();
		while (it.hasNext())
		{
			String str = it.next();
			System.out.println(str);
		}

(3) 注意:

A:增强for的底层封装了迭代器的操作。

B:在使用增强for的时候,请保证迭代目标不为null

C:增强for循环只能做展示数据的功能,不能修改数据。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值