若是一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个很是简单的程序。一般,程序老是根据运行时才知道的某些条件去建立新对象。在此以前,不会知道你所须要对象的数量,甚至不知道确切的类型。为了解决这个广泛的编程问题,须要在任意时刻和任意位置建立任意数量的对象。因此,就不能依靠建立命名的引用来持有每个对象,由于你不知道实际上会须要多少这样的引用java
——Thinking in Java面试
咱们来简单的解释一下:编程
首先要知道咱们所学习的Java语言是一个彻底面向对象的语言,而这种语言对事物的描述是经过对象体现的,为了方便对多个对象进行操做,咱们就必须把这多个对象进行存储。数组
一个基本类型的变量显然是没法知足存储多个对象的,因此应该是一个容器类型的变量,经过前面的知识,咱们知道数组和StringBuffe、StringBuilder均属于容器类型。可是呢? StringBuffer的结果是一个字符串,不必定知足咱们的要求,因此咱们只能选择数组,这就是对象数组。数据结构
但是问题又来了,对象数组又不能适应变化的需求,由于数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集合类供咱们使用。框架
A:长度区别学习
数组的长度固定ui
集合长度可变spa
B:内容不一样code
数组存储的是同一种类型的元素
而集合能够存储不一样类型的元素
C:元素的数据类型问题
数组能够存储基本数据类型,也能够存储引用数据类型
集合只能存储引用类型(装对象)
虽然数组看起来有一丝不太灵活,但数组也确实是保存一组对象的有效方法,若是想要保存一组基本数据类型,咱们也推荐使用这种方法,只是因为其长度固定,致使它在不少时候也受到一些限制。
补充:
在Java中,数组是一种效率最高的存储和随机访问对象的引用序列的方式。数组就是一个简单的线性序列,这使得元素访问很是快速。可是为这种速度所付出的代价是数组对象的大小被固定,而且在其生命周期中不可改变。你可能会建议使用ArrayList,它能够经过建立一个新实例,而后把旧实例中全部的引用到移到新实例中,从而实现更多空间的自动分配。尽管一般应该首选ArrayList而不是数组、可是这种弹性须要开销,所以,ArrayList的效率比数组低不少。——Thinking in Java 第16章
Java提供了不少种集合类,他们的数据结构是不一样的,可是,它们确定有一些共性的地方 (存储,获取,判断)一直向上追溯,咱们能够的获得这样继承体系
Collection : 是集合的顶层接口,它的子体系有重复的,有惟一的,有有序的,有无序的。
Collection c = new Collection(); //这是错误的 接口不能实例化
Collection的功能概述:
1:添加功能
//添加一个元素 Boolean add(Object obj) //添加一个集合的元素 Boolean addAll(Collection c)
2:删除功能
//移除全部元素 void clear() //移除一个元素 boolean remove(Object o) //移除一个集合的元素(有一个移除就返回true) Boolean removeAll(Collection c)
3:判断功能
//判断集合中是否包含指定的元素 Boolean contains(Object o) //判断集合中是否包含指定的集合元素(包含全部) Boolean containsAll(Collection c) //判断集合是否为空 Boolean isEmpty()
4:获取功能(重点)
Iterator<E> iterator()
5:长度功能
int size()
面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?
数组求长度用length属性 字符串求长度用length()方法 集合求长度用size()方法
6:交集功能
//两个集合A B ,A对B交集,最终的结果保存在A 中,B不变。返回值表示的是A是否发生过改变 boolean retainAll(Collection c)
7:把集合转换为数组
Object[] toArray()
import java.util.ArrayList; import java.util.Collection; public class Demo { public static void main(String[] args) { Collection c = new ArrayList(); c.add("I"); c.add("love"); c.add("you"); c.add("!"); Object[] objs = c.toArray(); for (int x = 0; x < objs.length; x++) { //System.out.println(objs[x]); //获得的元素是字符串,我在获取到元素的同时,若是还想知道元素的长度 //System.out.println(objs[x] + "---" + objs[x].length()); //上述代码实现不了是由于,Object中没有length()方法 //咱们想要使用字符串的方法,就必须把元素还原成字符串 //向下转型 String s = (String) objs[x]; System.out.println(s + "---" + s.length()); } } }
/* * Collection存储自定义对象并遍历案例 */ import java.util.ArrayList; import java.util.Collection; public class StudentDemo { public static void main(String[] args) { //建立集合对象 Collection c = new ArrayList(); //建立学生对象 Student s1 = new Student("admin", 10); Student s2 = new Student("张三", 20); Student s3 = new Student("李四", 30); Student s4 = new Student("王五", 40); //把学生添加到集合 c.add(s1); c.add(s2); c.add(s3); c.add(s4); //把集合转化为数组 Object[] objs = c.toArray(); //遍历数组 for (int x = 0; x < objs.length; x++) { //System.out.println(objs[x]); //获得的元素是字符串,我在获取到元素的同时,若是还想知道元素的长度 //System.out.println(objs[x] + "---" + objs[x].length()); //上述代码实现不了是由于,Object中没有length()方法 //咱们想要使用字符串的方法,就必须把元素还原成字符串 //向下转型 Student s = (Student) objs[x]; System.out.println(s.getName() + "-" + s.getAge()); } } }
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /* * Iterator iterator() 迭代器,集合的专用遍历方式 * Object next():获取元素 * oolean hasNext():若是仍有元素能够迭代,则返回 true。 */ public class IteratorDemo { public static void main(String[] args) { //建立集合对象 Collection c = new ArrayList(); c.add("I"); c.add("love"); c.add("you"); c.add("!"); //实际返回的确定是子类对象,这里是多态 Iterator it = c.iterator(); while (it.hasNext()) { String s = (String) it.next(); System.out.println(s); } } } //运行结果 I love you !
(1) 经过集合对象获取迭代器对象 —— Iterator it = c.iterator();
(2) 经过迭代器对象的hasNext()方法判断是否有元素 ——while
经过迭代器对象的next()方法获取元素而且移动到下一个位置
迭代器为何不定义成一个类,而是一个接口?
假设迭代器定义的是一个类,这样咱们就能够建立该类的对象,调用该类的方法来实现集合的遍历。可是呢?咱们想一想,Java中提供了不少的集合类,而这些集合类的数据结构是不一样的,因此存储的方式和遍历的方式应该是不一样的。进而它们的遍历方式也应该是不一样的,最终就没有定义迭代器类。
而不管你是哪一种集合,你都应该具有获取元素的操做,而且,最好再辅助于判断功能,这样在获取前,先判断,这样就更不容易出错。也就是说,判断功能和获取功能应该是一个集合遍历所具有的,而每种集合的方式又不太同样,因此咱们把这两个功能给提取出来,并不提供具体实现,这种方式就是接口。
那么,真正的具体实现类在哪里呢?
在真正的具体的子类中,之内部类的方式体现。
若是内容中有什么不足,或者错误的地方,欢迎你们给我留言提出意见, 蟹蟹你们 !^_^
若是能帮到你的话,那就来关注我吧!(系列文章均会在公众号第一时间更新)
在这里的咱们素不相识,却都在为了本身的梦而努力 ❤一个坚持推送原创Java技术的公众号:理想二旬不止