第十一章:集合
@集合:集合是java中提供的一种类型,用于存储管理对象
为什么不用数组?1,数组难以扩充 2,不好进行插入和删除
#集合实际上存储的是多个对象的引用(简化成了集合存对象)
#集合的分类:
1,List (有顺序,可重复)
2,set(无序,不可重复)
3,map(键值对key value 键不可重复)
@List接口
boolean add(Object o);
boolean isEmpty();
boolean remove(Object o);
void clear();
int size();
Iterator iterator();//遍历
Object get(int index);
int indexOf(Object o);
#ArrayList 是list接口的实现类(会增删改查就行)add,remove,set,get
String s1=new String("zhang");
List l=new ArrayList();//这里一般都要声明成接口类型,典型的多态,子类实现
l.add(s1),l.remove("l")
l.get("liu"),l.set(2,"zhang")
(student)l.get(0).getName() 这里一定要强转(这里我们知道l.get(0)获得对象就是student对象),因为get(0)返回Object类,父类不知道子类有什么方法
#,iterator遍历 (刚使用的是用get获得对象)
Iterator i=List.iterator(),//返回一个指针对象,指向第一个元素,这个对象调用next()方法,在没调用之前指向第一个元素之前,每调用一次向下走一格
public Object next(); //每当指针向下走一格时都要先调用HashNext方法,判断有没有下一个元素,这样完成对整个集合的遍历
public boolean HasNext();
#;注意:next()返回Object对象实际中药转换成不同对象,while(i.HashNext())//这步在Ide中会自动完成
#.list排序,对于字符串排序时 只需调用void Collection.sort(List)
但对于对象排序时(按对象的莫个属性排序)这时要实现Comparable接口
public int comparaTo(Object o){
if(this.age>o.age){return -1}
else if(this.age==u1.age){return 0}
else return 1;
}//这段代码直接写成Student s=(Student)0 return this.age-o.age 就行
#另一个实现类LinkedList 二者的实用方式上市没有任何区别,二者的区别是实现方式上
实现方式 特点
ArrayList 数组实现 增删慢,查询快
LinkedList 链表实现 增删快,查询慢
@,set接口
boolean add(Object o);
boolean isEmpty();
boolean remove(Object o);
void clear();
int size();
Iterator iterator();
1,HashSet无顺序,不可重复(有重复的打印不出来)
s1=new String("zhang1");
s2=new String("zhang2");
s3=new String("zhang3");
s4=new String("zhang 1");//打印出结果 只有一个zhang1
set s=new Hashset();
s.add(s1),s.add(s2),s.add(s3)
Iterator i=s.iterator();
while(i.hasNext()){ sysout(i.next())}//这时打印出来的不一定是加进去是的顺序了
hashSet在过滤重复对象时就需要看对象内容是否相等
#,HashSet怎样存储对象(object 中定义了public int hashCode)
1,调用HashCode()
2,当hashCode值满足条件时,再调用equals
#,treeSet
1,过滤重复是以ComparaTo方法中判断2个内容是否相等作为判断重复数据的依据
Student s=(Student)o;
if(this.age!=age) return this.age-s.age;
else return this.name.comparaTo(s.name);
#,Collection 接口 共性:往集合中加对象;add ,iterative,size()
@,java.util.Map接口
1,key不可重复,value可重复
put(Object key,Object value);
get(Object key);
remove(Object key)
clear();isEmpty();size();
#,map以一个键值对存储管理对象
1,HashMap常规使用
Map m=new HashMap();
m.put("key1","value1");
m.put("key2","value2");
m.put("key1","value3");//键不能重复,这里重复了
sysout(m.get("key1"))//打印出最后一个存入的value3
sysout(m.get("key8")) //打印出null
#,HashMap的key也是通过Hash算法过滤重复的
map的key一般都应用String
#,值遍历
collection c=m.values();
Iterator i=c.iterator()
while(i.hashNext()){
sysout(i.next())
}
#,键遍历
Set s=m.keySet()
#,键值遍历(先拿到键)
set s=m.keySet();
Iterator i=s.iterator();
while(i.hashNext()){
Object key=i.next();
sysout(key+""+m.get(key));
}
#,treeMap可以对key应用排序(只针对键,可排序,不可重复)
Map m=new TreeMap();重复的被过滤掉
1,TreeMap的key是通过comparable接口过滤重复排序
map的key一般都应用String多(内部已经实现了)
2.HashTable和HashMap的区别
HashMap 轻量级,速度快,线程不安全 | 允许null做键值
Hashtable 重量级,慢,安全 | null做键值会抛异常