网站 内容 制作,秦皇岛网络优化招聘,做企业商城网站要多少钱,招标网招标信息学习目标#xff1a;会存取#xff0c;掌握特性 学习方式#xff1a;学习顶层接口/抽象类的共性方法#xff0c;使用底层的子类创建对象使用 1 集合框架
集合类的继承体系#xff1a; Collection接口#xff1a; 1) List接口#xff1a;有序、允许重复、有索引 1.1) Ar… 学习目标会存取掌握特性 学习方式学习顶层接口/抽象类的共性方法使用底层的子类创建对象使用 1 集合框架
集合类的继承体系 Collection接口 ·············1) List接口有序、允许重复、有索引 ··························1.1) ArrayList集合【重点】 ··························1.2) Vector集合【了解】 ··························1.3) LinkedList集合【熟悉】 ·············2) Set接口不重复、无索引 ··························2.1) TreeSet集合无序存取顺序可能不一致【了解】 ··························2.2) HashSet集合无序【重点】 ·······································2.2.1) LinkedHashSet集合无序【熟悉】
集合特点List有索引可以存储重复元素可以保证存取顺序ArrayList底层是数组实现的查询快增删慢LinkedList底层是链表实现的查询慢增删快Set无索引不可以存储重复元素存取无序HashSet底层是哈希表红黑树实现无索引不可以存重复元素存取无序LinkedHashSet底层是哈希表链表实现无索引不可以存重复元素可以保证存取顺序TreeSet底层是二叉树实现一般用于排序
2 Collection集合常用功能
Collection是单列结合最顶层的接口定义了单列集合共性方法任意单列集合都可以使用 java.util.Collection1. add(e); 2. remove(e); 3. inEmpty(); 4. clear(); 5. contains(e); 6. toArray(); 7. size()
public static void main(String[] args) {CollectionString coll new ArrayList();//add添加元素coll.add(a);coll.add(b);coll.add(c);System.out.println(coll);//[a,b,c]//remove删除元素boolean result coll.remove(a);System.out.println(result);//删除结果trueSystem.out.println(coll);//[b,c]//clear清空集合coll.clear();System.out.println(coll);//contains是否包含coll.add(b);boolean result2 coll.contains(a);System.out.println(result2);//flaseboolean result3 coll.contains(b);System.out.println(result3);//true//isEmpty判断集合是否为空System.out.println(coll.isEmpty());//false//size获取集合长度System.out.println(coll.size());//1//toArray集合---数组 遍历集合元素Object[] arr coll.toArray();for (int i 0; i arr.length; i) {System.out.println(arr[i]);//打印Object对象 因为重写了toString 所以显示的是值而不是地址}
}3 Iterator迭代器
常用方法1. hasNext()、2. next() Iterator迭代器是一个接口无法直接使用需要使用Iterator接口的实现类对象 Collection中有一个iterator()方法返回的是迭代器的实现类对象list和set 通用无需索引。 【重点】使用方式
使用iterator()方法获取实现类对象使用Iterator接口接收多态使用hasNext判断是否还有下一个使用next取出下一个元素
实现原理iterator()获取迭代器的实现类对象会把指针索引指向集合-1索引处。hasNext()判断是否有下一个。next取出一个元素后会把指针向后移动一位。
实现示例
public static void main(String[] args) {CollectionString coll new ArrayList();coll.add(a);coll.add(b);coll.add(c);coll.add(d);coll.add(e);//迭代器有泛型 跟着集合走//多态 接口 实现类对象IteratorString it coll.iterator();while(it.hasNext()){System.out.println(it.next());}} public static void main(String[] args) {CollectionString coll new ArrayList();coll.add(a);coll.add(b);coll.add(c);//迭代器有泛型 跟着集合走//多态 接口 实现类对象IteratorString it coll.iterator();//常用while循环while(it.hasNext()){String e it.next();System.out.println(e);}//一个迭代器只能取一次 再取要创建新的迭代器 否则会报NoSuchElement异常for( IteratorString it2 coll.iterator();it2.hasNext();){String e it2.next();System.out.println(e);}//foreach语句 增强for循环JDK1.5开始出现 //专门用来遍历数组和结合 //底层使用的也是迭代器遍历过程中只能遍历不能增删for(Object o : coll){System.out.println(o);}}4 泛型的概念
概念 泛型是一种未知的数据类型当不知道使用什么数据类型的时候可以使用泛型 泛型也可以看成是一个变量用来接收数据类型 ArrayListEE表示未知类型在创建集合对象时确定泛型的数据类型 不使用泛型的好处使用泛型默认类型时Object类型可以存储任意类型的数据 不适用泛型的弊端不安全会引发异常
public static void main(String[] args) {Collection ArrayList new ArrayList();//以Object类型存入任意类型的数据ArrayList.add(a);ArrayList.add(1);Iterator it ArrayList.iterator();while(it.hasNext()){//取出也是Object类型System.out.println(it.next());//引发异常举例//想要使用String类特有的方法不能使用//多态Object obj a不能使用子类特有的方法//除非向下转型(String)aObject o it.next();//当o1时java.lang.ClassCastException:String s (String) o;System.out.println(s.length());}}使用泛型的好处避免了类型转换的麻烦把运行期异常提升到了编译期IDE会报错 使用泛型的弊端只能存储泛型定义的类型
5 泛型的定义和使用
5.1 定义和使用泛型类
泛型类
package Collection;public class GenericClassE {private E name;public E getName() {return name;}public void setName(E name) {this.name name;}
}泛型测试类
package Collection;public class GenericClassTest {public static void main(String[] args) {GenericClassString gcs new GenericClass();gcs.setName(张三);System.out.println(gcs.getName());GenericClassInteger gci new GenericClass();gci.setName(1);System.out.println(gci.getName());}
}5.2 定义和使用泛型的方法
泛型定义在方法修饰符和返回值类型之间 在调用方法时确定泛型的数据类型传递什么类型的参数泛型就是什么类型 修饰符 泛型 返回值类型 方法名参数表使用泛型 定义类和方法
public class GenericMethod {//成员方法public M void method(M m){System.out.println(m);}//静态方法public static M void methodStatic(M m){System.out.println(m);}
}测试类调用
public class GenericMethodTest {public static void main(String[] args) {//创建对象GenericMethod gm new GenericMethod();gm.method(10);gm.method(abc);gm.method(9.99);GenericMethod.methodStatic(5);GenericMethod.methodStatic(zxc);}
}5.3 定义和使用泛型接口
方法1使用实现类指定接口的泛型
定义接口
public interface GenericInterfaceI {public abstract void method(I i);
}定义实现类【指定泛型类型】
public class GenericInterfaceImpl implements GenericInterfaceString {Overridepublic void method(String s) {System.out.println(s);}
}定义测试类
public class GenericInterfaceTest {public static void main(String[] args) {GenericInterfaceImpl gi new GenericInterfaceImpl();gi.method(abc);}
}方法2接口使用什么泛型实现类就用什么泛型
定义接口
public interface GenericInterfaceI {public abstract void method(I i);
}定义实现类【不指定泛型类型】
public class GenericInplementImpl2I implements GenericInterfaceI{Overridepublic void method(I i) {System.out.println(i);}
}定义测试类【创建对象时指定泛型类型】
public class GenericInterfaceTest {public static void main(String[] args) {GenericInplementImpl2Integer gi2 new GenericInplementImpl2();gi2.method(123);}
}5.3 泛型通配符
不知道使用什么类型来接收数据的时候可以使用?表示未知通配符 此时只能接收数据不能往集合中存储数据 定义的时候不能用 只有参数传递的时候可以用
import java.util.ArrayList;
import java.util.Iterator;public class Generic {//定义一个方法可以遍历有所ArrayList集合//不知道集合的数据类型可以使用泛型来接受数据类型//注意泛型没有继承概念所以不能用Object
// 错误写法
// public static void printArray(ArrayListObject list){
//
// }
// 正确写法public static void printArray(ArrayList? list){Iterator? it list.iterator();while(it.hasNext()){//it.next()取出的时Object类型Object obj it.next();System.out.print(obj );}System.out.println();}public static void main(String[] args) {ArrayListInteger list1 new ArrayList();list1.add(1);list1.add(2);ArrayListString list2 new ArrayList();list2.add(a);list2.add(b);// IntegerprintArray(list1);//? StringprintArray(list2);}
}泛型通配符的高级使用——受限泛型【看源码的时候可能会用】 泛型的上限限定? extends E 表示使用的泛型只能是E的子类/本身 泛型的下限限定? super E 表示使用的泛型只能时E的父类/本身
import java.util.ArrayList;
import java.util.Collection;public class GenericUpDown {//上限限定只能是子类/本身public static void getElementUp(Collection? extends Number coll){}//下限限定只能是父类/本身public static void getElementDown(Collection? super Number coll){}public static void main(String[] args) {// 继承关系// int extends num extends obj// str extends objCollectionInteger intList new ArrayList();CollectionString strList new ArrayList();CollectionNumber numList new ArrayList();CollectionObject objList new ArrayList();getElementUp(intList);
// getElementDown(intList); // 报错 int是num的子类// getElementUp(strList); // 报错 str和num没关系
// getElementDown(strList); // 报错 str和num没关系getElementUp(numList);getElementDown(numList);
// getElementUp(objList); // 报错 obj是num的父类getElementDown(objList);}
}案例斗地主-1
package DouDiZhu;import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;public class DouDiZhu {public static void main(String[] args) {//1. 准备牌面ArrayListString all new ArrayList();all.add(BK);all.add(SK);String[] colors {♥,♠,♦,♣};String[] nums {A,K,Q,J,10,9,8,7,6,5,4,3,2};for(String num: nums){for(String color: colors){all.add(colornum);}}//2. 洗牌Collections.shuffle(all);//打乱顺序ArrayListString left new ArrayList();ArrayListString p1 new ArrayList();ArrayListString p2 new ArrayList();ArrayListString p3 new ArrayList();for (int i 0; i all.size(); i) {String p all.get(i);if(i51){left.add(p);}else{if(i%3 0){p1.add(p);}else if(i%3 1){p2.add(p);}else{p3.add(p);}}}//3. 看牌System.out.println(p1);System.out.println(p2);System.out.println(p3);System.out.println(left);}
}