1.集合概述
|与数组的区别: 1、集合的长度是可变的,数组的长度是固定的 2、集合专门存储对象不能存储基本数据类型,数字可以存储对象也可以存储基本数据类型
2.Collection接口
|collection中的方法 建立一个集合:Collection coll = new ArrayList; 1、add() 向集合中添加对象 coll.add(); 2、clean() 移除此collection中的所有元素 3、equals(Object o) 比较collection与指定对象是否相等,区分大小写 4、hashCode() 返回此collection中的哈希码值 5、isEmpty() 如果此collection不包含元素则返回true 6、iterator() 返回此collection的元素上进行迭代的迭代器(迭代器较重要,后面单独说) 7、remove() 移除指定元素 8、size() 返回Collection中的元素个数 9、toArray() 返回包含此collection中所有元素的数组 10、contains(Object o)如果collection中包含指定的元素返回true 迭代器 迭代器 Collection中的一个共性方法 返回值类型是一个接口类型 接口是Iterator 此方法用于取出集合中存储的对象的方法 方法的使用: Collection coll = new Collectin(); Iterator it = coll.iterator();//1.调用集合中的Iterator方法,获取迭代器对象 while(it.hashNext()){//调用迭代器中的hasNext()方法来判断是否有对象被取出 sop(it.next());//调用集合中next方法获取集合中的元素 }
3.List派系 |List派系中的集合容器是有序排列的(怎么存的怎么取出)
|List派系中允许存储重复的元素
|List派系中其他特有的方法 1、add(int index,E element) 在列表的指定位置插入指定的元素 2、get(int index) 返回列表指定位置的元素 3、indexOf(Object 0) 返回此列表第一次出现指定元素的索引如果没有返回-1 4、set(int index,E element) 用指定的元素替换指定位置的元素
|有序的
|可以重复的
|LinkedList它是List派系中的一个子类 |线程不同步操作效率高
|存储到set集合中的对象应该重写hashCode和equals方法 |这个派系没有下标
|取出方式只能用迭代器不可以和List用for
|hashSet集合 |调用的是hashMap来实现的 |存储到HashSet中的对象,重写hashCode和equals两个方法 ***** | 重写hashCode方法的实现步骤 将对象中的引用变量取哈希值,基本数据类型直接相加或者相乘 |底层数据结构是二叉树,每一个分支只能分出两个 |覆盖接口中的抽象方法public intcomparaTo(){} |自定义比较器让TreeSet集合自己进行对象的比较并排序 |自定义比较器以后存储对象的自然顺序不在参考 public class TreeSetDemo{ TreeSet ts = new TreeSet(); ts.add(new Person("zhangsan",22)); ts.add(new Person("lisi",34)); Iterator it = new Iterator(); while(it.hasNext()){ syso(it.next()); }
} //定义比较器 class MyCompara implements Coparator{ public int compare(Object o1,Object o2){ Person p1 = (Person)o1; Person p2 = (Person)o2; int num = p1.getAge()-P2.getAge(); return num == 0?p1.getName().compareTo(p2.getName()):num; } } public class Person{ private String name; private int age; public int compareTo(Object o){
Person p = (Person)o; int num = this.name.compareTo(p.name); returen num ==0?this.age-p.age:num; }
public Person(String name,int age){ this.name = name; this.age = age; } public String getName(){ return String name; } public String setName(String name ){ this.name = name; } public String getAge(){ return String age; } public String setAge(String age ){ this.age = age; } public int hashCode(){ final ine X = 3; return this.name.hashCode()+age*X; } public boolean equals(Object o){ if (this == obj) return true; if( obj instanceof Person){ Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age ; } return false; } public String toString(){ return name +"..."+ age; }
}
5.Map集合 |将键映射到值
|每个键只能映射一个值
|keySet()开发中常用 import java.util.*; public class MapDemo{ main{ Map<String,Integer> map = new HashMap<String,Integer>(); map.put("qq",123); map.put("ww",456); map.put("ee",789); //用keySet()将,Map集合中的链存储到Set集合中 Set<String> set = map.keySet(); //用迭代器迭代set集合 Iterator<String> it = new Iterator(); while(it.hasNext()){ String key = it.next(); Interger value = map.get(key); syso(key+vaiue); } } } | Map集合中的常用方法 | get(K) 根据键获取对应的值,如果没有这个键,返回null | containsValue(V)判断集合中是否有这个值,有就返回true | keySet() 将集合中的键存储到Set集合 |底层数据结构是哈希表结构
|线程不安全,操作效率高 |案例,存储自定义对象并取出,需要实现2种方式 *****(见上)
7.输入任意字符串计算单个字符出现的次数 import java.util.*; publib class MapTest{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String str = sc.next(); //将字符串转成字符数组 char[] ch = str.ToCharArray(); //创建一个集合容器 TreeMap <Character,Integer> hm = new TreeMap<Character,Integer>(); //遍历数组 for(int x = 0;x<ch.length;x++){ Integer i = hm.get(ch[x]);//i有两种可能一种是null,一种是非null if(i==null){//键集合中没有把字符串作为建存到map集合中 hm.put(ch[x],1); }else if(i!=null){ i++; hm.put(ch[x],i); //迭代map集合 Set<Character>set = hm.keySet(); Iterator<Character>it = set.iterator(); while(it.hasNext()){
Character c = it.next(); Integer i = hm.get(c); syso(); } } } } }