在c语言学习中,当我们遇到大量相同类型数据时,我们会定义该类型数组来存数这些数据,在java中,我们在面向对象编程中常常需要定义很多相同属性和方法的对象,那么这些对象存储在哪里,怎么存储才能使用户访问这些对象更加的快捷方便?对比c语言中数组java中集合具有相同的功能,但是集合具有动态存储的特点,可以更加灵活的存储、访问、调用对象。
在面向对象编程中,当存储的对象个数不确定时,以及存储的对象是复杂对象,具有映射关系时,我们就需要用集合存储。集合可以理解存放一组相同属性和方法的对象的容器。
集合框架概念:处理集合中元素提供一系列算法的机制。
集合框架满足的条件:
1.对外接口
2.具体实现类
3.算法
如上图我们通常使用的集合实现类有三个:ArrayList、LinkedList、HashMap
ArrayList:数组方式存储。 集合长度不定长,可动态存数数据,频繁循环遍历访问集合内元素时使用
LinkedList:链表方式存储。长度可动态改变,频繁插入集合内元素时使用
HashMap:采用键—值的存储方式,长度可动态改变
集合使用过程:
第1步:封装对象
第2步:声明对象
第3步:确定要使用的集合类型
第4步:声明集合
第5步:将声明的对象添加到集合中
第6步:调用集合内对象内属性
例如:根据图书编号查找书库中是否有这本书。
public class Book {
/*声明对象*/
private String name;
/*getter、setter方法*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/*构造方法*/
public Book(String name) {
super();
this.name = name;
}
/*String toString方法*/
@Override
public String toString() {
return name;
}
}
/**
* HashMap用法
*/
public static void main(String[] args) {
/*声明对象*/
Book c=new Book("c语言");
Book sql=new Book("SQl数据库");
Book java=new Book("java程序设计");
/*声明集合*/
Map a=new HashMap();
/*向集合中加入数据*/
a.put("001", c);
a.put("002", sql);
a.put("003",java);
/*打印集合长度*/
System.out.println("图书的数量是:"+a.size());
/*输出键集合*/
System.out.println(a.keySet());
/*输出值集合*/
System.out.println(a.values());
/*输出键集合和值集合*/
System.out.println(a);
System.out.println("------------------------------------------------------");
/*打印集合长度*/
System.out.println("图书的数量是:"+a.size());
System.out.print("请输入图书编号:");
Scanner input=new Scanner(System.in);
String id=input.next();
/*判断集合中是否有书本编号是001的书*/
if(a.containsKey(id)){
System.out.println(a.get(id));
}
else{
System.out.println("对不起,没有这本书的编号");
}
}
}
注意点:1. 集合本身给我们提供了getSize()、get()等方法调用集合内对象属性,但是任何对象在加入集合类后,自动转为objec类型,取出时要进行强制类型转换,恢复特定的类型
2.LinkedList提供给我们getFirst()、getLast()、addFirst()、addLast()、removeFirst()、removeLast()六个特有的方法,所以在声明LinkedList集合时,要采用LinkedList 对象名=new LinkedList(); 的方式声明,不能以List 对象名=new LinkedList();的方式出现,否则LinkedList()以List的身份出现LinkedList()本身所带的特有属性将会丢失。(子类以父类的身份出现时子类本身特有的方法将丢失)
3.在LinkedList()集合中,指定索引位置插入元素时,原来索引位置元素数据不会被覆盖,将会被应用到下一个索引位置存储。