面向对象的三大特征
概述
先来一张Java中的集合框架图
由上图可知,Java集合框架包含三大块内容:对外的接口、接口的实现、对集合运算的算法。总结成一个表格:
接口 | 是否唯一 | 是否有序 |
---|---|---|
List | 不唯一(重复) | 有序 |
Set | 唯一(不重复) | 无序 |
Map | key:唯一 value:不唯一 | key:无序 value:无序 |
List接口
List接口有两个实现,分别是:
ArrayList
特点:
存储方式与数组相同,允许重复、有序,但是数组的长度不可变,ArrayList集合长度可以改变,默认大小是10。优点:遍历元素和随机访问元素的效率比较高。
存储方式示意图:
0 | 1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|---|
aaa | bbb | ccc | ddd | eee | www | sss |
常用方法
方法名称 | 说明 |
---|---|
boolean add(Object o) | 在列表末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素,原索引位置及其后面的元素依次后移。注意:新添加元素的索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中元素个数 |
Object get(int idnex) | 返回指定索引位置处的元素 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remobe(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
LinkedList
特点:
采用链表存储方式。优点:插入、删除元素时效率较高。
存储方式示意图:
LinkedList集合中的每个元素是通过地址互相连接,比如:第2个元素的地址就在第一个数据中存储着,方便找到,惊醒插入、删除。
常用方法
方法名称 | 说明 |
---|---|
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表的第一个元素 |
Object getLast() | 返回列表的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
Map接口
HashMap集合
特点:
存储一组成对的键-值对象,可供key(键)到value(值)的映射。优点:查询指定元素效率高。
常用方法
方法名称 | 说明 |
---|---|
Object put(Object key,Object value) | 以“键-值”对的方式存储,注意:键必须唯一,值可以重复。如果试图添加重复的键,那么最后加入的“键-值对”将替换掉原先的“键值对” |
Object get(Object key) | 根据键返回相关联的值,若不存在指定的键,则返回null |
Object remove(Object key) | 根删除指定的键映射的“键-值对” |
int size() | 返回元素个数 |
Set keySet() | 返回键的集合 |
Collection values() | 返回值的集合 |
boolean containsKey(Object key) | 若存在指定的键映射的“键-值对”,则返回true |
boolean isEmpty() | 若不存在键-值映射关系,则返回true |
void clear() | 从此映射中删除所有映射关系 |
迭代器Iterator
所有集合接口和类都没有提供相应的遍历方法,而是把遍历交给迭代器Iterator完成。Iterator为集合而生,专门实现集合的遍历。Iterator有两个方法可以实现遍历:
1,boolean hasNext():判断是否存在另一个可访问的元素。
2,Object next():返回要访问的下一个元素。
来个小案例:
public abstract class Pet {
protected String name = "无名氏";
protected int health = 100;
protected int love = 0;
public Pet(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
/**
* 输出宠物信息
*/
public void print(){
System.out.println("宠物的自白:\n我的名字叫"+this.name+",健康值是"+this.health+
",和主人的其密度是"+this.love+"。");
}
/**
* 抽象方法eat(),负责宠物吃饭功能
*/
public abstract void eat();
}
public class Dog extends Pet{
public String strain;//品种
public Dog(String name,String strain){
super(name);
this.strain = strain;
}
/**
* 重写父类的print方法
*/
public void print(){
super.print();
System.out.println("我是一只:"+this.strain+"。");
}
/**
* 实现狗狗吃饭的方法
*/
public void eat(){
super.health +=3;
System.out.println("狗狗"+super.name+"吃饱了,健康值增加3。");
}
/**
* 实现飞盘功能
*/
public void catchingFlyDisc(){
System.out.println("狗狗"+super.name+"正在接飞盘");
super.health+=10;
super.love+=5;
}
}
public class Test5 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建4个狗狗对象
Dog ououDog = new Dog("偶偶", "雪瑞纳1");
Dog yayaDog = new Dog("丫丫", "雪瑞纳2");
Dog meimeiDog = new Dog("美美", "雪瑞纳3");
Dog feifeiDog = new Dog("菲菲", "雪瑞纳4");
//创建Map集合对象并把多个狗狗对象放入其中
Map dog = new HashMap();
dog.put(ououDog.getName(), ououDog);
dog.put(yayaDog.getName(), yayaDog);
dog.put(meimeiDog.getName(), meimeiDog);
dog.put(feifeiDog.getName(), feifeiDog);
//通过迭代器依次输入集合中所有狗狗的信息
Set keys = dog.keySet();//拿到集合中所有key的集合
Iterator iterator = keys.iterator();//获取Iterator对象
while (iterator.hasNext()) {//判断是否存在可访问的元素
String keyString = (String)iterator.next();//拿到迭代器中的key值
Dog dog2 = (Dog)dog.get(keyString);//根据key取出对应的值
System.out.println(keyString+"\t"+dog2.strain);
}
}
}
运行结果是:
丫丫 雪瑞纳2
偶偶 雪瑞纳1
菲菲 雪瑞纳4
美美 雪瑞纳3
Set接口
HashSet集合
特点:
优点:HashSet具有去重功能。
public class Demo01 {
/**
* Set集合 特点: 无序(没有下标)、集合中的元素不重复 hashset具有去重功能
*/
public static void main(String[] args) {
// 创建一个hashset 保存 f f a a b b d d
HashSet<String> set = new HashSet<>();
set.add("f");
set.add("f");
set.add("a");
set.add("a");
set.add("b");
set.add("b");
set.add("d");
set.add("d");
// 增强for循环
for (String string : set) {
System.out.println(string);// 打印结果 a b d f ,去重且无序(不是按照输出顺序打印)
}
}
}
a
b
d
f
集合和数组的区别
1.数组可以存储基本数据类型和对象,而集合中只能存储对象(可以以包装类形式存储基本数据类型)。
2. 数组长度固定,集合长度可以动态改变
3. 定义数组时必须指定数组元素类型,集合默认其中所有元素都是Object。
4. 不能直接获取数组中实际存储元素的个数,length用来获取数组的长度。集合可以通过size()获取集合中实际存储的元素个数。
5. 集合以借口和类的形式存在,就有封装、继承、多态等类的特性。