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