上后谈爱情

导航

 

Java 集合框架:Java中集合类可以用来存储数量不等的多个对象,还可以用于保存映射关系的关联数组 ,对集合遍历有iterator迭代器,对集合的操作Collection工具类

存储对象可以采用两种方法: 1.数组2.集合,最基本数据存储方式:数组和链表

数组存储对象 Student[] stu=new Student[]  ----缺点:1.一旦创建,长度不可变 2.真实的长度未知(提供一个内部计数器);集合减轻这种弊端

 

Collection 是根接口,子接口的下有具体不同的实现类:

Java 集合分为 Collection 和Map两种体系:Collection 和Map 并列关系

 Collection:接口

     |-----Set:元素无序,不可重复的集合

     |--------List:元素有序,可重复

Map 接口:具有映射关系

    |---HashMap:线程不安全

    |---HashTable;线程安全的  ConcurrentHashMap:CAS的积极锁的操作

 

 

 

 


 

 2.Collection:常用的方法,具体实现由Set和List实现:

 coll.contains("AAA");---返回的是boolean 类型判断自定义的 注意对象的地址

 1         Collection coll=new ArrayList();//使用多态的方式
 2         
 3         // 2.向集合中添加元素
 4         coll.add(123);
 5         coll.add(new Date());
 6         
 7         // 3.addAll()
 8         Collection coll1=Arrays.asList(1,2,3);// ---返回的是List是Collection的子接口
 9         
10         // 4.遍历集合直接引用名 输出其中的元素,输出结果不是地址是对toString的重写
11         System.out.println(coll);

明显Collection对原来方法toString的重写
   对于Collection 的contains()方法判断的依据根据元素所在类的equals()方法,对于自定义的类的话具有相同的,自定义类重写equals方法,对相同的属性判断为同一个对象,这里要在对象的类中重写equals的方

1.1   containsAll(Collection coll):--判断当前集合中是否包含coll所有的元素

 

1.2 Coll.retainAll(Coll1) :两个集合的交集

1.3 coll.removeAll(coll1):删除两个的交集--叫差集

1.4 hashCode:集合中元素值计算其中hashCode的

1.5 toArray() :集合转换成数组,数组转换成集合 Arrays.alist()

1.5 Iterator it=coll.iterator() i指向前一个栈顶必须只能iterator.hasNext(),如果iterator.hasNext 修改i.next()  会报错

原因:i.next()指针会指向其i的下一个地址,输出时候输出不安全,同时发生null

1 Iterator iter=coll.iterator();
2         
3         // 实现集合的遍历:
4         while(iter.hasNext())//不能修改成iter.next()
5         {
6             System.out.println(iter.next());
7         }

使用forEach循环实现集合遍历

forEach遍历:集合取一个元素给S,并没有修改集合中元素

 


 

 Collection:接口

     |-----Set:无序元素,不可重复的集合,Set中常用的方法都是Collection集合中方法

    Set:存储元素无序的,不可重复性,1.无序性不是随机性--元素在底层存储的位置是无序的

    不可重复:调用自定义类中equals方法和hashCode方法,(没有重写)默认是object 类中equals方法和HashCode比较两个对象的地址

    说明:要添加Set中元素所在的类 一定重写equals和hashCode方法,判断自定义类中不添加相同属性的对象----主要Set中元素是无序存储(使用哈希算法)必须重写其中的hashCode方法

             |----hashSet(主要实现类,Collection 接口下Set集合的主要实现类),LinkedHashSet,TreeSet

     |--------List:元素有序,可重复

     |----ArrayList(主要的实现类)、LinkedList、Vector

Map 接口:具有映射关系

    |---HashMap:线程不安全

    |---HashTable;线程安全的  ConcurrentHashMap:CAS的积极锁的操作

 

1.ArrayList:在List接口中新增一些方法: ArrayList 添加顺序存储,但是Set集合就不一样

ArrayList.add(index,object):在指定位置上添加,原来位置上有值得会依次往后移动

LinkedList---底层运用链表的方式实现:适用于频繁的插入和顺序的遍历

Vector太老了, 一般不使用,注意海量数据处理的方法

 Collection:接口

     |-----Set:无序元素,不可重复的集合,Set中常用的方法都是Collection集合中方法

    Set:存储元素无序的,不可重复性,1.无序性不是随机性--元素在底层存储的位置是不连续的通过Hash值计算

    不可重复:调用自定义类中equals方法和hashCode方法,(没有重写)默认是object 类中equals方法和HashCode比较两个对象的地址

    说明:要添加Set中元素所在的类 一定重写equals和hashCode方法,判断自定义类中不添加相同属性的对象----主要Set中元素是无序存储位置(使用哈                希算法进行计算的)必须重写其中的hashCode方法

             |----hashSet(主要实现类,Collection 接口下Set集合的主要实现类),LinkedHashSet,TreeSet

