18泛型File类.docx
- 文档编号:4415445
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:26
- 大小:304.24KB
18泛型File类.docx
《18泛型File类.docx》由会员分享,可在线阅读,更多相关《18泛型File类.docx(26页珍藏版)》请在冰豆网上搜索。
18泛型File类
泛型、File类
1.集合总结
集合:
Collection体系、Map体系。
Collection体系:
单列集合的共性操作规则。
List:
列表,可以重复,有下标,拥有特有的迭代器ListIterator。
ArrayList:
底层是可变数组。
增删慢,查询快。
不安全
LinkedList:
底层是链表结构,增删快,查询慢。
不安全。
有头和尾,特有的头尾操作的方法。
可以模
拟数据结构(堆栈、队列)。
Vector:
底层是可变数组,增删,查询都慢。
安全。
被ArrayList代替。
Enumeration:
它是古老的迭代器,被Iterator代替。
Set:
不能存放重复元素。
HashSet:
底层是哈希表。
不保证存取的顺序。
保证对象唯一需要依赖对象的hashCode和equals方法。
因此给HashSet中存放的对象需要重写Object类中的hashCode和equals方法。
TreeSet:
底层是二叉树结构。
保证对象唯一和排序需要依赖对象的比较方法(compareTo),对象要具
备比较方法,需要实现Comparable接口。
如果对象具备的比较功能不适合需求,或者对象本身不具备比较功能,这时我们可以自己指定比较器对象(Comparator)。
然后将这个对象传递给TreeSet集合。
LinkedHashSet:
它是HashSet的子类,底层是哈希表和链表组合。
它可以保证存取的顺序。
Map体系:
双列集合的共性操作规则。
存放的是具有一定对应关系的数据。
key值是不能重复的。
HashMap:
底层是哈希表,不保证存取顺序。
主要作用在key上。
key是自定义对象,需要复写hashCode
和equals方法。
TreeMap:
底层是二叉树,作用在key上。
key是自定义对象,需要实现Comparable接口,或者给集合
传递Comparator对象。
Hashtable:
它底层是哈希表,安全。
被HashMap代替。
LinkedHashMap:
它是HashMap的子类,可以保证存取的顺序。
底层链表和哈希表。
Map集合的遍历,不能直接使用Iterator,而需要将Map集合转成单列集合。
keySet方法,将Map中的所有key取出存放在Set集合中。
遍历Set集合,得到每个key值,然后调用Map中的get方法,进而获取到key对应的value值。
entrySet方法。
将Map中的key和value组成Entry对象(key和value对应关系对象)。
存储在set中,遍历set集合,得到Entry对象,然后调用getKey和getValue方法得到key和value。
values方法:
获取到的是Map中的所有value值,存放在Collection集合中。
可以存放重复元素:
ArrayList:
主要用在查询较多的时候。
LinkedList:
主要是根据头尾操作时。
Vector:
基本不用
不可以出现重复元素:
HashSet:
对数据的存取顺序没有要求
LinkedHashSet:
保证存取顺序
TreeSet:
对其中的数据排序
数据具有对应关系:
HashMap:
对数据的存取顺序没有要求
TreeMap:
对其中的数据排序
Hashtable:
基本不用
LinkedHashMap:
保证存取顺序
2.泛型技术
2.1.泛型的引入
在使用集合的时候,由于集合中存放的元素没有做任何的限制,因此可以将任何对象保存到集合中。
这样会导致在从集合中取出对象的时候,对象都被提升为Object类型,如果需要使用对象的特有方法,这时需要向下转型,就有可能发生类型转换异常。
集合是容器,数组也是容器,但是数组容器一旦定义完成之后,其中能够存放的数据类型就一定确定,如果在给数组中存放元素的时候,类型和数组限定的类型不匹配,这时编译就直接报错。
上述集合和数组的差异,是因为集合中的元素没有进行类型的限定。
我们可以想办法给集合中能够存储的元素进行类型的限定,这样如果在给集合中存储元素的时候,类型与限定的类型不一致,就不让程序编译通过。
只要程序能够编译通过,肯定集合中保存的类型是限定的类型。
这样在取出的时候,我们肯定知道取出的元素是什么类型。
解决上述的问题,需要使用JDK中提供的泛型技术。
泛型其实是在限定数据类型的。
2.2.泛型技术介绍
泛型的书写格式:
<引用数据类型>
泛型在使用的时候,主要是限定数据类型,程序中加入泛型之后,操作数据的时候,类型一定要和泛型中指定的类型一致。
泛型中不能书写基本数据类型(使用对应的包装类型)。
2.3.泛型技术的简单应用
/*
*泛型技术演示
*/
//自定义比较器
classMyComparatorimplementsComparator
publicintcompare(Stringo1,Stringo2){
inttemp=o1.length()-o2.length();
returntemp==0?
pareTo(o2):
temp;
}
}
publicclassGeneratorDemo{
publicstaticvoidmain(String[]args){
//演示泛型在集合中的使用泛型的菱形技术
TreeSet
set.add("aaaaa");
set.add("aba");
set.add("cb");
set.add("ABC");
set.add("CCB");
set.add("ICBC");
//遍历
for(Iterator
//Strings=it.next();
System.out.println(it.next());
}
}
}
1、泛型的菱形技术:
在定义类型的时候声明的泛型的类型,后面创建对象时需要指定的泛型类型可以省略。
2、泛型的擦除技术:
泛型技术属于编译时期的技术。
当前程序编译完成之后,泛型全部被删除。
2.4.自定义泛型
2.4.1.泛型类
泛型技术在程序能够使用,原因是在使用的类或者接口上提供书写泛型的地方。
如果类或者接口上没有提供书写泛型的地方,在实际代码中我们也不能书写。
我们自己来模拟JDK中可以书写泛型的类或者接口。
我们自己定义类或者接口的时候,声明<变量>泛型,当在使用这个类或者接口的时候就可以指定具体的类型。
/*
*自定义泛型类:
*定义的类上声明泛型。
*/
/*
*需求:
定义类,封装任意类型的数据
*分析:
*可以在类中定义Object类型的变量,接收任意类型的数据
*但是给调用者返回这个数据的时候,数据就被提升成Object类型
*调用者需要自己手动的再向下转型。
*
*我们可以在定义类的时候,在类上定义泛型,让调用者自己类声明保存的数据类型。
*
*classData
在定义类的时候,在类上定义一个泛型参数。
*当使用者使用这类的时候,会指定当前这个参数的类型。
*例如:
Data
*我们定义的类上的泛型T就被String代替。
*
*在类上定义的泛型参数,其实就是一个数据类型,只是还没有被使用的时候
*我们不知道是什么类型,但是调用者只要创建对象,就会明确这个类型,
*只要程序在运行,泛型类型肯定就已经明确。
*因此在类上定义的泛型参数,在类中的任意地方都可以使用。
*/
classData
privateTdata;
publicTgetData(){
returndata;
}
publicvoidsetData(Tdata){
this.data=data;
}
}
publicclassDemo2{
publicstaticvoidmain(String[]args){
Data
d.setData(123);
}
}
总结:
泛型类:
在定义类的时候,定义泛型参数。
在类上定义的泛型参数,在类中可以使用。
类上定义的泛型参数,需要在创建这个类对象的时候明确,如果没有明确这个类型,默认是Object
类型。
2.4.2.非静态方法泛型
方法的定义格式:
修饰符返回值类型方法名(参数类型变量名,参数类型变量名......){
方法体
}
方法上定义的泛型格式:
修饰符<泛型参数>返回值类型方法名(参数类型变量名,参数类型变量名......){
方法体
}
/*
*泛型方法:
*类上可以定义泛型,在类中是能够直接使用类上定义的泛型。
*
*在类中也可以不使用类上的泛型。
*/
//类上定义泛型
classTest2
//在方法上使用泛型
publicvoidshow(Ww){
System.out.println(w);
}
//方法上也可以不使用类上的泛型
publicvoidmethod(inta){
}
/*
*如果方法上接收的参数类型也不确定,但是我们知道方法上
*接收的参数类型和类上定义的泛型的类型不一致,
*这时可以在方法上单独去定义适合这个方法自己的泛型
*
*/
publicvoidfunction(Qq){
System.out.println(q);
}
}
publicclassDemo3{
publicstaticvoidmain(String[]args){
Test2
//使用拥有泛型的方法
t.function('a');
}
}
总结:
泛型方法:
1、方法上使用的泛型类型和类上不一致的时候,在方法上单独定义泛型。
2、方法上定义的泛型一定要书写在返回值类型的前面。
3、方法上定义的泛型是在方法被调用的时候,传递的数据类型决定方法上的泛型类型。
2.4.3.静态方法定义泛型
静态方法不能使用类上定义的泛型。
因为类上的泛型类型需要在创建这个类的对象时明确。
而静态方法运行时候可以没有对象。
2.4.4.泛型接口
在定义接口的时候,可以在接口上定义泛型参数。
/*
*演示接口上定义泛型
*/
//在接口上定义了泛型参数
interfaceInter
{
publicvoidshow(Pp);
}
/*
*接口的实现类,在实现接口的时候,明确接口上泛型的具体数据类型
*/
classInterImplimplementsInter
publicvoidshow(Stringp){
}
}
接口上的泛型:
在实现接口的时候明确具体的数据类型。
2.4.5.泛型传递
interfaceCollection
interfaceList
classArrayList
开发者自己的类:
ArrayList
2.5.泛型通配符
/*
*演示泛型的通配符技术:
*通配符:
统统都匹配的符号。
使用一个符号去匹配其他的数据。
这个符号被称为通配符
*
*泛型的通配符符号:
?
号;当接收的数据的时候,如果需要使用泛型,却不知道当前应该
*书写什么数据类型的时候,这时可以使用?
表示。
*/
publicclassGenericTest{
publicstaticvoidmain(String[]args){
List
Collections.addAll(list,"aa","bb","cc","dd");
printCollection(list);
Set
Collections.addAll(set,11,22,33,44,55,66,77);
//打印集合
printCollection(set);
}
//泛型的通配符
publicstaticvoidprintCollection(Collection
>list){
//打印集合
for(Iteratorit=list.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
2.6.泛型上下限
/*
*演示泛型的通配符技术:
*通配符:
统统都匹配的符号。
使用一个符号去匹配其他的数据。
这个符号被称为通配符
*
*泛型的通配符符号:
?
号;当接收的数据的时候,如果需要使用泛型,却不知道当前应该
*书写什么数据类型的时候,这时可以使用?
表示。
*/
publicclassGenericTest2{
publicstaticvoidmain(String[]args){
List
list.add(newTeacher("老唐",18));
list.add(newTeacher("老张",28));
list.add(newTeacher("花和尚",38));
list.add(newTeacher("圣手书生",28));
//printCollection(list);
Set
set.add(newStudent("班长",38));
set.add(newStudent("班花",18));
set.add(newStudent("班草",28));
set.add(newStudent("班导",48));
printCollection(set);
Set
set2.add(newPerson("班长",38));
set2.add(newPerson("班花",18));
set2.add(newPerson("班草",28));
set2.add(newPerson("班导",48));
printCollection(set2);
}
/*printCollection(Collection
>coll)这个方法可以接收任何的Collection下的集合容器
*并且可以将其中的说打印出来。
*
*printCollection只打印集合中保存的数据是Person或者Person的子类数据
*如果传递的集合中给出的数据不是Person或者Person的子类,就不接受这样的数据。
*
*泛型的限定:
*上限限定:
?
extendsE当前的?
表示的数据类型可以是E类型,也可以是E的子类类型
*例如:
?
extendsPerson当前的?
可以是Person类型或者Person的子类类型
*
*下限限定:
?
superE当前的?
表示的数据类型可以是E本身类型,或者E的父类类型
*例如:
?
superStudent当前的?
可以是Student类型或者Student的父类类型,
*但不能是Student的子类或者兄弟类型
*
*TreeSet(Comparator
superE>comparator)
*TreeSet(Collection
extendsE>c)
*
*publicstatic superT>>Tmax(Collection extendsT>coll) */ publicstaticvoidprintCollection(Collection superStudent>coll){ for(Iteratorit=coll.iterator();it.hasNext();){ System.out.println(it.next()); } } } 2.7.解释API中泛型的限定 classTreeSet publicTreeSet(Collection exntendsE>c){ } } 当在程序中我们创建TreeSet集合对象的时候,需要明确TreeSet上定义的泛型的具体类型。 如果已经明确的了具体的类型,那么构造方法上使用的E,就可以明确的类型一致。 创建TreeSet对象: TreeSet 就意味着TreeSet集合中所有使用E的地方都会变成Person类型。 构造方法上的Collection extendsPerson>,限定当前可以给集合中保存的数据是Person或者Person的子类。 上面是TreeSet的构造方法,它的目的是在创建TreeSet集合对象的时候,将Collection集合中的数据添加到TreeSet集合中。 而创建TreeSet集合时我们设定集合中添加的数据类型应该Person类型,那么就说明Collection中的元素能够添加到TreeSet中,Collection中的数据要么是Person类型,要么是Person子类类型。 创建TreeSet对象的时候,会明确E的类型,同时还可以给TreeSet传递一个比较器对象。 传递的比较器是用来比较正要给集合中保存的数据和已经在集合中的数据的大小。 TreeSet set.add(newStudent(“zs”,23)); set.add(newStudent(“ls”,33)); 相当于要把第二个Student和第一个Student对象传递给Comparator中的compare方法进行比较大小。 compare方法需要接收当前这两个Student对象。 publicintcompare(Persono1,Persono2){ } Comparator接口中的compare方法主要任务的接收给集合中存储的元素和已经在集合中的元素数据,然后对其进行比较。 compare方法上负责接收2个对象的那个类型可以和集合中的数据类型一致,或者是集合中数据类型的父类型也可以。 因此得出: TreeSet构造方法上传递的Comparator接口可以接收的数据类型可以和集合一致,或者集合中的数据类型的父类类型。 3.IO技术 3.1.IO介绍 我们的数据全部存储在计算机的内存中。 当程序运行结束之后,数据就全部消失。 下次程序启动的时候,如果需要上次运行的结果数据,这时是无法获取到的。 我们需要在程序中加入其它的技术,将程序中的有效的数据长久的保存起来,以后程序启动的时候可以读取这些数据,接着进行处理。 需要将数据长久保存,就需要使用Java中提供的IO技术。 IO技术: I: Input输入,读取操作 O: Output输出,写操作。 数据从其他的设备上被加载到内存中的这个过程被称为输入(读取)操作。 数据从内存中输出到其他的设备上的这个过程被称为输出(写)操作。 3.2.IO学习路线 1、学习如何操作硬盘上的文件或者文件夹 2、学习如何读写文件中的数据。 注意: IO操作中的数据方向,然后确定最后需要使用的类或接口中的方法。 4.File类 4.1.File类介绍 数据需要保存在文件中,而文件多了,就需要文件夹进行管理。 也就是说文件或者文件夹是我们长久保存数据的设备上存在的一类事物。 Java肯定会有一个类多这个事物进行描述。 Java中使用File类描述文件或者文件夹这个事物。 只要在java中需要操作硬盘上的文件或者文件夹就应该使用File类。 4.2.File类构造方法 /* *演示File类中的构造方法 */ publicclassFileConstructorDemo{ publicstaticvoidmain(String[]args){ method3(); } /* *File(Fileparent,Stringchild) *Fileparent已经将父目录封装成File对象, *Stringchild文件或者文件夹 */ publicstaticvoidmethod3(){ //封装的父目录 Filedir=newFile("d: /abc/bbb/ccc"); //将父目录下的文件或文件夹封装成File对象 Filefile=newFile(dir,"1.txt"); System.out.println(file); } /* *File(Stringparent,Stringchild) *Stringparent当前文件或者文件夹所在的父目录 *Stringchild是当前的文件或者文件夹 *注意: *在windows中,目录(文件夹)之间的使用的是\作为默认分隔符 *我们可以可以使用/作为分隔符 */ publicstaticvoidmethod2(){ //创建File对象 Fil
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 18 泛型 File
![提示](https://static.bdocx.com/images/bang_tan.gif)