类集
- 类集就是一个动态的对象数组:可以改变大小
- JAVA类集接口框架:
1 Collection 元素的类集
2 List 元素的序列
3 Set 没有重复元素的类集
4 SortedSet 没有重复元素且排序的类集
5 Map 元素为二元偶对的汇集,不能重复
6 SortedMap 在Map基础上加上排序的要求
7 Iterator 一个可遍历总额类集的对象
8 ListIterator 可遍历一个序列的List的对象
- 以上这些全部是接口,我们只要掌握最核心的三个即可:
- Collection:存放的是一个一个的对象,每次存放当个对象s
- Map:每次存放一对值:Key----value
- Iterator:输出接口,只要是集合都要去使用iterator输出
- Collection接口:在一般开发中为了清楚的表现处理数据的存放往往不直接使用Collection接口
- 子接口:List
- 子接口:Set
- List既然是一个接口,则必然要使用必须依靠子类------ArrayList
使用方式:List m=new ArrayList();
- ArrayList类:
- 扩展AbstraList并执行List接口
- 是动态数组,采用异步处理方式
class Person
{
private String name ;
public Person(String name)
{
this.name = name ;
}
public String toString()
{
return "姓名:"+this.name ;
}
};
public class Demo01
{
public static void main(String args[])
{
// 准备好了一个对象数组容器
List all = new ArrayList() ;
// 向集合中加入数据
all.add("AAAA") ;
all.add("BBBB") ;
all.add(new Person("cccc")) ;
// 向第二个元素处加入新内容
all.add(1,"www.mldn.cn") ;
// all.remove(1) ;(删除元素)
for(int i=0;i<all.size();i++)
{
System.out.println(all.get(i)) ;
}
}
};
- 输出时原则上已经不用上述的做法,记住只要是集合就用Itreator输出
Iterator iter = all.iterator() ;//实例化方法
while(iter.hasNext())//判断是否还有数据
{
Object obj = iter.next() ;//对象都是object的子类向上转型输出即可
System.out.println(obj) ;
}
- 注意在上面我们可以网ArrayList中加入了两种对象,分别是 String和person对象,JDK1.5后提供了方法只能加入一种
List<java.lang.String> all = new ArrayList<java.lang.String>() ;
- HashSet类
- 扩展了AbstractSet并实现Set接口
- 使用散列表存储,无序列存储
- 使用基本和 ArrayList一样只是不同的是没有序列,不论怎样往里面存输出时随机无序的。
- Set<java.lang.String> all = new HashSet<java.lang.String>() ;
- ************************************************
- Set与list的区别:List中允许有重复的元素,并保留下来。Set中不允许,被替换掉
- *****************************************************
- HashSet是无序的,有序的用TreeSet,靠的是Comparable接口来排序
- TreeSet类:
- 与HashSet不同的是,TreeSet升序排列数据
- Set<java.lang.String> all = new TreeSet<java.lang.String>() ;
- HashMap类:
- 使用散列表实现Map接口
- 映射类:key---value
public static void main(String args[])
{
Map<java.lang.String,java.lang.String> m = new HashMap<java.lang.String,java.lang.String>() ;
m.put("张三","123456") ;
m.put("李四","654321") ;
m.put("王五","890762") ;
//存数据都是用put,去用get
// 已经准备好了一个电话本,在内存中保留下来
// 要查找张三的电话
System.out.println(m.get("赵六")) ;
}
- Map的主要功能是作为查询用,不是作为输出用
- Map接口对戏那个不能直接使用Iterator输出,如果非要用Iterator输出,必须使用以下的步骤
- Map---Set---Iterator---Map.Entry---key,values
public static void main(String args[])
{
Map<java.lang.String,java.lang.String> m = new HashMap<java.lang.String,java.lang.String>() ;
m.put("张三","123456") ;
m.put("李四","654321") ;
m.put("王五","890762") ;
Set all = m.entrySet() ;
Iterator iter = all.iterator() ;
while(iter.hasNext())
{
Map.Entry me = (Map.Entry)iter.next() ;
System.out.println(me.getKey()+" --> "+me.getValue()) ;
}
}
- TreeMap类
- 可以对数据进行排序,可以快速检索
- Map<java.lang.String,java.lang.String> m = new TreeMap<java.lang.String,java.lang.String>() ;
简单介绍下JDK以前用到的类:
- 枚举类Eumeration
- 可以对一个对象的类集中的元素进行枚举 boolean hasMoreelements() Object nextElement()
- 枚举类Eumeration与Iterator的功能一致,都是用于输出集合中的内容
- 两者对比下:
1 boolean hasMoreelements() Object nextElement()
2 hasNext() next()
- 发现用Iterator明显简单,且List和Set都不能使用Enumeration输出,而List另一个子类:Vector可以使用Eumeration输出
- Vector类
- 实现动态数组 是同步的
- 用法与ArrayList几乎是一样的
public static void main(String args[])
{
Vector v = new Vector() ;
v.add("A") ;
v.add("A") ;
v.add("A") ;
v.add("A") ;
v.add("A") ;
v.add("A") ;
Enumeration e = v.elements() ;
while(e.hasMoreElements())
{
System.out.println(e.nextElement()) ;
}
}
- Stack类:是vector的子类,后进先出标准的堆栈
public static void main(String args[])
{
Stack s = new Stack() ;
s.push("A") ;
s.push("B") ;
// System.out.println(s.empty()) ;
// 取值
while(!s.empty())
{
System.out.println(s.pop()) ;
}
// 如果内容已经全部弹出则再弹会出现错误
s.pop() ;
}
- HashTable和HashMap是相似的,但其是同步的,且不支持迭代函数
- Properties类:是HashTable的子类,用来保持值的列表
- 是属性类,与HashTable不同的是:
HashTable是主要来保存对象的,而Properties主要用来保存String的
setProperty(String key,String value)
总结:
- ArrayList与Vector
ArrayList Vector
异步 同步
只支持Iterator输出 支持Iterator和Enumeration输出
出现较晚 出现较早
- HashMap和HashTable
HashMap HashTable
异步 同步
不直接支持Iterator输出 不直接支持Iterator输出
出现较晚 出现较早
- 清楚:以下几点:
- 保存单个值的集合用Collectiion
1 -List:允许有重复元素
--ArrayList:异步处理,新出现的类,只能用Iterator输出
--Vector:同步处理,旧的类,能用Iterator和Enumeration类输出
2 -Set:不允许有重复的元素
--HashSet:散列无序
--TreeSet:有序,按Comparable排序
- 保存一对值(Map)
1 -HashMap:异步处理,新出的类
2 -HashTable:同步处理,旧的类
3 -TreeMap:按key进行排序
- 输出:
1 -Iterator:新的类方法名称较短
2 -Enumeration:旧的类,方法名称较长
应用:一------多 多------多
class Person
{
private String name ;
private int age ;
private List<Email> allEmails ;
public Person()
{
this.allEmails = new ArrayList<Email>() ;
}
public Person(String name,int age)
{
this() ;
this.setName(name) ;
this.setAge(age) ;
}
public List getAllEmails()
{
return this.allEmails ;
}
public void setAllEmails(List allEmails)
{
this.allEmails = allEmails ;
}
public void setName(String name)
{
this.name = name ;
}
public void setAge(int age)
{
this.age = age ;
}
public String getName()
{
return this.name ;
}
public int getAge()
{
return this.age ;
}
public String toString()
{
return "姓名:"+this.getName()+",年龄:"+this.getAge() ;
}
};
class Email
{
private String url ;
private String userName ;
private String flag ;
public Email(String url,String userName,String flag)
{
this.setUrl(url) ;
this.setUserName(userName) ;
this.setFlag(flag) ;
}
public void setUrl(String url)
{
this.url = url ;
}
public void setUserName(String userName)
{
this.userName = userName ;
}
public void setFlag(String flag)
{
this.flag = flag ;
}
public String getUrl()
{
return this.url ;
}
public String getUserName()
{
return this.userName ;
}
public String getFlag()
{
return this.flag ;
}
public String toString()
{
return "网站地址:"+this.getUrl()+",EMAIL名称:"+this.getUserName()+this.getFlag() ;
}
};
public class ColDemo01
{
public static void main(String args[])
{
Person p = new Person("LXH",28) ;
Email e1 = new Email("www.163.com","mldnqa","@163.com") ;
Email e2 = new Email("www.263.com","li_xing_hua","@263.net") ;
Email e3 = new Email("www.163.com","mldnkf","@163.com") ;
p.getAllEmails().add(e1) ;
p.getAllEmails().add(e2) ;
p.getAllEmails().add(e3) ;
// 一个人拥有3个email地址
// 通过输出体现
List<Email> all = p.getAllEmails() ;
Iterator iter = all.iterator() ;
System.out.println(p) ;
while(iter.hasNext())
{
Email e = (Email)iter.next() ;
System.out.println(" |- "+e) ;
}
}
};
class Student
{
private String name ;
private List allSubjects ;
public Student()
{
this.allSubjects = new ArrayList() ;
}
public Student(String name)
{
this() ;
this.setName(name) ;
}
public List getAllSubjects()
{
return this.allSubjects ;
}
public void setName(String name)
{
this.name = name ;
}
public String getName()
{
return this.name ;
}
public String toString()
{
return "学生姓名:"+this.getName() ;
}
};
class Subject
{
private String name ;
private List allStudents ;
public Subject()
{
this.allStudents = new ArrayList() ;
}
public Subject(String name)
{
this() ;
this.setName(name) ;
}
public List getAllStudents()
{
return this.allStudents ;
}
public void setName(String name)
{
this.name = name ;
}
public String getName()
{
return this.name ;
}
public String toString()
{
return "课程名称:"+this.getName() ;
}
};
public class ColDemo02
{
public static void main(String args[])
{
Student s1 = new Student("张三") ;
Student s2 = new Student("李四") ;
Student s3 = new Student("王五") ;
Student s4 = new Student("赵六") ;
Student s5 = new Student("孙七") ;
Subject su1 = new Subject("C++") ;
Subject su2 = new Subject("JAVA") ;
Subject su3 = new Subject("软件工程") ;
// 多个学生选择同一门课程
su1.getAllStudents().add(s1) ;
su1.getAllStudents().add(s2) ;
su1.getAllStudents().add(s3) ;
su2.getAllStudents().add(s2) ;
su2.getAllStudents().add(s4) ;
su3.getAllStudents().add(s5) ;
s1.getAllSubjects().add(su1) ;
s2.getAllSubjects().add(su1) ;
s2.getAllSubjects().add(su2) ;
s3.getAllSubjects().add(su1) ;
s4.getAllSubjects().add(su2) ;
s5.getAllSubjects().add(su3) ;
print(su1) ;
print(su2) ;
print(su3) ;
System.out.println("------------------------") ;
print(s1) ;
print(s2) ;
print(s3) ;
print(s4) ;
print(s5) ;
}
public static void print(Subject s)
{
System.out.println("* 课程信息:"+s) ;
Iterator iter = s.getAllStudents().iterator() ;
while(iter.hasNext())
{
System.out.println(" |- "+iter.next()) ;
}
}
public static void print(Student s)
{
System.out.println("* 学生信息:"+s) ;
Iterator iter = s.getAllSubjects().iterator() ;
while(iter.hasNext())
{
System.out.println(" |- "+iter.next()) ;
}
}
};
interface Book
{
// 书的价格、书的名字、书的信息
public float getPrice() ;
public String getName() ;
public String getInfo() ;
}
class ChildBook implements Book
{
private String name ;
private float price ;
private String info ;
public ChildBook(String name,float price,String info)
{
this.setName(name) ;
this.setPrice(price) ;
this.setInfo(info) ;
}
public String getName()
{
return this.name ;
}
public float getPrice()
{
return this.price ;
}
public String getInfo()
{
return this.info ;
}
public void setName(String name)
{
this.name = name ;
}
public void setPrice(float price)
{
this.price = price ;
}
public void setInfo(String info)
{
this.info = info ;
}
public String toString()
{
return "儿童书:书名:"+this.getName()+",价格:"+this.price+",简介:"+this.getInfo() ;
}
};
class ComputerBook implements Book
{
private String name ;
private float price ;
private String info ;
public ComputerBook(String name,float price,String info)
{
this.setName(name) ;
this.setPrice(price) ;
this.setInfo(info) ;
}
public String getName()
{
return this.name ;
}
public float getPrice()
{
return this.price ;
}
public String getInfo()
{
return this.info ;
}
public void setName(String name)
{
this.name = name ;
}
public void setPrice(float price)
{
this.price = price ;
}
public void setInfo(String info)
{
this.info = info ;
}
public String toString()
{
return "电脑书:书名:"+this.getName()+",价格:"+this.price+",简介:"+this.getInfo() ;
}
};
class BookShop
{
private String name ;
// 一个书店包含多种书
private List allBooks ;
public BookShop()
{
this.allBooks = new ArrayList() ;
}
public BookShop(String name)
{
this() ;
this.setName(name) ;
}
// 得到全部的书
public List getAllBooks()
{
return this.allBooks ;
}
public void append(Book book)
{
this.allBooks.add(book) ;
}
public void delete(Book book)
{
this.allBooks.remove(book) ;
}
// 根据书的名字,去找到一本书
public Book findByName(String name)
{
// 从已有的数据中进行依次查询
Book book = null ;
Iterator iter = this.allBooks.iterator() ;
while(iter.hasNext())
{
// 进行依次的比较
Book temp = (Book)iter.next() ;
if(name.equals(temp.getName()))
{
// 如果名字相等,则表示找到了
book = temp ;
break ;
}
}
return book ;
}
// 书的检索,书的模糊查询
public List index(String keyWord)
{
List l = new ArrayList() ;
Iterator iter = this.allBooks.iterator() ;
while(iter.hasNext())
{
Book b = (Book)iter.next() ;
//通过indexof可以查到与关键字的匹配
if(b.getName().indexOf(keyWord)!=-1)
{
l.add(b) ;
}
}
return l ;
}
public void setName(String name)
{
this.name = name ;
}
public String getName()
{
return this.name ;
}
};
public class ColDemo1
{
public static void main(String args[])
{
Book b1 = new ChildBook("一千零一夜",10.0f,"一些传说故事") ;
Book b2 = new ChildBook("小鸡吃大灰狼",20.0f,"一件奇怪的事情") ;
Book b3 = new ChildBook("HALIBOTE",25.0f,"魔幻故事") ;
Book b4 = new ComputerBook("JAVA",65.0f,"JAVA 语言的核心技术") ;
Book b5 = new ComputerBook("C++",50.0f,"C++ 语言的核心技术") ;
Book b6 = new ComputerBook("Linux",50.0f,"服务器搭建") ;
BookShop bs = new BookShop("MLDN 网上书店") ;
bs.append(b1) ;
bs.append(b2) ;
bs.append(b3) ;
bs.append(b4) ;
bs.append(b5) ;
bs.append(b6) ;
// print(bs.getAllBooks()) ;
// print(bs.index("A")) ;
// 假设将C++这本书从书店删除掉
Book b = bs.findByName("C++") ;
// System.out.println(b) ;
bs.delete(b) ;
print(bs.getAllBooks()) ;
}
public static void print(List all)
{
Iterator iter = all.iterator() ;
while(iter.hasNext())
{
Book b = (Book)iter.next() ;
System.out.println(b) ;
}
}
};