原理:

   hashSet :向Set中添加元素时候,首先调用 hashCode 方法计算其Hash值,hashCode决定此对象中Set存储位置,此位置上没有此对象则存储,如果已经有对     象存储在比较两个对象的equals方法,如果equals方法true,后一个不能添加,所以Set保持不重复性;万一false在此位置存储这两个不同属性的元素---不建议使用

      LinkedHashSet比hashSet特点:使用链表维护添加元素的列表,遍历时候按照添加的输出 链表进行连接   在底层存储时候不是连续内存块--并不能                     说无序的 (无序在底层存储按照hash值来进行存储):遍历速度快,插入慢(维护其链表)。

                TreeSet:1.只能添加一个类型,不同于HashSet与LinkedHashSet添加object类型 2.添加集合中元素指定的顺序遍历-默认按照字母从小到大遍历

          3.当自定义类没有实现Comparable接口时候,向TreeSet添加Person类发生报错:

           排序:1.自然排序:要求自定义类实现Java。lang.Comparable 接口并且重写其中compareTo方法

             2.定制排序:使用Java中comparator接口不同于自然排序的comparable接口

   原理:

  5.向TreeSet中添加元素,首先按照compareTo()方法相比较,如果compartTo是零,TreeSet不会添加此对象    程序认为其是相同的对象 必须重写 compareTo方法按照多个属性进行排序

     |--------List:元素有序,可重复

     |----ArrayList(主要的实现类)、LinkedList、Vector

Map 接口:具有映射关系

    |---HashMap:线程不安全

    |---HashTable;线程安全的  ConcurrentHashMap:CAS的积极锁的操作

 

 

所以Set不重复必须在自定义的方法中重写hashCode和equals方法:

注意:重写HashCode方法:对象属性值一样保证HashCode一样,对象属性值不一样保证HashCode不一样,

没有重写 Hashcode 和equals方法

1           Set set=new HashSet();
2         Person p1=new Person("MM",23);
3         Person p2=new Person("MM",23);
4         System.out.println("没有重写hashCode方法和equals: "+ p1.hashCode()+" "+p2.hashCode());
5         set.add(p1);set.add(p2);
6         System.out.print(set);
7         System.out.println(set.size());

 


 重写其 HashCode和equals 方法:自定类Person中

重写HashCode方法计算其Hash值:迭代 较好的键重性,

 1 @Override
 2     public int hashCode() {
 3         final int prime = 31;
 4         int result = 1;
 5         result = prime * result + age;
 6         result = prime * result + ((name == null) ? 0 : name.hashCode());
 7         return result;
 8     }
 9     @Override
10     public boolean equals(Object obj) {
11         if (this == obj)
12             return true;
13         if (obj == null)
14             return false;
15         if (getClass() != obj.getClass())
16             return false;
17         Person other = (Person) obj;
18         if (age != other.age)
19             return false;
20         if (name == null) {
21             if (other.name != null)
22                 return false;
23         } else if (!name.equals(other.name))
24             return false;
25         return true;
26     }

TreeSet 类:

1.按照自然排序:自定义类重写comparaTo(),如果排序某个属性相同的话,必须按照其他属性进行排序--CompareTo,hashcode和equals标一致

 在Person中重写Comparable接口中CompareTo方法:同时hashCode和equals表持一致:按照自然排序 实现Comparable接口

 1 public int compareTo(Object arg0) {
 2         // 按照某个属性进行排序
 3         if(arg0 instanceof Person)
 4         {
 5             Person p=(Person)arg0;
 6             
 7             int i= this.age.compareTo(p.age);
 8             if(i==0)
 9                 return this.name.compareTo(p.name);
10             else
11                 return this.age.compareTo(p.age);
12         }
13         
14         return 0;
15     }

 

 

   2.按照定制排序,实现Compartor接口重写compara的方法(注意:当前属性相同按照其他属性名排序),hashcode和equals标持一致;

重写toString在直接输出Set集合中内部元素;从结果看TreeSet不重复性。

 1 // 1.创建一个实现 Comparator 接口的类的对象,匿名类部类
 2            Comparator com=new Comparator(){
 3             // 向TreeSet中添加Customer类对象,在此comapre指明Customer按照那种属性排序
 4             @Override
 5             public int compare(Object o1, Object o2) {
 6                 if(o1 instanceof Customer && o2 instanceof Customer)
 7                 {
 8                     Customer c1=(Customer) o1;
 9                     Customer c2=(Customer) o2;
10                     int i= c1.getAge().compareTo(c2.getAge());
11                     if(i==0)
12                         //比较其他属性
13                         return c1.getName().compareTo(c2.getName());
14                     else
15                         return i;
16                     }
17                 return 0;
18             }
19             };
20             TreeSet set=new TreeSet(com);
21             // 3.向TreeSet中添加Comparator接口中对象
22             set.add(new Customer("CC",1001));
23             set.add(new Customer("DD",1001));
24             
25             for(Object str:set)
26                 System.out.println(str);//重写toString的方法
27             


 

 

Map与Collection并列存在的,Map中key用Set来进行存放,Key不允许重复,value可以重复,Map中Key用Set进行存放;重写hashCode与equals方法

HashSet是用HashMap特别实现,HashSet是HashMap的value值null

纵向看 Key是Set,横向叫做entry

 


 Map接口

     |--HashMap :z主要实现类,HashSet是Set主要实现类

     |---LinkedHashMap:

 

Map中向其中添加一个元素put,HashMap中Key用Set存放不能重复,value用collection 存放;

2.向hashMap 添加自定义类的元素。,调用Key所在类的equals的方法,相同只会保存最新的元素old的元素被覆盖

 

3. Map遍历三种方式---Key是Set存储,无序

   1.遍历KeySet集   

   2.遍历value:map.values:返回一个collection集合

  3.遍历key-value

 

4.hashtable 不允许 null 作为key 和value--

        -说其子类Properties常用来处理属性文件,键和value是String

posted on 2017-04-25 10:09  上后谈爱情  阅读(143)  评论(0编辑  收藏  举报