黑马程序员---Java基础---List集合

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

一.集合

         1.什么是集合

                   集合是一种容器, 长度可变, 可以存储任意类型的对象.


     

         2.集合的分类

               Collection:单列集合, 一次存一个对象

                     List: 可重复, 有索引

                       * ArrayList:      数组实现, 查找快, 增删慢

                     * LinkedList:     链表实现, 增删快, 查找慢

                                Vector:              原理和ArrayList相同, 线程安全, 效率较低

                                Stack:                 栈, 先存的对象最后才能被取出

                     Set:  不重复, 无索引

                       *HashSet:                 使用哈希算法, 去重复, 速度快.

                       *TreeSet:                  使用二叉树算法, 按照指定顺序排序. 指定顺序的方式有两种: 自然顺序, 比较器

                                LinkedHashSet:        HashSet的子类, 也是使用哈希算法, 但可以保留存储顺序.

                     Map: 键值对, 一次存两个对象. 键唯一, 可以根据键查找值.

                       *HashMap:              使用哈希算法对键对象去重复

                       *TreeMap:                使用二叉树算法对键对象排序

                       *LinkedHashMap:  HashMap的子类, 去重复的同时保留存储顺序

                       *Hashtable:             和HashMap原理相同, 都是使用哈希算法去重复. 线程安全, 效率略低. 键和值都不允许为null

                       *Properties:             键和值都是String, 用来存储一些配置项           

   二.List集合

1.List集合

                ArrayList:  数组结构 , 查找快, 增删慢

                            查找的时候直接获取数组中的元素, 直接操作内存地址, 速度较快

                            增删的时候, 由于要创建数组或者拷贝数组,所以速度较慢

              LinkedList:链表结构, 增删快, 查找慢

                            增加的时候只要让最后一个元素记住新来的一个元素即可, 删除的时候只要让前一个记住后一个后一个记住前一个即可, 所以链表结构增删较快

                            查找的时候需要逐个查找, 所以速度较慢

                                              

         2.List类常用方法:

                   boolean  add(Object obj)

                            向集合中添加一个对象, 如果改变了集合的结构, 返回true. 集合可以添加任意类型的对象.

<span style="white-space:pre">	</span>private static void demo1() {
		List list = new LinkedList();
		list.add("aaa");
		list.add("bbb");
		list.add(1, "ccc");			// 将"ccc"插入到1号索引
		System.out.println(list);
	}


                   Object     remove(int index)

                            删除指定索引上的元素, 并且返回这个元素

 <span style="white-space:pre">	</span>private static void demo8() {
		List list1 = new LinkedList();
		list1.add("aaa");
		list1.add("bbb");
		list1.add("ccc");
		list1.add("ddd");
		System.out.println(list1.remove(2));	// 删除2号索引上的元素, 并且将元素返回
		System.out.println(list1.remove(2));
		System.out.println(list1);
	}

                   Object     set(int index, Objectobj)

                           将集合中指定位置的元素替换为指定对象

	private static void demo12() {
		List list1 = new LinkedList();
		list1.add("aaa");
		list1.add("bbb");
		list1.add("ccc");
		list1.add("ddd");
		System.out.println(list1.set(2, "xxx"));			// 将2号元素改为"xxx"
		System.out.println(list1);
	}

                   Object     get(int index)

                            从集合中获取指定索引上的对象.                           

         3.集合的遍历

                 for循环:          循环size()次, 每次调用get(int)方法获取一个元素.

                 迭代器:          使用iterator()方法获取一个迭代器(Iterator对象), 调用hasNext()方法判断是否包含下一个元素,调用next()方法获取元素.

                 增强for循环: for (类型 变量名 : 容器) { 循环体 }, 容器长度是多少循环体就执行多少次, 变量每次引用容器中的一个元素.  

