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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王海生 中级黑马   /  2014-9-20 11:06  /  923 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
public class Conllection_Set_List {

        /**
         * Collection
         *                 |--List:元素是有序的·元素是重复的,因为该集合体系有索引
         *                         |---ArrayList:底层的数据结构使用的是数组结构。
         *                                         特点:查询速度很快,但是插入和删除比较慢。线程不同步
         *                         |---LinkeList:底层使用的是链表数据结构。
         *                                         特点:查询比较慢,但是插入和删除比较快。
         *                         |---Vector:底层是使用数组数据结构。线程同步,功能和ArrayList一样的。但是被AraayList取代了
         *                                         特点:查询和插入、删除都比较慢,它默认长度为10,如果超过10后会new一个15的数组,将
         *                                                         原来的数据传到15的数组后再添加新的额数据,但是ArrayList会new一个长度为20的数组。
         *                         特有方法:凡事可以操作角标的方法都是该体系的特有方法。
         *                         增
         *                                 add(int index,E element):在列表的指定位置插入指定元素(可选操作)。
         *                                 addAll(index,collection):在指定位置插入collection中的全部元素
         *                         删
         *                                 remove(index);删除指定数据。
         *                         改
         *                                 set(index,element);修改指定位置的数据
         *                         查
         *                                 get(index)获取指定数据。
         *                                 subList(from,to);获取区间内的数据。
         *                                 listIterator();
         *                 |--set:元素是无序的,元素不可以重复。
         * @param args
         *
         * List集合特有迭代器。ListIterator是Iterator的子接口。
         * 在迭代时不可以通过集合对象的方法操作集合中的元素。因为会发生修改异常。
         * 所以在迭代器中只能通过迭代器的方法操作元素。可是Iterator的方法是有限的。只能对元素进行判断、移除、取出操作。
         * 如果想进行其他的操作,比如添加,修改等操作就要用到Iterator的子接口ListIterator
         *
         * 该接口只能通过List集合的ListIterator方法获取。
         */
        public static void main(String[] args) {
                // TODO 自动生成的方法存根

                //method();
                //演示列表迭代器
                //创建一个容器,通过collection的子类对象ArrayList。
                ArrayList al = new ArrayList();
                //添加元素
                al.add("java1");
                al.add("java2");
                al.add("java3");
                al.add("java4");
               
                ListIterator li = al.listIterator();
                System.out.println(li.hasPrevious());
                //正向遍历
                while(li.hasNext()){
                        Object obj = li.next();
                        if(obj.equals("java1")){
                                //li.add("sheng");
                                li.set("java5");
                        }
                }
                System.out.println(li.hasPrevious());
                System.out.println(li.hasNext());
                sop(al);
                //逆向遍历
                while(li.hasPrevious()){
                        sop(li.previous());
                }
                /*
                Iterator it = al.iterator();
                //对取出的元素进行一些操作,在迭代过程中进行一些添加或者删除
                while(it.hasNext()){
                       
                        //sop(it.next());
                        Object obj = it.next();
                        if(obj.equals("java2")){
                                it.remove();
                                //不能进行添加功能
                                //al.add("sheng");//在这里会出现修改异常,因为对同一个数据有两种方法在调用,会出现安全隐患。
                                sop(obj);//在这里obj=java2,因为在迭代中移除的是对象的引用(地址),但是数据还是在内存中,所以会打印java2
                               
                                sop(al);
                        }
                }*/
        }
        public static void method(){
                //创建一个容器,通过collection的子类对象ArrayList。
                                ArrayList al = new ArrayList();
                                //添加元素
                                al.add("java1");
                                al.add("java2");
                                al.add("java3");
                                al.add("java4");
                                sop(al);
                                //在指定位置添加元素
                                al.add(0, "haisheng");
                                sop(al);
                                //删除指定位置的元素
                                //al.remove(0);
                                //sop("删除后的数据"+al);
                                //修改元素
                                al.set(2, "sheng");
                                sop("修改后的数据"+al);
                                //查单个数据
                                //al.get(1);
                                //sop(al.get(1));
                                //获取一段数据,包含头,不包含尾部
                                sop("获取一段数据"+al.subList(1, 3));
                                //获取数据
                                Iterator it = al.iterator();
                                while(it.hasNext()){
                                       
                                        sop(it.next());
                                }
                                //通过indexOf获取元素的位置
                                System.out.println("sheng元素的位置index = "+al.indexOf("sheng"));
                                //通过角标获取元素
                                List sub = al.subList(1,3);
                                sop(sub);
        }
        public static void sop(Object obj){
               
                System.out.println(obj);
        }

}
**********************************************************************************************
Set集合
import java.util.*;
public class SetDemo {

