集合和数组的区别
数组的长度的是固定的,集合的长度是可以变化的
数组存储的是统一类型的元素, 可以存储基本数据类型值
集合只能存储引用类型元素,可以使多种类型元素
Collection 集合
Collection与Arraylist集合
集合存储的都是对象,而且对象的类型可以不一致
在开发中一般当对象多的时候,使用集合进行存储
集合只能存储引用类型元素可以是多种类型元素
ArrayList list= new ArrayList (); //多态 创建对象: 父类引用指向子类对象
list.特有方法();
Collection <String> coll=new ArrayList<>(): //多态调用方法
coll. 方法();
Collection 集合的常用功能
boolean add(E e): 添加元素
boolean remove(E e):删除元素
void clear ();清空集合
boolean contains(E e):是否包含元素
boolean isEmpty() 集合为空返回true
int size(): 获取元素长度
Object[] toAarray() 集合转数组
Object[ ] 变量名称 = 集合的变量名称 toArray();
Iterator <E> iterator() 获取迭代器对象
boolean hasNext(); 判断是否有下一个元素
E next(); 获取下一个元素
void remove(); 删除next 指向的元素
测试Collection 接口的方式
使用多态方式创建对象 Collection c =new ArrList();
编译看左边,这样只能调用Collection 接口中定义的方法,不会出现子类特有方法
Collection 例如
Collection coll=new ArrayList<>();
coll.add(123);
System.out.println(coll);
boolean a1=coll.remove(123);//格式:boolean 变量名称=集合变量名 需要删除、添加、判断等、方法();
System.out.println(coll);
Object arr=coll.toArray();//这是集合转换成为 数组的方法
for(int i=0;i<arr.length;i++){ //循环集合转换为数组的元素有多少,所以用到for,
System.out.println(arr[ i ]); // 这是转换好的数组元素
}
集合框架:
有很多集合和接口
Vector集合
Arraylis集合
LinkedLis 集合
TreeSet集合
HashSet集合
LinkedHashSe集合
学习集合的目标
1.会使用及和存储数据
2.会遍历集合 把数据取出来
3.掌握每种集合的特性
LIst接口 和set 区别是存取有序和无序
List接口
1.元素存取有序 可重复 有索引
2.有序的集合(存储和取出元素顺序相同)
3.允许存储重复的元素
4.有索引可以使用普通的for循环遍历
Set接口
元素存取无序 ,不可重复 无索引
不允许存储重复元素
没有索引(不能使用普通的for循环遍历)
Colleection接口
定义是所有单列集合共性的方法
所有的单列集合都可以使用共性的方法
迭代器 lterator接口
迭代器也是有泛型的
迭代器就是一个类的对象
迭代器就是有一种通用的取出方式
boolean hasNext() 如果有元素可以迭代 如果有 就返回true
迭代器的使用步骤
hasNex();t判断方法,判断是否有下一个元素
例如:boolean hasNex();
E next() ;如果有下一个元素的话就取下一个元素
void remove();删除next指向的元素
1.使用集合中的方法 Iteratr()获取迭代器的实现类对象,使用iteratar接口接收(多态)
使用迭代器的代码实现
知识点:
如何按照迭代器的步骤编写代码遍历集合
ArrayList< String > string=new ArrayList<>();
string.add(" abc ");
string.add("def");
Iterator<元素类型> 变量名称 = 集合对象.iterator();
while(iterator . hasNex){ //判断是否有下一个元素
元素类型 变量名称=iterator.next();//有下一个元素的话就去下一个元素
System.out.prinntln("") //打印输出集合变量名称
}
练习 :
/*需求:
通过多态方式创建Collection对象, 实现类是ArrayList
向集合中添加以下人名:
"姚明", "科比", "麦迪", "詹姆斯", "艾弗森"
获取集合的迭代器对象, 并遍历出元素, 打印出来*/9
public static void main (String [] args){
Collection<String> coll=new ArrayList();
coll.add("姚明");
coll.add("科比");
coll.add("詹姆斯");
Iterator<String> iterator=coll.iterator();
while (iterator.hasNext()){ //注意:这是在不知道情况下来判断是否有下一个元素,所以必须得用while循环 不能使用for 循环
String s=iterator.next();
System.out.println(s);
}
增强for
增强for, 普通for, 迭代器的区别:
增强for:
优点: 获取元素很方便, 格式简单
缺点: 没有普通for中的索引, 没有迭代器对象可以进行元素的增删
应用场景: 适用于遍历获取数组和集合元素的场景
格式:
增强for格式:也称foreach循环, JDK 5出现, 用于遍历集合, 底层采用迭代器
for(元素的数据类型 变量名: Collection集合或数组名){
// 操作代码
}
// 数组示例
int [ ] arr={1,2,3,};
for(int i :arr){
sout ( i );
}
//集合实例
Coolection <Integer> c=new Arraylist<>();
for( int i: c){
sout ( i );
}
普通for:
优点: 有索引可以使用, 某些方式可以在遍历过程中增删元素
缺点: 格式繁琐
应用场景: 需要用到索引的场景
迭代器:
优点: 可以使用迭代器对象的方法操作元素
缺点: 格式繁琐
应用场景: 需要在迭代过程中增删元素的场景
泛型:定义集合时,某些方法不知道使用什么类型时,就可以使用泛型
创建集合对象时,需要确定泛型具体的类型
泛型还可以看作是一个变量,用来接收数据类型
集合实际存储的是Object 类型 ,
存入的元素无论是什么类型,都会被提升称为Object ,取出来的也是Object,要想调用元素特有方法,就要向下转型,有可能发生类型转换异常 ClassCsatExceotion
/*
需求:
通过多态方式创建Collection对象, 实现类是ArrayList, 不加泛型
添加元素:
123, "你好", true
使用增强for循环遍历出元素并打印出来
*/
Collection coll=new ArrayList(); //这是个多态方式
coll.add(123) //添加元素
coll.add(你好)
coll.add(ture)
for( Object s : coll )//增强循环Objec是最大的 ,在不知道什么类型的情况下是Object 类型
sout ( s);
}
泛型的定义和使用 定义泛型<泛型名>
泛型 在定义时,不能是具体的类型 只是一个变量名
泛型在使用时,必须是具体的数据类型
修饰符 class 类名 <代表泛型的名字>{//泛型的变量一般用一个大写字母表示,但也可以是多个字母
}
类中泛型在创建对象时,确定反省的的具体类型
定义含有泛型的方法与使用
总结: 方法中的泛型定义位置
修饰符 和 返回值类型 之间
// 带有泛型的方法定义格式
修饰符 <代表泛型的名字> 返回值类型 方法名(参数){
}
方法中定义泛型后,返回值类型和参数类型都是可以使用泛型
定义与使用含有泛型的接口
知识点:
如何在接口中定义泛型
接口中的泛型何时确定具体类型
定义泛型接口与定义泛型一样
修饰符 interface 接口名 <代表泛型的变量>{
}
含有泛型接口,第一种使用方式,定义接口的实现类,实现接口,指定接口的泛型
public interface Iterator<E>{
E next();
}
泛型定义总结:
定义再类上的泛型:
有效范围:整个类中都有效
何时确定具体类型;创建该类对象时确定泛型的具体类型
定义在方法上的泛型
有效范围: 方法中(包括返回值类型和参数类型)有效
何时确定具体类型:调用方法传参时确定泛型的具体类型
定义在接口上的泛型:
有效范围: 接口中
何时确定具体类型:
1.子接口或实现类定义时确定泛型的具体类型
2,.创建实现类对象时确定泛型的具体类型性
|