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

来源:互联网 发布:股票看图软件 编辑:程序博客网 时间:2024/06/06 00:04

------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上的元素. getlist.set(index1, list.get(index2));// 获取index2上的元素, 替换掉index1上的元素. get,// setlist.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
原创粉丝点击