Java期末复习知识点_第1页
Java期末复习知识点_第2页
Java期末复习知识点_第3页
Java期末复习知识点_第4页
Java期末复习知识点_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java知识点整理变量传值(两个变量赋值,将一个变量给方法的参数赋值)值传递:基本类型之间是值的复制,传递基本数据类型参数值传递只是将(实参)参数复制一份(传递给形参)而已,函数进行操作的是另一个参数(形参),只是另一个参数(形参)的值和传递的参数(实参)值是相同的,另一个参数(形参)对方法值的改变不会影响到该参数(实参)的值。B,地址传递:引用类型之间的是地址的复制,将对象作为参数传递地址传递是直接把参数(实参)的地址传递给函数,这时函数是直接对原来的参数(形参)进行操作的,所以值会变化。方法中需要传递的参数成为形式参数,即形参,而对象或者基本类型称为实际参数。Eg:inta=10;Bookb=newBook(),为实际参数继承只能单继承在找错题中注意父类有无无参构造器。如果子类构造方法的参数和父类构造方法的参数相同,则意味着进行重写,重写需满足传递参数、方法的声明都相同。在方法重写时,如果需要调用父类的构造方法,则用super.方法()一个.java源文件定义一个类,类都使用public定义诸如结婚是否满足条件,可以在clasperson里面定义一个publicBooleanmarrywith(personp),诸如对年龄、收入等等进行区分,可以在setage中进行定义区别Eg:父类shape有子类circle和rect,shape里面可以没有成员变量,构造方法等,只需要有方法,诸如area等可以return0;然后在子类中重写,super.方法(),是继承父类多态性使用多态需要有继承关系,多态的使用可以提高方法参数的灵活性,父类型具有多态性,可以引用子类对象eg:Ftherf=newChildA();多态的灵活运用:publicstaticvoidmain(String[]args){ Circlec1=newCircle(5,3,10); Rectr1=newRect(10,20); display(c1); display(r1); }publicstaticvoiddisplay(Shapes){//shape为父类 //判断s的原本类型是否为Circle if(sinstanceofCircle){ Circlec=(Circle)s;//强制转型 c.f1();//调用Circle新增方法f1 } System.out.println("面积:"+s.area());//因为参数传入为s,方便用 System.out.println("周长:"+s.zhouchang()); }

Static关键字有static修饰的成员与类相关,没有static修饰的成员与对象相关(1)修饰属性a.通过类名.调用b.该类的所有对象共享该属性。c.属性是在类加载器加载该类时分配空间(2)修饰方法a.通过类名.调用b.该方法内只能使用有static修饰的属性或方法c.方法内不能使用this,super关键字 (3)修饰代码块a.是在类加载时执行,因为虚拟机对类只加载一次, 所以静态代码快只在第一次加载时执行。仅执行一次静态模块的灵活运用Static{}final关键字(1)修饰类类为最终类,不能被继承。(2)修饰方法方法为最终方法,在子类中不允许被重写(覆盖)。(3)修饰属性属性值在赋值后,不允许被修改.可以写于main方法外面 定义属性时,如果加了final,必须显示给定初值,系统不能默认初始化。定义常量格式:publicstaticfinal类型常量名=值常量名注意全部大写写于main方法外面抽象类:abstract(1)抽象类概念a.抽象类只能作为父类使用,不能实例化。b.抽象类可以包含抽象方法,也可以不包含抽象方法。c.如果子类继承了抽象类,必须全部实现父类的抽象方法,d.否则子类得继续充当抽象类。(2)抽象方法a.在定义父类时,如果有些方法无法确定具体实现,可以定义成抽象方法。Eg:猫的爬树和熊的力量,不一定能全部实现b.抽象方法格式如下: 修饰符abstract返回类型方法名(参数列表);抽象类构造方法必须存在于抽象类中!!interface(1)概念接口是一种特殊的抽象类,其中只有常量和抽象方法的定义。弥补了继承只能单继承的缺点。它是系统和外界交互的窗口。Eg:publicstaticfinalintA=0;publicvoidliliang();(2)接口定义格式publicinterface接口名extends接口1,接口2...{}注意:与类继承不同,接口允许多继承。(3)接口的使用publicclass类名implements接口1,接口2...{ //必须实现接口中的所有方法 //否则该类必须是抽象类} //多态使用 接口类型变量=new接口实现类();模版设计模式:day7运用到abstracta.代码重复利用b.如果业务的主要处理逻辑相同,局部子类实现不同,可以将这部分相同逻辑提到模版类中,模版类采用抽象类定义。不同实现部分放到子类实现。单子模式day7为了保障一个类,只能创建出一个对象,不能存在多个对象。实现步骤:a.将构造方法私有,防止外界使用new+构造方法()创建对象b.提供一个静态返回当前类型对象的获取实例的方法. 第一次调用该方法时,调用new构造器创建对象,后续调用该方法时,将第一次创建的对象返回11,eg:Stringid=sc.next(); Stringid1="\\d{15}|\\d{18}"; if(id.matches(id1))//匹配用matchs { p.setId(id);//这里把信息输入放入一个数组中去,方便输出! } else{ System.out.println("您输入格式有误,请重新输入!"); return;//输入错误会直接结束,不会执行下一段 }12,打乱排序:collections.shuffle(list);13,String(1)不可改变:String对象的内容是不能改变的. Stringstr="abc";//创建了一个对象,存储abc,然后将引用给str变量 str="efg";//又创建一个对象,存储efg,然后将引用给str变量(2)字符串缓冲区 用于字符串常量,缓冲区中的字符串对象可以共享 Strings1="abc";//在缓冲区中创建存储abc的对象,然后将引用给s1 Strings2="abc";//使用前面创建的存储abc的对象注意:newString("abc")创建出来的对象不使用缓冲区(3)常用的String方法 charcharAt(intindex)//抓去 intlength()//长度 StringtoLowerCase()//小写 StringtoUpperCase()//大写 Stringtrim() //去除首位空格 intcompareTo(StringanotherString)//从首字母开始比较,相同返回0 intcompareToIgnoreCase(Stringstr)//不区分大小写 booleanequals()//是否内容相等 booleanequalsIgnoreCase()//不区分大小写,比较内容是否相等 booleanstartsWith(Stringprefix)//以…为开头 booleanendsWith(Stringsuffix)//以…为结尾 intindexOf(intch)//首次出现ch的位置 intlastIndexOf(intch) //最后出现ch的位置 Stringreplace(charoldChar,charnewChar)//替换 StringreplaceAll(Stringregex,Stringreplacement)//全部替换 String[]split(Stringregex)//分割 Stringsubstring(intbeginIndex)//从beginIndex至结尾的输出 staticStringvalueOf(booleanb)//以String类型返回值14,StringBuffered和StringBuilder特性 (1)都是可变字符序列,拥有相同的方法API(2)StringBuffer线程安全的//能够实现同步StringBuilder线程不安全,从1.5版本开始有//不一定能实现同步StringBuffer\StringBuilder方法 StringBuilderappend(booleanb)//添加 StringBuilderdelete(intstart,intend)大于等于start,小于end//删除 StringBuilderinsert(intoffset,Stringstr)//插入 StringBuilderreverse()//调换顺序 记住:最后输出return的时候要转换成String形式,比如sb.tostring() StringBuffers=newStringBuffer(); for(inti=0;i<10;i++) { s.append(i); } System.out.println(s.toString()+1);//单独打印s可以,但是要打印s+1必须转化为String否则报错 StringBuffers=newStringBuffer("123456789"); for(inti=1;i<s.length();i++) { s=s.delete(i,i+1);//前闭后开 } System.out.println(s);StringBuffers=newStringBuffer("123456"); charss='a'; charb='g'; for(inti=1;i<=s.length();i+=2) { s=s.insert(i,ss); ss++; } System.out.println(s); System.out.println("-----------"); System.out.println((char)(b+1));15,正则表达式: 1.相关类 Pattern:正则表达式的编译表示形式。 Matcher:模式匹配器。2.正则表达式语法(1)字符x字符x\\反斜线字符\t制表符('\u0009')\n新行(换行)符('\u000A')\r回车符('\u000D')\b边界(2)字符类[abc]a、b或c(简单类)[^abc]任何字符,除了a、b或c(否定)[a-zA-Z]a到z或A到Z,两头的字母包括在内(范围)(3)预定义字符类.任何字符(与行结束符可能匹配也可能不匹配)\d数字:[0-9]\D非数字:[^0-9]\s空白字符:[\t\n\x0B\f\r]\S非空白字符:[^\s]\w单词字符:[a-zA-Z_0-9]\W非单词字符:[^\w](4)数量词X?X,一次或一次也没有X*X,零次或多次X+X,一次或多次X{n}X,恰好n次X{n,}X,至少n次X{n,m}X,至少n次,但是不超过m次(5)运算符XYX后跟YX|YX或Y(X)X,作为捕获组Eg:Patternp=Ppile("[a-zA-Z_$][\\w$]*"); Matcherm=p.matcher("$A2_sff$") booleanb=m.matches(); System.out.println(b); Stringstr="Javaj2eej2mejavaJ2eejavaj2se"; Patternp=Ppile("java",Pattern.CASE_INSENSITIVE); Matcherm=p.matcher(str); Strings=m.replaceAll("java".toUpperCase());//括号内内容,不能, System.out.println(s);或者直接:returnPattern.matches("张\\D{2}",name);16,局部变量声明之后,java虚拟机就不会自动给它初始化为默认值。因此对于局部变量,必须先经过显示初始化,才能使用。如果编译器确认一个局部变量在使用之前可能没有初始化,编译器就报错。Eg:publicvoidmethod(){ inta; a++;System.out.println(a);}//编译错误,没有初始化变量a;如果没有初始化变量a,但是在方法中变量a一直没有使用到,则编译和运行依然通过,只是没有意义。区别于:privateinta,然后在构造方法a++,这是正确的17,同变量名x在同一代码模块中无法重复存在,但是在不同代码模块,可以同时存在,比如:if(){intx=0;}else(longx=0;) 子类之间的强转会出现编译错误,因为兄弟之间无法强转,父子类之间的强转可以强转,但是要是强转为不是实例的子类,则编译通过,但是会抛出ClassCastException Continue只能用于循环语句中 18,用十进制科学计数法(0开头为八进制,0x开头十六进制)表示的数字都是double型直接数,例如10E1和5E23都是double型直接数。(直接数是指直接赋值给变量的具体数值,eg:inta=10,Stringname=”xujun”) 19,如果父类和子类中构造方法的参数列表相同,则代表意图方法重写,需要满足返回类型、方法名和参数列表相同;如果方法名相同,则代表意图方法重载,返回类型、修饰符、参数列表顺序可以不相同,如果参数列表中参数签名一样,则参数名字是否相同,都不能视为重载。如果该方法是abstract类,则可以包含abstract方法,如果不是,则不能包含。P164 方法重载和方法重写的异同p17020,Arrays:数组java.util 数组的排序可以采用冒泡排序和选择排序a,如果指定数组引用为空,则抛出空指针异常NullPointerExceptionb,Arrays.sort(int[]a)按数字类型升序进行排列Arrays.sort(int[]a,intfromIndex,inttoIndex)在某段范围内进行数字的升序排列 Arrays.sort(Object[]obj)自然升序排列 Arrays.sort(T[]a,newComparator(){}…); Arrays.binarySearch(int[]a,intkey)使用二进制搜索算法来搜索指定的int型数组,以获得指定的值数组中查找位置的方法 Arrays.equals(p1,p2) Arrays.fill(int[]a,intb)将指定的int值分配给指定int型数组的每个元素,即将数组中所有元素都设为b Arrays.fill(int[]a,intfromIndex,toIndex,intb)将指定的int值分配给指定int型数组指定范围中的每个元素 Arrays.toString(int[]a)将int类型的数组以字符串形式输出 instanceof操作符来判断数组的类型 eg:int[]a=newint[4]; System.out.println(ainstanceofint[]);//true 整型(byte,int,short,long)默认值为0 单精度浮点型(float)默认值为0.0f 双精度浮点型(double)默认值为0.0d 布尔类型(Boolean)默认值为false字符型(char)默认值为’\u0000’ 引用类型的变量的默认值为null 数组引用类型的变量默认值为null int[]x=newint[5]{5,4,3,2,1};//编译出错,不能在[]中指定数组的长度Collections:集合长度可以扩,数组长度一旦定义就不能扩,只能再newa,集合的实现类:List:元素是有序的,可重复的。ArrayList/LinkedList/VectorArrayList:代表长度可变的数组,插入和删除元素慢,但是查询块,它是不同步的LinkedList:在实现中采用链表数据结构,插入和删除元素快,但是查询慢,它是不同步的Vector:它是同步的add/remove/get(i)/indexOf(o)/containsSet:元素是无序的,不可重复的。HashSet是不同步的b,泛型:可以减少类型因为没有强制转型而发生的编程错误集合中通常存放相同类型的对象泛型可以约束集合中元素的类型,减少编程错误强制类型转换都是自动和隐式进行的C,散列表的概念(Hash哈希算法/散列算法)数据结构:成对存储键值对(key-value).key不能重复,value可以重复1)容量:散列数组的大小2)散列运算:key-》对应散列下标的算法"Mac".hashCode()%10->33)散列桶:散列值相同的元素的“线性集合”4)加载因子(loadfactor)小于75%6(元素数量)/10(散列表容量)=60%5)散列查找:根据key计算散列值,根据散列值找到散列桶,在散列桶中顺序比较key,如果相同,返回此元素。6)散列表中key不同,value可以重复。散列算法:不可逆的单向函数。key->f(key)d,HashMap常用方法:它是不同步的put(key,value)constainsKey(key)//返回boolean,判断集合中是否包含key值get(key)//通过key找到valueremove(key)//从集合中去除元素keySet()//返回key的集合,Setvalues()//返回值的结合,CollectionSetkeys=table.keySet();Collectionvalus=table.values();//集合e,集合的迭代(遍历)Iteratorday10InteratorDemoIterator<>it=list.iterator();JavaAPI中的接口Iterator描述的逐一遍历的方法。遍历购物车,遍历播放列表1)Iterator描述了一个线性结构(顺序结构)。有指针(游标)的概念。它的集合中元素的顺序是任意的,与加入的顺序不一定一致指针的初始位置在第一个元素之前。hasNext():当前指针的下一个位置有没有元素hasPrevious():当前指针的上一个位置有没有元素next():指针下移一位,取出当前位置的元素previous():指针上移一位,取出当前位置元素2)集合的方法remove/add/set在迭代过程中不要使用如果需要在迭代的时候删除集合内容,使用迭代器自己的删除方法:remove移除当前指针指向的元素。f,集合元素的排序1)API:字符串(已经实现了Comparable接口并重定义了compareTo()方法,按字典排序)/整型数据compareTo(s1)自定义对象类(自定义排序原则)implements必须在一个另外类中写,然后在main方法中通过<泛型>使用,collections.sort()会自动调用泛型所指类中的顺序2)比较器Comparator匿名内部类写不用implementscompare(s1,s2)Eg:Collections.sort(list,newComparator<>(){});Arrays.sort(arrays,newComparator(){});数据和比较原则分开。CallBack(回调)方式g:System.out.println(list.indexOf(“123”);//错误,indexOf()内应该是一个对象,所以先new一个对象只有Vector是同步的,其他Collection都是不同步的g,Array.length;//不加(),它是个属性!! Collections.size();//集合长度用size(),这是一个方法!!22,简单类型-->包装类(封装类)byte-->Byteshort-->Shortint-->Integerlong-->Longdouble-->Doublefload-->Floatboolean-->Booleanchar-->Charater23,装箱和拆箱inti=10;Integerm=newInteger(10);i=m;//自动拆箱由封装类赋值给简单类型m=i;//自动装箱由简单类型赋值给封装类注意:1.封装类是final类2.封装类对象是不变的。和String类似。3.覆盖了Object的equals()和toString()方法StringstrAge=intAge+"";//int->字符 StringstrAge1=Integer.toString(intAge);//int->字符StringstrAge2=String.valueOf(strAge);StringhexAge=Integer.toHexString(intAge);24,内部类:1.成员内部类:声明在类体(宿主)中,和宿主类的成员变量位置相同,具备成员变量的特征。在内部类中可以访问宿主类的成员变量。很常用。扩展:静态成员内部类:只能访问宿主类的静态变量和静态方法。内部类可以定义为private类是不能用protected修饰Protected不能用于声明类,private只能用于声明内部类,其他不能用:但是protected可以用于声明构造方法、构造器、构造参数等,这是可以的2.局部内部类定义在方法体内。很少用到。只能访问宿主方法的final变量。成员内部类和局部内部类的作用和概念,参考成员变量和局部变量。3.匿名内部类没有名字的内部类。非常常用。定义方式类似于一条语句。记住匿名内部类的语法。模拟多继承,可以访问宿主的私有变量。注意:1.任何内部类都编译成独立的class文件。2.内部类的作用:封装。内部类很少在宿主类的外部使用。Animalperson=newAnimal(){ publicvoidmove(){ System.out.println("走路!"); } };25,java中日期对象的处理a.java中基本时间表示方式:long(1303461335765)b.java提供了Date类型表示时间和日期,Date类是对long类型的时间日期的封装。c.java提供了Calendar类型做历法的抽象。 date.setTime(long)cal.setTime(date) ---------------->----------------->longDateCalendar <----------------<---------------- date.getTime()cal.getTime()d.Date/Calendar对象的默认值就是当前时间。Datedate=newDate();Calendarcal=Calendar.getInstance();都是默认的当前时间cal的时间格式必须这样写e.日期的格式:java.text.SimpleDateFormat类yyyy-MM-ddHH:mm:ssyyyy/MM/ddhh:mm:ssyyyyMMdddd/MM/yyyyMM/dd/yyyy日期格式对象SimpleDateFormat可以实现Date/String的转换longtimes=System.currentTimeMillis();//返回以毫秒为单位的当前时间System.out.println(sdf.format(cal3.getTime()))//sdf.format(),括号中为date,可以用cal.getTime() cal.add(Calendar.MONTH,3);//月份+3 cal.add(Calendar.DAY_OF_WEEK_IN_MONTH,-2);//周-2 !!cal.add(Calendar.DAY_OF_WEEK,6);//得到星期几,然后找到本周周五26,异常:Exception异常的两种处理方法:捕捉和抛出小的异常(异常子类)放在前面,大的异常放在后面。这样可以防止小的异常因为大的异常在前面而无法读取finally块是一定被执行的程序块。不管程序是否出现异常,出现了哪些异常,finally块都会被执行。异常的分类:错误和异常Throwable||--Error系统不可恢复的错误,由JVM发生的||--OutOfMemoryError堆内存溢出||--StackOverflowError栈内存溢出|--Exception程序可以检查并处理的异常。是常见异常的继承根。|--ParseExceptionDateFormat解析字符串时发生|--RuntimeException非检查异常(运行期异常,可以正常编译,非常常见)|--NullPointerException空指针异常|--ArrayIndexOutofBoundsException数组下标越界异常|--ClassCastException类转型异常|--ArithmeticException数学运算异常(除零异常)|--NumberFormatException数字格式异常自定义异常的异常名要有实际意义!在处理异常时,可以最后不打印输出异常内容,可以删除此句,然后自己定义个内容取代异常输出例子:try{Stringname=null;//returnname.length();return1;}catch(NullPointerExceptione){e.printStackTrace(); return2;}catch(Exceptione){ e.printStackTrace(); return3;}finally{ return4; }//return4;catch模块中的return被覆盖了,因为先是finally块的打印27,自定义异常因为项目中会出现特有的问题,而且这些问题并没有被java所描述并封装对象,所以就需要我们进行自定义异常。当在函数内部出现throw抛出异常对象,那么就必须要给对应的处理动作,要么在内部try-catch处理,要么在函数上声明让调用者处理,一般情况下,数组出现异常,函数上需要声明。发现打印的结果中找哦有异常名称,没有异常信息,因为自定义的异常并未定义信息。如何定义异常信息?因为弗雷中已经把异常信息的操作都完成,所以子类只要在构造时,将异常信息传递给父类,通过super语句,那么就可以直接通过getMessage方法获取自定义异常信息。自定义异常必须是自定义类继承Exception。继承Exception的原因:异常体系有一个特征,因为异常类和异常对象都需要被抛出,他们都具备可抛性,这个可抛性是Throwable这个体系中独有特点,只有这个体系中的类和对象才可以被throws和throw操作。Eg:复杂全面的自定义异常,输出信息等classFushuExceptionextendsException{//生成对象privateintvalue;//这里输出的是数字bFushuException(){super();}FushuException(Stringmsg,intvalue){super(msg);this.value=value;}publicintgetValue(){returnvalue;}}ClassDemo{intdiv(inta,intb)throwsFushuException{If(b<0)ThrownewFushuException(“出现了除数是负数的情况----/byfushu,b”);Returna/b;}}classExceptionDemo3{publicstaticvoidmain(String[]args){Demod=newDemo();try{intx=d.div(4,-9);System.out.println(“x=”+x);}catch(FushuExceptione){ System.out.println(e.toString);System.out.println(“错误的负数是:”+e.getValue());}System.out.println(“Over”);}}}28,父子关系可以强制类型转换:eg:Objectname="peter"; //实际为String StringstrName=(String)name;兄弟关系不能强制类型转换eg:Objectstr="1234"; Integeri=(Integer)str;//ClassCastException在这里str实际上是String类型,所以他们是兄弟关系29,Filea,Filefile=newFile(“day13/xj.txt”); Filefiles=newFile(file,”xj.txt”)//file路径下是否存在xj.txt File[]files=file.listFiles();//文件数组b,File的API longlength();//文件长度longlastModified;//最后一次修改时间StringgetName();//获取文件名StringgetPath();//获取文件路径StringgetAbsolutePath();//获取文件的绝对路径booleanexist();//是否存在booleanisFile();//是否文件booleanisDirection();//是否目录booleanmkDir();//创建文件夹booleandelete();//删除文件booleancreateNewFile();创建文件File[]listFiles(FileFilterfilter);//返回满足过滤器条件的文件数组//过滤器是个接口,所有用匿名内部类写“.”是指当前地址Filefile=newFile(“.”);c,输入流中按照字节一个一个读取用in.read()!=-1;.readline()!=null;如果读取很多,则将其放入一个byte[]中,然后int.read(buf);读取剩余的可用in.available。读取字符串的时候Strings=newString(buf,”gbk/utf-8”); 注意一段代码结束,要close();File.separator无视名称分隔符d,输出流.write();eg:.write(0x41),.write(“面朝大海”.getBytes());.write(“春暖花开”.getBytes(),2,4);注意.flush()and.close()e,RandomAccessFileraf=newRandomAccessFile(“day13”,”rw”)支持对随机文件的存储和读取,其中采用raf.seek(),指针使用,读为raf.read(),写为raf.write(),raf.skip()跳跃字节,raf.seek(raf.length())读取结尾,然后再开始.write(),其中raf.length()为long型,需要强转为int;raf.close()30,流 a,节点流:流开始(结束)的地方,和介质(操作系统的文件)打交道的流处理流:对节点流的扩展,提高效率,本身不是数据源,只是为了增加功能。可以通过节点流和处理流的组合成为灵活的读取方案。从方向上分:输入流、输出流从处理的单元上分:字符流、字节流从处理的效率(介质):节点流、处理流b,字符流:byte-char按编码转换Reader:InputStreamReader,FileReader,BufferedReader(这类都是利用缓冲区来提高读取效率)Writer:OutputStreamWriter,FileWriter,PrintWriterPrintWriterout=newPrintWriter(newOutputStreamWriter(newFileOutputStream(filename,”gbk”)));BufferdeReaderbr=newBufferedReader(newInputStreamReader(System.in)));控制台输入FileWriter(filename,true)//没有这文件路径则自动建立e,可以三层嵌套进行从字节开始读取,也可以两层嵌套从字符开始读取31,在编程过程中,从上而下写,如果遇到没有的方法,可以先对象.方法,然后再在下面写,诸如遇到line无法.方法的情况,可以用方法(line)进行。注意传参!!!!!f,eg:在CharArrayWriter中,char[]buf=writer.tocharArray(),然后String打印对象是由属性(数据)组成的Serializable(这是一个接口,可以被java类实现,必须在实现序列化类后面implementsSerializable)把对象变成n个byte序列的过程叫做序列化把n个byte序列转换成对象的过程叫做反序列化API类:ObjectInputStream/ObjectOutputStream可以和FileOutputStream,ByteArrayInputStream等搭配使用.readObject()/.writeObject(allCards)//前者需定义接收,看刚开始new的类型;eg:new的是person,则PersonP1=(person).readObject();c,Java中在Object底层支持了序列化和反序列化,和字节有关的1)类实现标志接口java.io.Serializable;2)ObjectOutputStream.writeObject(obj);实现序列化输出3)ObjectInputStream.readObject();实现反序列化输入d,如果在main方法中需要序列化一个对象,则在此对象的class类模块进行implementsSerializable32,线程Thread目的是为了提高运行效率a,在java虚拟机进程中,执行程序代码的任务是由线程来完成的,计算机中机器指令的真正执行者是CPU,线程必须获得CPU的使用权,才能执行一条指令。b,主线程与用户自定义的线程是并发运行的,但是CPU一次只能被一个线程调用。 c,进程:一个程序的执行过程;线程:一个程序内部的多个执行线索,并发执行。进程的概念大于线程概念。 d,构造线程:run()方法是线程体。 构造Thread的子类;构造Runnable接口的子类,并作为Thread类的构造参数。eg:classT1extendsThread{publicvoidrun(){}};classT2implementsRunnable{publicvoidrun(){}};T1t1=newT1();T2t2=newT2(),Threadt=newThread(t2);然后启动t1.start()和t.start() e,线程状态的管理: Thread.yield():当前线程让出CPU(退出Running状态),进入Runnable状态,重新排队,但有可能再次被选中执行(有可能让不出)。 Thread.sleep():让当前线程让出CPU,进入Block(阻塞状态)。休眠n毫秒后,进入Runnable状态。一定会让出。 eg:machine.join()machine为对象,这里表示,主线程等待machine线程运行结束再运行,()中可以是longtime,用来表示time时间后或者运行结束后再运行主线程 如果处于Block状态的线程被其他线程打断,会发生InterruptedException 阻塞事件:等待键盘输入 后台线程(幽灵线程、守护线程)一般是给其他线程提供服务的。如果当前线程里只有后台线程在运行,程序会自动中止。 Thread.currentThread()可以用this替代f,thread.setPriority设置线程优先级 Thread.currentThread().getName()当前线程的名字 注意Thread.yield()的使用,在多个线程存在,而且会随机使用CPU时,需在线程run()中存在这句话 g,Threadt1=newThread(匿名内部类){};t1.start(); newThread(){}.start(); newThread(newRunnable(){}).start; thread.setDaemon(true)设置为守护线程,当正在运行的线程都是守护线程时,java虚拟机会自动中止 h,main方法中的.start()不是线程的启动,而是在这个.start()中自定义线程的启动,这个构造方法必须放在线程class的内部,同步在main方法中new的必须是这个class33,线程同步: a,概念:临界资源:每次只允许一个进程访问的资源。 多个线程并发访问同一个临界资源,会发生线程安全问题,同步锁的方式解决同步读写临界资源时的并发安全问题。 b,关键字:synchronized c,常用的方式:Objectlock=newObject(); publicvoidmethod(){synchronized(lock){}}; 或者:publicsynchronizedvoidmethod(){}; d,java中的同步API StringBuffer:append()同步的 StringBulid:append()不同步的 Vector/Hashtable同步 ArrayList/HashMap非同步的 e,Timer:定时器,自动安排任务的类java.util包 timer.schedule(newTimerTask(publicvoidrun()){},0,1000);安排指定的任务在指定的延迟后开始进行。 f,Object对象的方法: wait()只执行了等待,等待后面的唤醒其他的,在Object超类的子类下都有/notify()/notifyAll()都用于同步锁synchronized中34,部分问答题: A:sleep()和wait()有什么区别?sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。B:同步和异步有何异同,在什么情况下分别使用他们?举例说明。如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 C:启动一个线程是用run()还是start()?启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。D:请说出你所知道的线程同步的方法。wait():使一个线程处于等待状态,并且释放所持有的对象的lock。sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。E:多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?多线程有两种实现方法,分别是继承Thread类与实现Runnable接口,同步的实现方面有两种,分别是synchronized,wait与notifyF:线程的基本概念、线程的基本状态以及状态之间的关系线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。Java中的线程有四种状态分别是:运行、就绪、挂起、结束。G:java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?有两种实现方法,分别是继承Thread类与实现Runnable接口用synchronized关键字修饰同步方法反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。H:线程的基本概念、线程的本状态以及状态之间的关系?新建(Born):新建的线程处于新建状态?就绪(Ready):在创建线程后,它将处于就绪状态,等待start()方法被调用?运行(Running):线程在开始执行时进入运行状态?睡眠(Sleeping):线程的执行可通过使用sleep()方法来暂时中止。在睡眠后,线程将进入就绪状态?等待(Waiting):如果调用了wait()方法,线程将处于等待状态。用于在两个或多个线程并发运行时。?挂起(Suspended):在临时停止或中断线程的执行时,线程就处于挂起状态。?恢复(Resume):在挂起的线程被恢复执行时,可以说它已被恢复。?阻塞(Blocked)–在线程等待一个事件时(例如输入/输出操作),就称其处于阻塞状态。?死亡(Dead)–

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论