A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© MengDeKaiShi 中级黑马   /  2015-1-2 22:30  /  918 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一.        集合和数据结构
面向对象的核心是对象,我们要操作多个对象,就需要将这多个对象存储起来。
集合就是存储多个对象的一个容器。

集合的特点:
只能存储引用类型;
长度可变;
可以存储不同数据类型的对象

数组与集合的区别
                                存储内容                                  长度                                存储内容
数组:         引用类型、基本数据类型                         不可变                        必须存同一种数据类型

集合:                        引用类型                                  可变                        可以存不同数据类型

因为数据不同,所以我们使用的容器不一样。数据是以某种特定的结构存在的,这种结构我们就叫他数据结构。数据的组织形式称为数据结构,不同数据结构的数据必须存在不同的容器中,每一种容器都有有别于其他容器的结构。

程序=数据结构+算法

数据结构
                  集合结构:属于同一种类型(集合)
                  线性结构:一次函数关系(y=x),栈、队列、数组、链表
                                  栈:后进先出
                                  队列:先进先出
                  树形结构:元素之间存在一对多的关系,就橡树一样。二叉树、平衡二叉
树、查找树、红黑树
                  图形结构:元素之间存在多对多的关系
数组和链表的数据结构:
                  数组:存储多个同一种元素的容器
                          特点:元素都有编号,方便获取
                          优点:查询快
                          缺点:增删慢
                  链表:把一些结点链接起来的数据结构(结点:由指针域和数值域组成)
                          优点:增删快
                          缺点:查询慢




集合框架体系图


Collection体系结构简图

二.        Collection接口
集合层次中的根接口
1.成员方法
(1)添加:
                boolean add(E e) 添加元素
                  addAll(Collection c) 添加集合
(2)删除:
                  void clear()清除全部元素
                  boolean remove(object o) 移出制定元素
                  boolean removeAll(Collection c) 移除指定集合C中的所有元素
  
(3)判断:
          boolean isEmpty() 判断是否为空(是否不包含元素)
          boolean contains(Object o) 判断是否含有某个元素
          boolean containsAll(Collection c) 判断是否含有指定集合中所有元素
(4)获取长度:
          int size() 获取集合的长度
(5)遍历(获取):
          Iterator<E> iterator() 遍历集合中的元素
(6)交集:
          boolean retainAll(Collection c)求交集
(7)获取数组:
          Object[] toArray() 集合转数组
2.代码示例
(1)基本操作代码示例
public class CollectionDemo2 {
        public static void main(String[] args) {
                // 创建对象
                // Collection c=new Collection(); 错误 因为接口不能被实例化
                // 通过实现了该接口的子类来实例化
                Collection c = new ArrayList<>();
                // 添加元素
                c.add("hello");
                c.add("world");
                c.add("java");
                System.out.println(c);
                // 判断
                // 判断是否为空(是否包含元素)
                System.out.println(c.isEmpty());
                //判断是否包含某个元素
                System.out.println(c.contains("world"));
                System.out.println(c.contains("哈哈哈"));
                // 获取长度
                int size = c.size();
                System.out.println(size);
                // 删除功能演示
                System.out.println("remove:" + c.remove("world"));
//remove删除了返回true; 没找到,删除不了,返回false
                System.out.println("remove:" + c.remove("hahaha"));
                c.clear();// 不建议使用这个 全部清空,太暴力
                System.out.println(c);
        }
}
(2)带All的方法代码示例(两个集合之间的互操作)
public class CollectionDemo21 {
        public static void main(String[] args) {
                //创建一个集合
                Collection c1=new ArrayList();
                c1.add("abc1");
                c1.add("abc2");
                c1.add("abc3");
                c1.add("abc4");
                //创建另一个集合
                Collection c2=new ArrayList();
                c2.add("abc4");
                c2.add("abc5");
                c2.add("abc6");
                c2.add("abc7");
                //boolean addAll(Collection c)向集合中再添一个集合
                System.out.println("addAll:"+c1.addAll(c2));
               
                //boolean removeAll(Collection c) 从集合中删除一个指定的集合元素
                //只要有数据被删除 就返回true
                System.out.println("removeAll:"+c1.removeAll(c2));
               
                //boolean containsAll(Collection c)判断集合中是否存在另一个集合的元素
                //只有所有元素都包含才返回true
                System.out.println("containsAll:"+c1.containsAll(c2));
               
                //boolean retainAll(Collection c)获取交集
                /*
                 * 如果有两个集合A和B
                 * A集合对B做交集
                 * A集合中保存交集元素 ,B集合不发生改变
                 * 返回值是A集合是否发生了改变
                 */
                System.out.println(c1.retainAll(c2));
        }
}
(3)集合遍历的几种方式
方式1 集合转数组再遍历
// 创建一个集合对象 (多态)
                Collection c = new ArrayList();
                /*
                 * 注意事项: add(Object o)接收的是一个Object类型的对象
                 * 在接收的时候,已经向上转型了,也就是说存进去之后,存的已经是
* Object了 所以在转换数组的时候转换成的就是一个Object数组
                 * 取出来的每一个元素也就是一个Object
                 */
                c.add("aaa");
                c.add("bbb");
                c.add("ccc");
                c.add("ddd");
                // 转换成数组
                Object[] str = c.toArray();
                // 遍历
                for (int i = 0; i < str.length; i++) {
                        Object o = str[i];
                        System.out.println(o.toString());// 调用子类的toString
                        String s = (String) o;// 向下转型
                        System.out.println(s.length());
                }



