Java 基础详解(泛型、集合、IO、反射)
计划把Java基础的有些部分再次看一遍,巩固一下,下面以及以后就会分享自己再次学习的一点笔记!不是有关标题的所有知识点,只是自己觉得模糊的一些知识点。
1.对于泛型类而言,你若没有指明其类型,默认为Object;
2.在继承泛型类以及接口的时候可以指明泛型的类型,也可以不指明;
3.泛型也数据库中的应用:
写一个DAO类对数据库中的数据进行增删改查其类型声明为
//数据表对应的类 publicclassCustomer{ privateintid; privateStringname; ... } //所有数据表的操作类都要实现的DAO基类 publicclassDAO{ //增 publicvoidadd(Tt){ … } } publicTget(intindex){ //查 returnnull; } publicvoiddelete(){ //删 … } publicList getForList(intindex){ //查 returnnull; } //数据表操作对应的实现类 publicclassCustomerDaoextendsDAO { } //测试类 publicclassTest{ publicstaticvoidmian(String[]args){ CustomerDaocus=newCustomerDao; Cus.add(newCustomer); } }
4.静态方法中不可以使用泛型(static)
因为static声明的方法或者类以及变量都是在类初始化的时候初始化,而泛型是在运行的时候才回去初始化的,所以就出现了问题(后出现的调用了先出现的)。
publicTt; //Error publicstaticvoidshow(){ System.out.println(t); }
5.通配符
可以读取声明为通配符的集合,但不可往里写入元素(读的时候可以把元素都认为是Object,但写的时候其声明为?,不是Object,也就是说写什么类型都是错的,但可以存null),例如
PublicvoidtestList(){ ListstrList=newArrayList<>(); strList.add(“Hello”); strList.add(“World”); //correct List>list=strList; //error list.add(“hi”); list.add(123); //correct list.add(null); }
6.集合Map的遍历
packagecom.java.map.test; importjava.util.ArrayList; importjava.util.Collection; importjava.util.Collections; importjava.util.HashMap; importjava.util.Iterator; importjava.util.List; importjava.util.Map; importjava.util.Set; publicclassMapEntry{ publicstaticvoidmain(String[]args){ Mapmap=newHashMap<>(); map.put(1,"a"); map.put(2,"b"); map.put(3,"c"); map.put(4,"d"); map.put(5,"e"); //得到map所有键的集合 Set keys=map.keySet(); for(Integerkey:map.keySet()){ System.out.println(map.get(key)); } //利用迭代器遍历 Iterator >it=map.entrySet().iterator(); while(it.hasNext()){ Map.Entry entry=it.next(); System.out.println(entry.getKey()+"->"+entry.getValue()); } //第三种 for(Map.Entry entry:map.entrySet()){ System.out.println(entry.getValue()); } //遍历所有的value值 Collection values=map.values(); for(Stringval:values){ System.out.println(val+">>-"); } Iterator i=values.iterator(); while(i.hasNext()){ System.out.println(i.next()+"-->"); } List lists=newArrayList<>(); lists.add("1"); lists.add("2"); lists.add("3"); lists.add("4"); Iterator it2=lists.iterator(); while(it2.hasNext()){ System.out.println(it2.next()); } Collections.reverse(lists); Iterator it3=lists.iterator(); //Comparatorcomparator=new while(it3.hasNext()){ System.out.println(it3.next()+"<->"); } } }
7.利用反射获取方法名和属性名,利用反射还可以获取构造器等其他信息
packagecom.java.reflct.test; //实体类 publicclassPerson{ privateStringid; privateStringname; publicintphone; publicvoidsetId(Stringid){ this.id=id; } publicStringgetId(){ returnid; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetName(){ returnname; } publicvoidsetPhone(intphone){ this.phone=phone; } publicintgetPhone(){ returnphone; } privatevoidprint(){ System.out.println("youridis"+id+",yournameis"+name+",yourphoneis"+phone+"!"); } @Override publicStringtoString(){ return"Person[id="+id+",name="+name+",phone="+phone+"]"; } } packagecom.java.reflct.test; //测试类 importjava.lang.reflect.Field; importjava.lang.reflect.InvocationTargetException; importjava.lang.reflect.Method; publicclassTestReflect{ publicstaticvoidmain(String[]args){ try{ //通过Class.forName("全类名");获取Class,还以利用对象名.getClass()类名.class();获取Class Classcla=Class.forName("com.java.reflct.test.Person"); Classcla2=Person.class; //获取所有的变量,返回数组,包括私有变量 Field[]fields=cla2.getDeclaredFields(); //遍历变量数组 for(Fieldfie:fields){ System.out.println(fie+"-..-"); } //获取所有的方法,返回数组,包括私有方法 Method[]methods=cla.getDeclaredMethods(); for(Methodmet:methods){ System.out.println(met); } try{ //获取单个私有属性 Fieldfield=cla.getDeclaredField("id"); //打破封装 field.setAccessible(true); System.out.println(field+"<<>>"); }catch(NoSuchFieldExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(SecurityExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } Methodmethod=null; try{ //获取单个私有方法 method=cla.getDeclaredMethod("print"); //打破封装 method.setAccessible(true); System.out.println(method+">><<"); }catch(NoSuchMethodExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(SecurityExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } try{ //通过cla.newInstance();获取类的对象 Personperson=(Person)cla.newInstance(); person.setId("1"); person.setName("yinyin"); person.setPhone(110); System.out.println(person+"__>>__"); try{ //执行person对象的中method所对应的方法 method.invoke(person); }catch(IllegalArgumentExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(InvocationTargetExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }catch(InstantiationExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); }catch(IllegalAccessExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); } }catch(ClassNotFoundExceptione){ System.out.println("Thereisnoclass"+e); } } }
8.Comparator 类的使用(利用 Comparator 实现集合的自定义排序)
注意区分Collections(集合的处理类)和Collection(集合基类)
packagecom.java.collection.test; importjava.util.ArrayList; importjava.util.Collections; importjava.util.Comparator; importjava.util.Iterator; importjava.util.List; /* *Collections是Collection的操作类 */ publicclassCollectionComparator{ publicstaticvoidmain(String[]args){ Comparatorcom=newComparator (){ @Override publicintcompare(Customero1,Customero2){ //将id的比较值放入参数中,使得id相等时有其他的处理方法 inti=o1.getId().compareTo(o2.getId()); //当Id相等的时候比较名字的顺序 if(i==0){ //给return添加一个-号可以实现“从大到小” returno1.getName().compareTo(o2.getName()); } //Id不相等时返回其值 returni; } }; List lists=newArrayList<>(); lists.add(newCustomer("yinyin","110",1001)); lists.add(newCustomer("zhao","10086",1002)); lists.add(newCustomer("ls","10010",1001));; Collections.sort(lists,com); //利用匿名类实现自定义排序 /* Collections.sort(lists,newComparator (){ @Override publicintcompare(Customero1,Customero2){ //将id的比较值放入参数中,避免id相等没有其值 inti=o1.getId().compareTo(o2.getId()); //当Id相等的时候比较名字的顺序 if(i==0){ returno1.getName().compareTo(o2.getName()); } returni; } }); */ //利用迭代器遍历集合 Iterator it=lists.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
9.IO
读取目标文本文件的字节数
packagecom.java.io.file.test; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.IOException; importjava.io.InputStream; publicclassMyIoTest{ publicstaticvoidmain(String[]args){ //在IO中出现的异常最好都使用try-catch包裹起来,不要throw,因为这样可以保证流的关闭在任何时候都可以正常执行 InputStreamfileStream=null; intcount=0; try{ fileStream=newFileInputStream(newFile("hello.txt")); //读取文件的下一个字节 while(fileStream.read()!=-1){ count++; } //打印目标文件的字节数 System.out.println(count); }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ try{ fileStream.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } }
实现文件的复制(InputStream、OutputStream和Reader、Writer)。文本文件的操作使用ReaderWriter(字符流)去实现,效率高。但是不可以去操作媒体文件;媒体文件使用InputStreamOutputStream去实现,也可以对文本文件进行操作,但是没有字符流高效。
packagecom.java.io.file.test; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; publicclassCopyFile{ publicstaticvoidmain(String[]args){ //设置一次从目标文件中读取多少字节 byte[]buffer=newbyte[1024]; intlen=0; Filefile=newFile("C:/Users/lenovo/Desktop/123.wmv"); InputStreamfileInput=null; OutputStreamfileOut=null; try{ fileInput=newFileInputStream(file); fileOut=newFileOutputStream(newFile("C:/Users/lenovo/Desktop/trave2.wmv")); //len的作用是防止读取文件时最后一次其长度不够读取被置为零,read()返回读入缓冲区的字节总数 while((len=fileInput.read(buffer))!=-1){ fileOut.write(buffer,0,len); } System.out.println("SUCC"); }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ try{ fileOut.close(); fileInput.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } } //利用ReaderWriter实现 packagecom.java.io.file.test; importjava.io.File; importjava.io.FileNotFoundException; importjava.io.FileReader; importjava.io.FileWriter; importjava.io.IOException; importjava.io.Reader; importjava.io.Writer; publicclassReaderWriter{ publicstaticvoidmain(String[]args){ Filefile=newFile("hello.txt"); intlen=0; ReaderfileReader=null; WriterfileWriter=null; char[]ch=newchar[125]; try{ fileReader=newFileReader(file); fileWriter=newFileWriter(newFile("world.txt")); while((len=fileReader.read(ch))!=-1){ fileWriter.write(ch,0,len); } }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ try{ fileWriter.close(); fileReader.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } }
10.利用缓冲流实现文件的复制操作,效率更高
packagecom.java.io.file.test; importjava.io.BufferedInputStream; importjava.io.BufferedOutputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; publicclassTestBufferedCopy{ //使用缓冲流实现文件的复制 publicstaticvoidmain(String[]args){ intlen=0; byte[]buffer=newbyte[2048]; Filefile=newFile("C:/Users/lenovo/Desktop/123.rmvb"); InputStreaminputFile=null; OutputStreamoutputFile=null; BufferedInputStreambufferedInput=null; BufferedOutputStreambufferedOutput=null; try{ inputFile=newFileInputStream(file); outputFile=newFileOutputStream("C:/Users/lenovo/Desktop/456.rmvb"); bufferedInput=newBufferedInputStream(inputFile); bufferedOutput=newBufferedOutputStream(outputFile); while((len=bufferedInput.read(buffer))!=-1){ bufferedOutput.write(buffer,0,len); } System.out.println("SUCC"); }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ try{ //只需关闭复制文件用到的就可以,即最后两个 bufferedOutput.close(); bufferedInput.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } }
上面的代码总结啥的都是自己平常练习过程中的代码和心得,对于知识点讲解覆盖的并不全面,还望谅解。初来乍到不知道该如何去写!
以上这篇Java基础详解(泛型、集合、IO、反射)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。