        /**
         * |----set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
         *                         set集合的功能和collection的功能是一致的。
         *                         |---HashSet:底层数据结构是哈希表。
         *                                         HashSet是如何保证元素唯一性的呢?
         *                                         是通过元素的两个方法,HashCode()和equals()来实现的。如果元素的hashCode()的值一样
         *                                         那么就会调用equals来比较内容是否相同,如果相同就不能保存进来。如果HashCode的值不一样
         *                                         那么久不会比较。
         * 所以在以后的开发中,一般都要复写对象中的HashCode()函数。是集合底层内部调用的。
         *                         |---TreeSet:
         *                
         * @param args
         *
         * 往HashSet中存入自定义对象,姓名,年龄相同为同一个对象。
         */
        public static void sop(Object obj){
                System.out.println(obj);
        }
        public static void main(String[] args) {
                // TODO 自动生成的方法存根
                //哈希表中的数据是按照哈希值来存的,如果两者的哈希值一样,就是位置一样是,还要进行判断,判断两者数值
                //是否一样?判断是否同一个对象。如果对象不一样,那么会在同一个地址上。在同一个地址上顺延,
//                Demo de1 = new Demo();
//                Demo de2 = new Demo();
//                sop(de1);
//                sop(de2);
//                HashSet hs = new HashSet();
//                hs.add("java1");
//                hs.add("java2");
//                hs.add("java02");
//                hs.add("java3");
//                hs.add("java3");
//                hs.add("java4");
//                //取出只有一种方式:迭代器
//                Iterator it = hs.iterator();
//                while(it.hasNext()){
////                        Object obj = it.next();
//                        sop(it.next());
//                }
//        }
                HashSet hs = new HashSet();
                hs.add(new person1("zhangdan1",20));
                hs.add(new person1("zhangdan2",21));
                hs.add(new person1("zhangdan3",22));
                hs.add(new person1("zhangdan4",20));
                hs.add(new person1("zhangdan4",20));
                //注意:对于判断元素是否存在和删除等操作,都以来方法:HashCode和equals。先判断HashCode,再判断equals。
                sop("zhangdan4"+hs.contains(new person1("zhangdan4", 20)));
                hs.remove(new person1("zhangdan3", 22));
                Iterator it = hs.iterator();
                while(it.hasNext()){
                        person1 p = (person1)it.next();
                        sop(p.getName()+"--"+p.getAge());
                }
        }

}

class person1{
       
        private String name;
        private int age;
        person1(String name, int age){
               
                this.name = name;
                this.age = age;
        }
        public int hashCode(){
                //System.out.print(this.name+"---HashCode");是用来检测HashCode的调用情况
                return name.hashCode()+age*37;//尽量是用来保持哈希值的唯一性。
        }
        public boolean equals(Object obj){
                if(!(obj instanceof person1))
                       
                        return false;
                person1 p = (person1)obj;
                return this.name.equals(p.name)&& this.age==p.age;
        }
        public void setName(String name){
                this.name = name;
        }
        public void setAge(int age){
                this.age = age;
        }
        public String getName(){
                return name;
        }
        public int getAge(){
                return age;
        }
}

0 个回复

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