package cn.itcast.day16.list;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class ListIterateDemo {

	public static void main(String[] args) {
		List list = new LinkedList();
		list.add("aaa");
		list.add("bbb");
		list.add("ccc");
		list.add("ddd");
		
//		iterate1(list);
//		iterate2(list);
//		iterate3(list);
	}

	// List和Set通用
	private static void iterate3(List list) {	
		for (Object obj : list)					// 增强for循环, for (类型  变量名  : 容器) { 循环体 }
			System.out.println(obj);
	}

	// List和Set通用
	private static void iterate2(List list) {	
		Iterator iter = list.iterator();		// 获取list对象的迭代器(Iterator接口的子类对象), 内部有一个指针, 默认指向第一个元素之前的位置
		while (iter.hasNext())					// 判断是否包含下一下元素
			System.out.println(iter.next());	// 将指针向后移动一位, 并返回这个位置上的元素
	}

	// 只能用于List, Set不能使用
	private static void iterate1(List list) {	
		for (int i = 0; i < list.size(); i++)
			System.out.println(list.get(i));
	}

}
          

         4.遍历时删除元素

                 for循环:          由于在List集合中删除元素之后, 后面的元素会向前移动, 所以每次删除之后需要将循环遍历-1

                 迭代器:          迭代器在使用的过程中不允许修改集合, 如果要删除, 必须使用迭代器的remove()方法

                 增强for循环: 无法在循环过程中修改集合

package cn.itcast.day16.exercise;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import cn.itcast.day16.domain.Person;

public class Exercise2 {

	public static void main(String[] args) {
//		demo1();
//		demo2();
//		demo3();
//		demo4();
	}

	private static void demo4() {
		List list = new ArrayList();
		list.add(new Person("张三", 19));
		list.add(new Person("李四", 20));
		list.add(new Person("王五", 19));
		list.add(new Person("赵六", 19));
		for (Object obj : list) {
			Person p = (Person) obj;
			if (p.getAge() == 19)
				list.remove(p);		// 增强for循环内部就是使用迭代器, 在使用的过程中不能改变原集合. 由于无法获得迭代器, 所以增强for循环不能操作集合.
		}
	}

	private static void demo3() {
		List list = new ArrayList();
		list.add(new Person("张三", 19));
		list.add(new Person("李四", 20));
		list.add(new Person("王五", 19));
		list.add(new Person("赵六", 19));
		System.out.println(list);
		Iterator iter = list.iterator();
		while (iter.hasNext()) {
			Person p = (Person) iter.next();
			if (p.getAge() == 19)
				iter.remove();		// 在使用迭代器的时候, 不能修改集合中的结构, 如果要删除, 需要使用迭代器的remove()方法
		}
		System.out.println(list);
	}

	private static void demo2() {
		List list = new ArrayList();
		list.add(new Person("张三", 19));
		list.add(new Person("李四", 20));
		list.add(new Person("王五", 19));
		list.add(new Person("赵六", 19));
		System.out.println(list);
		for (int i = 0; i < list.size(); i++) {
			Person p = (Person) list.get(i);
			if (p.getAge() == 19)
				list.remove(i--);	// 删除元素后, 后面的元素会向前移动, 这时我们将指针也向前移动一位
		}
		System.out.println(list);
	}

	private static void demo1() {
		List list = new ArrayList();
		list.add(new Person("张三", 19));
		list.add(new Person("李四", 20));
		list.add(new Person("王五", 19));
		list.add(new Person("赵六", 19));
		
		for (int i = 0; i < list.size(); i++) {
			Person p = (Person) list.get(i);
			if (p.getAge() == 19)
				System.out.println(p.getName());
		}
		
		Iterator iter = list.iterator();
		while (iter.hasNext()) {
			Person p = (Person) iter.next();
			if (p.getAge() == 19)
				System.out.println(p.getName());
		}
		
		for (Object obj : list) {
			Person p = (Person) obj;
			if (p.getAge() == 19)
				System.out.println(p.getName());
		}
	}

}

三.练习

1.交换集合上的两个元素

package cn.itcast.day16.homework;

import java.util.LinkedList;
import java.util.List;

public class Homework1 {

	public static void main(String[] args) {
		List<String> list = new LinkedList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");

		System.out.println(list);
		swap(list, 1, 3);
		System.out.println(list); // a d c b
	}
/**
 * 交换集合上两个元素
 * @param list	要交换的集合
 * @param index1	交换的第一个位置
 * @param index2	交换的第二个位置
 */
	public static void swap(List list, int index1, int index2) {
		Object temp =  list.get(index1);// 定义变量, 记住index1上的元素. get
		list.set(index1, list.get(index2));// 获取index2上的元素, 替换掉index1上的元素. get,
											// set
		list.set(index2, temp);// 用变量记住的元素, 替换掉index2上的元素. set
	}

}