方式2 通过get方法遍历(List独有功能)
List list = new ArrayList();
                list.add("aaa");
                list.add("bbb");
                list.add("ccc");
                for (int i = 0; i < list.size(); i++) {
                        String s = (String) list.get(i);
                        System.out.println(s);
                }
方式3 通过迭代器遍历
/**
         * iterator遍历
         * Iterator iterator()用于获取集合中的每一个元素
         * 成员方法:
         * Object next()获取元素,并自动移向下一个元素的位置
         * boolean hasNext()判断迭代器中是否有下一个元素
         */
// 创建一个集合对象 (多态)
                Collection c = new ArrayList();
                // 添加元素
                c.add("aaa");
                c.add("bbb");
                c.add("ccc");
                c.add("ddd");
                // 通过集合对象获取迭代器对象
                // Iterator是接口,这是接口多态,返回一个实现了接口的子类对象
                Iterator iterator = c.iterator();
                while (iterator.hasNext()) {
                        String s = (String) iterator.next();
                        System.out.println(s);
                }
三.        List接口
List特点: 有序、根据索引值进行精确操作、元素可以重复

List三个常见实现类:
          ArrayList:底层数据结构是数组,查找快、增删慢、线程不同步,效率高
          LinkedList:底层数组结构是链表,查找慢、增删快、线程不同步、效率高
          Vector:底层数据数据结构是数组,查找快、增删慢、线程同步、效率低、安全
         
从JDK1.2开始,使用List替代了Vector

1.List特有方法

(1)添加功能
        void add(int index,Object obj):在指定索引处添加元素
(2)删除功能
        Object remove(int index):根据指定索引删除元素,并把删除的元素返回
(3)修改功能
        Object set(int index,Object obj):把指定索引位置的元素修改为指定的
值,返回修改前的值
(4)获取功能
int indexOf(Object o):返回指定元素在集合中第一次出现的索引
        Object get(int index):获取指定位置的元素
        ListIterator listItetator():列表迭代器(list独有,可以向后遍历,
增、删、改列表)
(4)截取功能
List subList(int fromIndex,int toIndex):截取集合(含头不含尾)
(5)代码示例
public class ListDemo1 {
        public static void main(String[] args) {
                // 创建集合对象
                List list = new ArrayList();
                // 添加元素
                list.add("aaa");
                list.add("bbb");
                list.add("ccc");
               
                //对于以下操作索引的方法,要注意IndexOutOfBoundsException异常
                // void add(int index,Object obj)在指定位置添加元素
                list.add(1, "hello");
                list.add(3, "world");
                System.out.println("list:" + list);
               
                // Object remove(int index)根据指定索引删除元素,并把删除的元
素返回
                System.out.println("remove:" + list.remove(3));
               
                // Object set(int index,Object obj)把指定索引位置的元素改为
指定的值,返回修改前的值
                System.out.println("set:" + list.set(0, "change"));//将索
引为0处的元素的内容改为“change”
                System.out.println("list:" + list);//打印修改后的数组
               
                // Object get(int index)获取指定位置的元素
        System.out.println("get:" + list.get(0));//获取索引0处的元素

                // int indexOf(Object o)返回指定元素第一次出现的索引
                System.out.println(list);//打印当前数组
                int index=list.indexOf("ccc");//获取“ccc”第一次出现的索引
                System.out.println(index);//打印索引值
               
                //list<E> subList(int formIndex,int toIndex):截集合(含头
不含尾)
                List list2=list.subList(0, 2);//截取索引0-2间的集合,有0没2
                System.out.println(list);//打印原串(截取操作不影响原集合)
                System.out.println(list2);//打印截取的集合
        }
}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马