java泛型基础入门.docx
- 文档编号:6799246
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:30
- 大小:104.07KB
java泛型基础入门.docx
《java泛型基础入门.docx》由会员分享,可在线阅读,更多相关《java泛型基础入门.docx(30页珍藏版)》请在冰豆网上搜索。
java泛型基础入门
packagecn.itcast.genrictiry;
importjava.util.ArrayList;
/*
泛型是jdk1.5使用的新特性。
泛型的好处:
1.将运行时的异常提前至了编译时。
2.避免了无谓的强制类型转换。
泛型在集合中的常见应用:
ArrayList
ArrayList
ArrayList
//以下两种写法主要是为了兼顾新老系统的兼用性问题。
*
ArrayList
ArrayListlist=newArrayList
注意:
泛型没有多态的概念,左右两边的数据类型必须要一致,或者只是写一边的泛型类型。
推荐使用:
两边都写泛型。
需求:
把一个集合中元素全部转成大写。
*/
publicclassDemo1{
publicstaticvoidmain(String[]args){
ArrayList
list.add("aa");
list.add("bb");
list.add("cc");
for(inti=0;i Stringstr=list.get(i); System.out.println("大写: "+str.toUpperCase()); } MyUtil.print(list); ArrayList } } packagecn.itcast.genrictiry; /* 需求: 定义一个方法可以接收任意类型的参数,而且返回值类型必须要与实参的类型一致。 自定义泛型: 自定义泛型就是一个数据类型的占位符或者是一个数据类型的变量。 方法上自定义泛型: 修饰符<声明自定义的泛型>返回值类型函数名(使用自定义泛型...){ } 在泛型中不能使用基本数据类型,如果需要使用基本数据类型,那么就使用基本数据类型对应的包装类型。 byte---->Byte short--->Short int---->Integer long---->Long double---->Double float----->Float boolean-----Boolean char-------》Character 方法泛型注意的事项: 1.在方法上自定义泛型,这个自定义泛型的具体数据类型是在调用该方法的时候传入实参时确定具体的数据类型的。 2.自定义泛型只要符合标识符的命名规则即可,但是自定义泛型我们一般都习惯使用一个大写字母表示。 TTypeEElement */ publicclassDemo2{ publicstaticvoidmain(String[]args){ Stringstr=getData("abc"); Integeri=getData(123); } publicstatic returno; } } packagecn.itcast.genrictiry; importjava.util.ArrayList; /* 需求: 编写一个数组的工具类 泛型类: 泛型类的定义格式: class类名<声明自定义泛型>{ } 泛型类要注意的事项: 1.在类上自定义泛型的具体数据类型是在使用该类的时候创建对象时候确定的。 2.如果一个类在类上已经声明了自定义泛型,如果使用该类创建对象的时候没有指定泛型的具体数据类型,那么默认为Object类型 3.在类上自定义泛型不能作用于静态的方法,如果静态的方法需要使用自定义泛型,那么需要在方法上自己声明使用。 */ classMyArrays //元素翻转 publicvoidreverse(T[]arr){ for(intstartIndex=0,endIndex=arr.length-1;startIndex Ttemp=arr[startIndex]; arr[startIndex]=arr[endIndex]; arr[endIndex]=temp; } } // publicStringtoString(T[]arr){ StringBuildersb=newStringBuilder(); for(inti=0;i if(i==0){ sb.append("["+arr[i]+","); }elseif(i==arr.length-1){ sb.append(arr[i]+"]"); }else{ sb.append(arr[i]+","); } } returnsb.toString(); } publicstatic } } publicclassDemo3{ publicstaticvoidmain(String[]args){ Integer[]arr={10,12,14,19}; MyArrays tool.reverse(arr); System.out.println("数组的元素: "+tool.toString(arr)); MyArrays String[]arr2={"aaa","bbb","ccc"}; tool2.reverse(arr2); ArrayList } } packagecn.itcast.genrictiry; /* 泛型接口 泛型接口的定义格式: interface接口名<声明自定义泛型>{ } 泛型接口要注意的事项: 1.接口上自定义的泛型的具体数据类型是在实现一个接口的时候指定的。 2.在接口上自定义的泛型如果在实现接口的时候没有指定具体的数据类型,那么默认为Object类型。 需求: 目前我实现一个接口的时候,我还不明确我目前要操作的数据类型,我要等待创建接口实现类对象的时候我才能指定泛型的具体数据类型。 如果要延长接口自定义泛型的具体数据类型,那么格式如下: 格式: publicclassDemo4 } */ interfaceDao publicvoidadd(Tt); } publicclassDemo4 publicstaticvoidmain(String[]args){ Demo4 } publicvoidadd(Tt){ } } packagecn.itcast.genrictiry; importjava.util.ArrayList; importjava.util.Collection; importjava.util.HashSet; /* 泛型的上下限: 需求1: 定义一个函数可以接收接收任意类型的集合对象,要求接收的集合对象只能存储Integer或者是Integer的父类类型数据。 需求2: 定义一个函数可以接收接收任意类型的集合对象,要求接收的集合对象只能存储Number或者是Number的子类类型数据。 泛型中通配符: ? ? superInteger: 只能存储Integer或者是Integer父类元素。 泛型的下限 ? extendsNumber: 只能存储Number或者是Number类型的子类数据。 泛型上限 */ publicclassDemo5{ publicstaticvoidmain(String[]args){ ArrayList ArrayList HashSet //getData(set); } //泛型的上限 publicstaticvoidgetData(Collection extendsNumber>c){ } //泛型的下限 publicstaticvoidprint(Collection superInteger>c){ } } packagecn.itcast.genrictiry; importjava.util.ArrayList; //是老程序员写的。 jdk1.4的时候写的。 publicclassMyUtil{ publicstaticArrayListgetList(){ returnnewArrayList(); } publicstaticvoidprint(ArrayListlist){ for(inti=0;i System.out.println(list.get(i)); } } } packagecn.itcast.list; importjava.util.Enumeration; importjava.util.Vector; /* 集合的体系: ------------|Collection单例集合的根接口 ----------------|List如果是实现了List接口的集合类,具备的特点: 有序,可重复。 -------------------|ArrayListArrayList底层是维护了一个Object数组实现的。 特点: 查询速度快,增删慢。 -------------------|LinkedListLinkedList底层是使用了链表数据结构实现的,特点: 查询速度慢,增删快。 -------------------|Vector(了解即可)底层也是维护了一个Object的数组实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低。 ----------------|Set如果是实现了Set接口的集合类,具备的特点: 无序,不可重复。 笔试题: 说出ArrayLsit与Vector的区别? 相同点: ArrayList与Vector底层都是使用了Object数组实现的。 不同点: 1.ArrayList是线程不同步的,操作效率高。 Vector是线程同步的,操作效率低。 2.ArrayList是JDK1.2出现,Vector是jdk1.0的时候出现的。 */ publicclassDemo1{ publicstaticvoidmain(String[]args){ Vectorv=newVector(); //添加元素 v.addElement("张三"); v.addElement("李四"); v.addElement("王五"); //迭代该集合 Enumeratione=v.elements();//获取迭代器 while(e.hasMoreElements()){ System.out.println(e.nextElement()); } } } packagecn.itcast.list; importjava.util.LinkedList; importjava.util.Random; /* 需求: 使用LinkedList存储一副扑克牌,然后实现洗牌功能。 */ //扑克类 classPoker{ Stringcolor;//花色 Stringnum;//点数 publicPoker(Stringcolor,Stringnum){ super(); this.color=color; this.num=num; } @Override publicStringtoString(){ return"{"+color+num+"}"; } } publicclassDemo2{ publicstaticvoidmain(String[]args){ LinkedListpokers=createPoker(); shufflePoker(pokers); showPoker(pokers); } //洗牌的功能 publicstaticvoidshufflePoker(LinkedListpokers){ //创建随机数对象 Randomrandom=newRandom(); for(inti=0;i<100;i++){ //随机产生两个索引值 intindex1=random.nextInt(pokers.size()); intindex2=random.nextInt(pokers.size()); //根据索引值取出两张牌,然后交换两张牌的顺序 Pokerpoker1=(Poker)pokers.get(index1); Pokerpoker2=(Poker)pokers.get(index2); pokers.set(index1,poker2); pokers.set(index2,poker1); } } //显示扑克牌 publicstaticvoidshowPoker(LinkedListpokers){ for(inti=0;i System.out.print(pokers.get(i)); //换行 if(i%10==9){ System.out.println(); } } } //生成扑克牌的方法 publicstaticLinkedListcreatePoker(){ //该集合用于存储扑克对象。 LinkedListlist=newLinkedList(); //定义数组存储所有的花色与点数 String[]colors={"黑桃","红桃","梅花","方块"}; String[]nums={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; for(inti=0;i for(intj=0;j list.add(newPoker(colors[j],nums[i])); } } returnlist; } } packagecn.itcast.list; importjava.util.LinkedList; classPerson{ Stringname; intage; publicPerson(Stringname,intage){ super(); this.name=name; this.age=age; } @Override publicStringtoString(){ return"{名字: "+this.name+"年龄: "+this.age+"}"; } } publicclassDemo3{ publicstaticvoidmain(String[]args){ LinkedListlist=newLinkedList(); list.add(newPerson("狗娃",7)); list.add(newPerson("狗剩",17)); list.add(newPerson("铁蛋",3)); list.add(newPerson("美美",30)); //编写一个函数根据人的年龄及逆行排序存储。 for(inti=0;i for(intj=i+1;j //符合条件交换位置 Personp1=(Person)list.get(i); Personp2=(Person)list.get(j); if(p1.age>p2.age){ //交换位置 list.set(i,p2); list.set(j,p1); } } } System.out.println(list); } } packagecn.itcastset; importjava.util.HashSet; importjava.util.Set; /* 集合的体系: ------------|Collection单例集合的根接口 ----------------|List如果是实现了List接口的集合类,具备的特点: 有序,可重复。 -------------------|ArrayListArrayList底层是维护了一个Object数组实现的。 特点: 查询速度快,增删慢。 -------------------|LinkedListLinkedList底层是使用了链表数据结构实现的,特点: 查询速度慢,增删快。 -------------------|Vector(了解即可)底层也是维护了一个Object的数组实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低。 ----------------|Set如果是实现了Set接口的集合类,具备的特点: 无序,不可重复。 无序: 添加元素的顺序与元素出来的顺序是不一致的。 */ publicclassDemo1{ publicstaticvoidmain(String[]args){ Setset=newHashSet(); set.add("王五"); set.add("张三"); set.add("李四"); System.out.println("添加成功吗? "+set.add("李四")); System.out.println(set); } } packagecn.itcastset; importjava.util.HashSet; importjavax.print.attribute.HashAttributeSet; /* 集合的体系: ------------|Collection单例集合的根接口 ----------------|List如果是实现了List接口的集合类,具备的特点: 有序,可重复。 -------------------|ArrayListArrayList底层是维护了一个Object数组实现的。 特点: 查询速度快,增删慢。 -------------------|LinkedListLinkedList底层是使用了链表数据结构实现的,特点: 查询速度慢,增删快。 -------------------|Vector(了解即可)底层也是维护了一个Object的数组实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低。 ----------------|Set如果是实现了Set接口的集合类,具备的特点: 无序,不可重复。 -------------------|HashSet底层是使用了哈希表来支持的,特点: 存取速度快. hashSet的实现原理: 往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值, 然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 基础 入门
![提示](https://static.bdocx.com/images/bang_tan.gif)