Java 基础详解(泛型、集合、IO、反射)
计划把Java基础的有些部分再次看一遍,巩固一下,下面以及以后就会分享自己再次学习的一点笔记!不是有关标题的所有知识点,只是自己觉得模糊的一些知识点。
1.对于泛型类而言,你若没有指明其类型,默认为Object;
2.在继承泛型类以及接口的时候可以指明泛型的类型,也可以不指明;
3.泛型也数据库中的应用:
写一个DAO类对数据库中的数据进行增删改查其类型声明为
//数据表对应的类
publicclassCustomer{
privateintid;
privateStringname;
...
}
//所有数据表的操作类都要实现的DAO基类
publicclassDAO{
//增
publicvoidadd(Tt){
…
}
}
publicTget(intindex){
//查
returnnull;
}
publicvoiddelete(){
//删
…
}
publicListgetForList(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所有键的集合
Setkeys=map.keySet();
for(Integerkey:map.keySet()){
System.out.println(map.get(key));
}
//利用迭代器遍历
Iterator>it=map.entrySet().iterator();
while(it.hasNext()){
Map.Entryentry=it.next();
System.out.println(entry.getKey()+"->"+entry.getValue());
}
//第三种
for(Map.Entryentry:map.entrySet()){
System.out.println(entry.getValue());
}
//遍历所有的value值
Collectionvalues=map.values();
for(Stringval:values){
System.out.println(val+">>-");
}
Iteratori=values.iterator();
while(i.hasNext()){
System.out.println(i.next()+"-->");
}
Listlists=newArrayList<>();
lists.add("1");
lists.add("2");
lists.add("3");
lists.add("4");
Iteratorit2=lists.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
Collections.reverse(lists);
Iteratorit3=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;
}
};
Listlists=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;
}
});
*/
//利用迭代器遍历集合
Iteratorit=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。