2.翻转集合

package cn.itcast.day16.homework;

import java.util.LinkedList;
import java.util.List;

public class Homework2 {

	public static void main(String[] args) {
		List<String> list = new LinkedList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");

		System.out.println(list);
		reverse(list);
		System.out.println(list);
	}
/**
 * 翻转集合
 * @param list 被翻转的集合
 */
	public static void reverse(List list) {
		String temp;// 创建一个变量做中间变量
		for (int i = 0; i < list.size() / 2; i++) { // 循环二分之size次
			temp = (String) list.get(i); // 把第一个和最后一个交换、第二个和倒数第二个交换……以此类推
			list.set(i, list.get(list.size() - i - 1));
			list.set(list.size() - i - 1, temp);
		}

	}
}

3.自定义ArrayList, 模拟Java提供的ArrayList, 数组实现的列表

package cn.itcast.day16.mine;

/**
 * 自定义ArrayList, 模拟Java提供的ArrayList, 数组实现的列表
 * @author Don
 */
public class MyArrayList<E> {	// <E>为泛型, 在创建对象的时候, <>中指定的类型是什么, 这个E就是什么, 整个类中的E都是这一个类型
	
	private Object[] arr = new Object[10];	// 用来装载数据的容器
	private int size;						// 集合的大小
	
	/**
	 * 添加一个对象到ArrayList中, 内部就是将对象添加到数组中
	 * @param e	要添加的对象
	 * @return	添加是否成功
	 */
	public boolean add(E e) {
		if (size == arr.length) {			// 如果数组装满了
			Object[] newArr = new Object[arr.length * 3 / 2 + 1];	// 创建一个更大的新数组
			System.arraycopy(arr, 0, newArr, 0, size);				// 将原有数据拷贝到新数组中
			arr = newArr;											// 成员变量记住新数组
		}
		arr[size++] = e;
		return true;
	}
	
	/**
	 * 删除指定索引上的元素
	 * @param index	要删除的索引
	 * @return		被删除的元素
	 */
	public E remove(int index) {
		checkRange(index);
		Object oldElement = arr[index];		// 记住要删除位置上的元素
		int length = size - index - 1;		// 要删除的元素后面有几个元素
		if (length > 0)						// 如果要删除的位置后面有元素
			System.arraycopy(arr, index + 1, arr, index, length);	// 将要删除位置后面的元素向前移动一位(覆盖了要删除的位置)
		arr[--size] = null;					// 将最后一个元素删除
		return (E) oldElement;				// 返回被删除的元素(在数组中被覆盖了)
	}
	
	/**
	 * 将集合中指定位置上的元素替换为指定元素
	 * @param index	要替换的位置
	 * @param e		要替换成哪个对象
	 * @return		被替换掉的对象
	 */
	public E set(int index, E e) {
		checkRange(index);
		Object oldElement = arr[index];		// 记住原对象
		arr[index] = e;					// 将原对象替换为新对象
		return (E) oldElement;				// 返回原对象
	}

	/**
	 * 检查索引是否越界
	 * @param index	要检查的索引
	 */
	private void checkRange(int index) {
		if (index >= size)
			throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
	}
	
	/**
	 * 获取集合中指定索引上的元素
	 * @param index	指定索引
	 * @return		索引上的元素
	 */
	public E get(int index) {
		checkRange(index);
		return (E) arr[index];
	}
	
	/**
	 * 获取集合的大小
	 * @return	集合的大小
	 */
	public int size() {
		return size;
	}
	
	/**
	 * 重写Object类的toString, 返回集合中每个元素的toString
	 * @return	每个元素的toString
	 */
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (int i = 0; i < size; i++) 		// 将集合中每个元素添加到StringBuilder中
			sb.append(arr[i] + (i < size - 1 ? ", " : ""));		// 如果不是最后一个, 加上逗号和空格
		sb.append("]");
		return sb.toString();
	}
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值