资源描述
L 课程知识点调查表
(填表说明:在各知识点后的掌握限度栏内画“√”即可,掌握限度分为A、B、C三类,其中A为:可以依据相关知识点完毕笔试中的填空、判断、代码补全及概念简答等;B为:可以根据程序需求运用相关知识点编写完整的程序代码;C为:可以用语言准确、完整的表述相关知识点及该知识点的典型应用实例。每个知识点的A、B、C三项均可选。)
编号
知识点名称
01
classpath的设立及作用
类文献搜索途径。
可以设立为目录,也可以设立为.(即当前目录)
作用:告诉java虚拟机到哪去寻找用户定义的类和第三方提供的类。当设立了classpath变量之后,JVM会沿着classpath变量中指定的目录去查找要执行的类文献。classpath变量的值可以有多个,值与值之间必须用“;”隔开
如何理解GC:
垃圾回收机制(garbage collection)回收失去引用的内存,程序员不能强制的执行垃圾清理,但是可以建议其回收机制,一般情况下都会按照建议进行。由于程序语句不负责建立和释放内存,jvm自动完毕。涉及到一个方法Finallize();来进行垃圾整理,在清理垃圾是整理内存,不需要我们手动完毕。GC之前执行内存整理的工作的。(一般假如cpu已经占用很多,那么不会去启动释放程序;假如跟建议的垃圾很一致,但是占用内存却很少,垃圾回收机制)
02
path的设立及作用
内部文献搜索途径
设立为javac.exe应用程序所在目录,即..\java\jdk\bin目录
作用:当在命令行窗口中之机运营javac.exe应用程序时,系统一方面会在当前目录(即c:\Documents and Setting\admin)下查找这个程序,然后会沿着path变量中设立的途径继续查找。假如path没有设立,会出现“’javac’不是内部或外部命令,也不是可运营的程序或批解决文献”错误
03
JAVA数据类型( 涉及基本类型和引用类型)
8种基本数据类型:byte,short,int,long,float,double,char,boolean(分别相应8种基本数据类型包装类,finally,不可被继承。此外String和StringBuffer类也是finally的。)
3种引用数据类型:类,接口,数组
04
JAVA基本运算符号
1、算术运算符:+,-,*,/,%,++,--
2、关系运算符:<,>,>=,<=,==,!=
3、逻辑运算符:&,|,&&,||
4、位运算符:>>,<<,>>>,~,^,&,|,!
5、赋值运算符:=,+=,-=,*=,/=,%=
6、字符串连接:=
7、条件运算符:? a>b?x:y
(也可按照单目、双目、三目分类)
05
JAVA程序基本控制语句(if……else、switch……case、while、for)
Java程序设计语言的程序流程控制与C/C++基本相同,总共有三种执行方式:顺序结构、选择结构和循环结构。
选择语句即条件语句有两种:if…else,switch…case
循环语句:while,do…while,for(注意while和do…while区别,for的三个条件)
swtich里支持的数据类型有那四种? byte short char int 以及JDK5.0中的枚举类型
06
数组的概念及使用
数组类型属于复合数据类型,它是由类型相同的元素组成的有序数据集合。因此数组的最重要的特点:元素类型相同;元素有序;所有元素公用一个名称。根据组织数据的结构不同,数组可以分为一维数组、二维数组、……。
一维数组声明:arraytype arrayName[];或arraytype[] arrayName;
初始化分为:1、静态初始化。如:String str[ ] = {“aaa”,”bbb”,”ccc”}; String[ ] str1 = {“111”,”222”,”333”};
2、动态初始化。如:char[ ] charName = new char[5];
注意:动态初始化必须给出长度,否则报错:缺少数组维数。
二维数组声明:arraytype arrayName[][];或arraytype[][] arrayName;
初始化:1、静态初始化。2、动态初始化:可以只指定第一位的长度而不指定第二维的。
此外,数组具有length属性。
当数组是引用数据类型是,必须为每个元素实例化,否则会出现空指针异常。
07
方法的声明及使用
声明:修饰符 返回值类型 方法名 (参数列表){方法体};
在非静态方法中可以直接调用非静态方法
在非静态方法中可以直接调用静态方法
在静态方法中可以直接调用静态方法
在静态方法中调用非静态方法,则需要通过对象调用。
08
方法的重载
方法的重载是多态的实现手段之一,解决了命名空间问题(在类中实现相同功能的方法)
满足条件:1、方法名相同 2、方法的参数类型不同或参数个数不同或参数类型顺序不同 3、返回值类型可以相同也可以不同
09
类的定义
定义:修饰符 class 类名{
成员变量;
方法
}
10
对象的产生与使用
Java语言中使用关键字new调用构造方法来创建新对象。
类名 对象名 = new 类名();
通过对象调用方法或修改属性值。
11
匿名对象
不定义对象的引用名称,而直接调用方法。只能一次性使用。
好处:节省空间(GC)
假如对一个对象需要进行一次调用,可以使用匿名对象。
常用匿名对象作为一个实参传给方法调用,用完之后抛弃。
12
实现类的封装性
面向对象的特性之一(封装、继承、多态、抽象是面向对象的四大特性)
封装是一种信息隐蔽技术:
1、采用接口隐藏类的实现细节
2、在类中对属性封装。由于Java中对属性的操作很弱(例如年龄的问题,可以在set方法中控制),实现程序健壮性。
成员变量使用private关键字修饰,提供setter和getter方法进行设立和返回属性值。
13
构造方法的定义与使用
1、 构造方法定义:方法名与类名相同;无返回值类型;方法中不能使用return返回一个值。
2、 构造方法在实例化对象时自动调用,重要用来为类中属性赋值。
3、 假如一个类的构造方法用private修饰,那么它不能有子类
4、 当使用new关键字创建对象时,会调用构造方法。
14
对象的比较(“==”、“equals()”)
“==”是运算符。比较的是值(基本数据类型)和引用的地址(引用数据类型)
Equals()是 Object中的方法、没有复写情况下和== 同样(用来比较两个对象的hashCode码(散列码)即地址)、String类复写了object类的equals方法,比较的是两个对象的内容
String类覆写equals,一方面比较内存地址(引用),假如相同,返回真;假如不同,继续比较,比较字符串的每个字符,相等返回真,不相等返回假
15
在类内部调用本类方法
静态方法中可以直接调用静态方法,但不能直接调用非静态方法,需要通过对象调用。
非静态方法中可以直接调用,或使用this关键字调用。
16
this关键字的使用
用于区别成员变量和局部变量;
1、 调用本类中的方法:a、一般方法 this.方法名(实参列表)
b、构造方法 this(实参列表),位于构造方法首行
2、 调用本类重的属性(this.属性名)
3、 可以用来表达当前对象
4、 不能与super关键字同时出现在构造方法中
5、 不能用在static修饰的方法或代码块中
17
构造方法的重载
规则与一般方法重载一致。(参见08题)
当采用new关键字创建对象时,会自动调用构造方法,重要用来为类中的属性初始化。
每个类中都有一个默认的无参构造器,当在类中添加一个有参数的构造方法,则默认的构造方法遗失。
18
对象的引用传递
在Java中,参数传递分为基本类型参数传递与对象类型(即引用类型)参数传递。
基本类型参数传递意味着当将一个实参值传递给一个方法时,假如方法修改了该参数,改变的形参,而原始的实参的值保持不变。
引用类型变量传递将一个参数传递给一个方法后,方法接受的是一个引用变量的值,这个值为某个对象的内存地址值。引用变量的参数传递仍然是值传递。
19
static的使用(方法、属性)
可声明成静态变量(全局变量,相对于这个类中的所有实例化对象,只要一个对象改变了它的值,其他对象的所值都改变)
静态方法(不能直接调用非静态方法,要用对象.方法来调用;在非静态方法中能直接调用静态方法,用类名.方法调用)
静态代码块(对静态成员进行初始化),同一个类中优先于主函数和构造方法执行。
(三者的关系是:静态成员声明>静态代码块>构造方法 )
静态方法的好处:便于调用,对于Java虚拟机性能更好
哪些类中全是静态方法:Math,Collections, Arrays
Collection和Collections区别:
Collection是一个接口,不通过键值对来存放对象,是一一存入的,其下有很对子接口来继承,常用的有set,list. set不能存放反复对象,list可以;set决定存放位置,list可以手动。存放的方法是用ADD();取值用iterator取
(同一对象的hashcode相同。不同对象的hashcode也会相同,反例就是:
String s=”abc” String s1=new String(“abc”); s与s1的hashcode同样)
collections是一个类,内部全是静态方法。用来解决集合对象,可以将解决好的对象存放到另一个类中
20
对象数组的使用(静态初始化、动态初始化)
1、 声明及静态初始化:
Person[] ps = Person{ p1,p2,p3 }; //p1,p2,p3分别为Person的对象
2、声明及动态初始化
Person[] p;//对象数组声明
p=new 类名[3];//动态初始化
ps[0]=new Person();//分别对每个元素初始化
ps[0].name=”zhangsan”;
ps[0].age=13;
……
21
类的继承
通过继承可以简化类的定义,扩展类的功能。
extends java只支持单继承。
继承是“is a”的关系。
子类继承父类中非private属性和方法。
子类对象实例化时默认调用父类无参构造方法(子类构造方法首行)。
22
子类对象的实例化过程
当采用new关键字实例化子类对象时,一方面会默认调用父类无参构造方法,接着调用子类构造方法。
23
方法的覆写
作用:扩展父类方法的功能。
1、 只有发生在子类和父类之间
2、 子类方法和父类的方法名、参数、返回值类型都必须一致。
3、 规定子类方法的访问权限不能小于父类的访问权限。
4、 子类实例化父类对象,子类调用父类的方法时,会默认调用子类中覆写父类的那个方法
5、 子类继承父类的方法,访问权限只能扩大不能缩小,可用public,protected,或default,其中protected和default的区别就是后者必须在同一个包里。private的使用的好处,代码隐藏,安全;对赋值的限制。假如只是在本类中使用,不想外界得到,只要写SET方法就可以,不写GET方法(对赋值限制的体现)。
public,protected,default,private的区别
(1)public:是公用的,不同包也可访问
(2)protected;doGet()和doPost()就是protected的,是在不同包内的,但继承了不是同一个包的方法,子类是能访问的
(3)default(默认的);只是在同一个包内才可以被访问。
(4 private;只有在本内中才可访问
24
super的使用
super调用父类的属性:super.属性名;
super调用父类的方法:super.方法名(实参列表);
调用父类中特定构造方法:super(实参列表);
调用父类中构造方法时,super()必须放在子类构造方法的首行。this和super不能同时调用构造方法。
用super调用父类中的方法时,会调用子类中被覆写了的方法。假如子类中没有覆写父类中的方法,仍能用super调用父类中的方法
Ps:一个类的构造方法假如用private修饰,那么它不能有子类。
25
this与super的区别
this用于调用本类的属性和方法,或代表当前对象。
super用于调用父类的属性和方法。
两者不能同时调用构造方法。
26
final关键字
修饰符。可以修饰变量、方法、类。
final修饰的变量为常量,只能被赋值一次
final修饰的方法不能被复写
final修饰的类不能被继承(构造方法不能被复写)String,Maths都是用final修饰的类。
27
抽象类的使用
抽象类用abstract关键字修饰。抽象类仅提够一个类的部分实现。抽象类可以有实例变量,可以同时有抽象方法和具体方法,它提供一个继承的出发点,不能呢个被实例化。因此,抽象类只能用来继承。
不能被直接实例化
抽象类的子类,要么是抽象类,要么实现抽象父类的所有抽象方法(复写)
抽象类可以有构造方法。
28
接口的使用
接口是常量和抽象方法的集合。
接口中不能有普通方法和变量。常量必须被赋值。
接口可以实现多继承(即接口可以继承一个到多个接口,但不能继承类)
一个类可以实现多个接口
接口不能有构造方法
extends和implements同时出现,extends写在implements前面
抽象类可以实现接口,并且不必实现接口中的所有抽象方法。
Ps:抽象类和接口的区别
抽象类和接口是Java面向对象体系当中非常重要的两个元素,在语法和使用方面都有很多的区别,下面我就从这两个方面来回答这个问题:
第一, 接口和抽象类在语法上的区别重要体现在以下的几个方面:
a) 一个类可以实现多个接口,而除了Object之外,一个类只能继承一个父类;
b) 接口当中所有的方法都是抽象方法,并且默认为public权限,而抽象类当中可以有抽象方法,也可以没有抽象方法
c) 接口当中的变量所有为全局常量,而抽象类当中可以定义任何类型的变量;
d) 抽象类当中有构造函数,而接口没有;
第二, 在使用方面,接口使用的会更多一些,由于接口可以更好的隐藏实现的细节,减少系统的耦合度,从而提高可扩展性,下面就谈一下我在开发中所理解的抽象类和接口的区别:
a) 在我经常使用的设计模式当中,如工厂模式,依赖诸如模式,DAO模式等,重要使用的是接口,而抽象类只在模板模式当中有一些比较局限的应用;
b) 在我经常使用的Spring和Hibernate当中,接口的使用也占了很大的比例,特别是在Spring当中,模板模式也被改导致使用接口实现;
所以说在平常的开发当中,接口的使用更加的频繁,由于它可以更好的解除耦合,现在的面向对象也提倡少用继承,使用面向接口的编程方法会更好。
29
对象的多态性,向上转型及向下转型的概念
对象的多态性表现为转型(即向上转型和向下转型)及方法的重载和复写。
1、转型:规定两个转型的对象有继承或实现关系。。
向上转型:子类对象转换成父类对象,自动转换。
父类对象用子类实例化。
转型后的对象不能调用子类对象特有的方法。但调用的方法为子类自身的方法。
向下转型:父类对象转换成子类对象,需要强制转换。
只有发生过向上转型,才干发生向下转型。
使用什么方法时,需要使用向下转型:getAttribute();arraylist 和 hashmap等任何connection对象里的get()方法;过滤器里的方法
2、方法的重载是多态的实现手段之一,解决了命名空间问题(在类中实现相同功能的方法)
满足条件:A、方法名相同
B、方法的参数类型不同或参数个数不同或参数类型顺序不同
C、返回值类型可以相同也可以不同
3、方法的覆写,作用:扩展父类方法的功能
A、只有发生在子类和父类之间
B、子类方法和父类的名称、参数、返回值类型都必须一致。
C、规定子类方法的访问权限不能小于父类的访问权限。
转型时,会容易发生classCastException错误。为什么要设计向上转型:ArrayList是一个类,可以方其他的很多类型的对象,如称arr,但在开发时只放一个单一的类型,相称于重新分派空间。否则取的时候很麻烦。存放时的用add()方法,放的是Object类型的对象,即只要属于引用对象就能放入。如放入一个字符串,在放入arr.add()那一刻,发生了向上转型,好处是实现更多类型的兼容,对象的具体特性丢失,即精度丢失。要从多种类型中取出具体的对象类型,即找回精度,就要发生向下转型。
30
对象多态性在抽象类及接口上的应用
面向接口编程的优点:1、调用者不用知道其使用对象的具体所属类
2、一个对象可以很容易被另一个对象(同样实现了接口)所替换
3、对象间的连接不必硬绑定到一个类的对象上,因此增长了灵活性
4、松耦合性
5、提高可扩展性
缺陷:设计复杂性有所增长
工厂模式是面向接口编程的一个典型应用。
工厂模式是OCP(开放封闭法则)的一种解决方案
工厂模式原理: 1、采用面向接口编程的设计思想
2、减少系统的耦合度
3、提高程序的可扩展性
组成部分: 1、产品(抽象产品),用接口或抽象类实现
2、具体产品,是抽象类(产品)的子类或实现了接口(产品)的类
3、生产者(工厂),负责生成产品对象
应用产品:需求改变时只需要改变工厂,得到不同的产品实例。
31
异常的概念及使用
异常是程序中断错误中断了正常指令流的一种事件。通过异常解决机制,可以用一种结构化的可控方式来解决运营时的错误。在Java中所有的异常都用类来表达,并且所有的异常类都是继承自java.lang包中的Throwable类。
Throwable类有两个直接子类:Error(用来表达编译和运营错误,如程序进入死循环,内存溢出等,Error解决一般由系统承担,java自身不提供相应的Error解决机制)和Exception(用来表达由程序活动所导致的错误,如运算时除数为零等。当程序运营出现Exception时,在程序中加入异常解决代码,仍可使程序继续运营直至程序结束。由于Exception是可以检测和解决的,因此产生了相应的异常解决机制)。
java编译器规定方法必须声明抛出也许发生的非运营时异常,但是并不规定必须声明抛出未被捕获的运营时异常。
异常(即exception和error,两者是平级的,且都是继承自throwable)
(代码有错不能容易捕获异常,否则容易存在一直存着NULL值的问题,例如:表单中有一控件名为name1(用户名,应当是name,写错成name1),但servlet取的name值,则name的值为null,会报空指针异常的错误,若此时用异常捕获,虽然不报错,但数据库里却插入的数据,且用户名的值都是null)
常见运营时异常:算数运算异常,空指针,数组下标越界,数字格式化异常,类转换异常
常见异常:IO异常(必须捕获和抛出),SQLException , ServletException, ClassNotFoundExceptiom
异常的使用:
1、捕获异常:try…catch()
2、抛出异常:在捕获一个异常对象之前,try代码块中必须生成一个异常对象并把它抛出。异常既可以由java虚拟机自动抛出,也可以通过throw语句手动抛出异常。(throw语句必须为异常创建一个对象,不能仅抛出一个类型。)
3、异常声明:在某些情况下,假如一个方法产生自己不解决的异常,它就必须在throws字句中声明该异常,它属于方法声明的一部分,紧跟在形参列表之后。
4、自定义异常:继承自Exception类。不推荐使用。
32
Java类的编写规范
1、 名字必须为一个标记符
2、 类名或接口名首字母大写,其余每个单词的首字母大写
3、 方法名的首字母小写,其余单词的首字母大写,方法名尽量用动词。如:getName
4、 变量名与方法名一致,变量名尽量用名词,
5、 临时变量简朴即可
6、 尽也许采用故意义的单词
7、 包名小写
33
try…catch语句的使用
try代码块中是一段也许产生异常的代码,又称“监控区域”;catch语句的参数涉及一个异常类型和一个异常对象。该异常类型指明了catch语句所解决的异常类型,异常对象则在try中产生。{}中为对异常的解决。
与一个try相关的catch语句可以有一个或多个,异常的类型决定了要执行那个catch语句。
执行顺序:1、一方面执行try代码块中的所有语句
2、 假如try{}中无异常产生,不执行catch(){},直接执行catch之后的语句
3、 假如try{}中有异常产生,则发生异常之后的语句不会被执行,直接跳到catch(){}中执行。之后顺序执行。
4、 假如catch(){}中的异常类型与产生的不同,则执行顺序与未捕获异常同样。
34
throws与throw 的使用方法
throws用在方法的声明处,表达此方法不解决该类异常,而是交给方法的调用处解决。
throw用在方法的内部,用来手动的抛出异常对象。要么与try…catch一起使用,要么与throws一起使用。
35
finally关键字
对于一些代码,也许会希望无论try中的异常是否被抛出,它们都能得到执行。可以在异常解决程序后加上finally子句。那么退出try…catch后,无论发生异常或者不发生异常,都会执行该段代码。
finally必须用在异常中,不能孤立的使用,至少必须有TRY语句(但只有try,没有catch和finally会报错,即try,catch和finally都不能单独使用;一个try可以有多个catch;try没有catch也行,但必须要有finally;不管之前是否抛出异常,都会执行finally;现在try中加一个return语句 ,但finally仍然会执行,且先执行finally再执行return;finally的作用是关闭资源),finalize()是在GC清理垃圾前做的整理工作,是一个方法
final是修饰符
39
List、ArrayList的使用
List接口继承自Collection接口,以定义一个允许反复项的有序集合。此接口不仅可以对列表的一部分进行解决,还添加了面向位置的操作。
List有两个重要的实现类,分别为:ArrayList和LinkedList。使用哪种取决于特定的需求,假如要支持随机访问,而不必在除尾部的任何位置插入或删除元素,那么可以选用ArrayList;如贵哦要频繁的从列表的中间位置添加和删除元素,并且只规定顺序的访问列表元素,那么LinkedList是更好的选择。
LinkedList类添加了一些解决列表两端元素的方法,可以轻松的把LinkedList当作一个堆栈、队列或其他面向端点的数据结构,来实现堆栈或队列的操作。
ArrayList类封装了一个动态再分派的Object[]数组。每个ArrayList对象有一个数值,这个数值用来表达存储列表中元素的数组的容量。当元素添加到ArrayList时,这个数值会在常量时间内自动增长。
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
Arraylist的使用
将A,B,C存入arraylist,并取出Arraylist str = new Arraylist();
str.add("A"); str.add("B"); str.add("C");
遍历取出:for(int i = 0;i<str.size();i++){
str.get(i);}
或者str.get(0);str.get(1);str.get(2);
Arraylist作用是便于传对象,且该对象可以存放别的类型的对象,什么时候涉及到,什么时候传递多个对象的时候使用,此时才干发挥他的价值
40
Map、HashMap的使用
Map接口不是Collection接口的继承。Map接口用于维护键-值对。该接口描述了从不反复的键到值的映射。(注意:键和值都可认为null,但是不能把Map作为一个键或值添加给自身,由于映射中键的集合必须是唯一的,用Set来支持)。
集合框架中提狗狗两种常规的Map实现:HashMap和TreeMap(TreeMap实现SortedMap接口)。在Map中插入、删除和定位元素,HashMap是最佳选择。而假如要按自然顺序或自定义顺序遍历键,那么TressMap更好。
HashMap与HashTable区别:
HashMap是HashTable的轻量级实现(非线程安全的实现),他们都完毕了Map接口,重要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上也许高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把HashTable的contains方法去掉了,改成containsValue和containsKey。由于contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,HashTable的方法是Synchronize的,而HashMap不是,在多个线程访问HashTable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
HashTable和HashMap采用的hash/rehash算法都大约同样,所以性能不会有很大的差异。
41
Set、TreeSet、HashSet
Set接口继承自Collection接口,并且它不允许集合中存在反复项,每个具体的Set实现类依赖添加对象的equals()方法来检查唯一性。Set没有引入新方法,所以Set就是一个Collection,只但是其行为不同。
TreeSet和HashSet是集合框架支持Set接口两种普通的实现。多数情况下,使用HashSet存储反复自由的容器。
HashSet是为快速查找而设计的Set,存入HashSet的对象必须定义hashCode()。
TreeSet是保持顺序的Set,底层为树结构,使用它可以从Set中提取有序的序列。
42
Iterator的使用
Iterator可以遍历各种不同集合中的元素。该接口描述的是以统一方式对各种集合元素进行遍历/迭代的工具,又称迭代器。该接口中值定义了几个简朴的方法:hasNext()用于判断集合中是否仍有元素可以迭代,next()用于返回迭代的下一个元素,remove()将当前迭代到的元素从迭代器指向的集合中移除。
我们一般不直接创建Iterator对象,而是通过调用集合对象的iterator()方法来获取,实际返回的是Iterator接口不同实现类的对象。
43
String与StringBuffer的区别及使用
String类和StringBuffer类都可以实现储存和操作字符串,即包含多个字符的字符数据。
(1) String是由final修饰的,不能被继承. String 是不可改变的类,如String a=”b”; String a=”c”;这两个a是不同的 ,是2个对象,a=”c”时,是又重新定义了一个对象。String a=new String(”b”);有2个对象,都是在堆内存里的;而栈内存里存的是a
(2) StringBuffer(为了解决创建对象耗时的问题),它是可变的,其有一个方法,append的方法。append的方法,使用的时候将StringBuffer a=new StringBuffer();a.append(“abc”);a.append(“efg”);最后用a.toString();就可得到一个字符串,将StringBuffer变成String来使用。有另一个方法StringBuilder(),是一个不安全的方法,实现起来,不安全的执行速度快。------StringBuffer类表达的是内容可以修改的Unicode编码字符序列,其对象创建后,所保存的字符串内容和长度都可以修改。事实上每个StringBuffer对象都拥有一个可变容量的字符串缓冲区,该缓冲区的容量可以随着内容的增长自动扩充,也可以直接设定。
---------------StringBuilder是JDK5.0后增长的一个字符串解决类,该类可以提够与StringBuffer相同的功能。区别在于StringBuffer是线程安全的,而StringBuilder不是,即不保证其对象的同步性。因此,StringBuilder拥有更高的效率。
常见的类:
1. Sting;2. ArrayList; 3. HashMap;4. HttpServlet(抽象类);5 .Math;6. Date;7. StringBuffer; 8.Exception
String里的常用方法:
1.Equals();2、charAt();3.length();(List里的length是属性,,而String里的是方法,又括号的)
4.substring();5.indexOf(int ch);6.trim();7.replace();(在javaScript里只替换一个);8.replaceAll();(在javaScript里就是替换多个);9.valueOf();(把各种基本数据类型转化为String型)
Srtring a="";和String b;的区别:String a=""是空字符串,可以调用String类的任何方法,,而Stirng b;是null,值,并没有给他开辟任何空间。
Clone:
把一个对象复制给一个对象,如:在百度收信息,需要记录用户每次查询的关键字,先是存内存(把关键字放入Static ArrayList内,他是,具有共享性,用Static来修饰,可以每次用户来输入关键字时,就不用每次都要new新的ArrayList而是直接共享),再入库()
44
Date、Calendar的使用
45
多线程 两种实现方式 场景 涉及的术语
1、实现方法:继承Thread类或实现Runnable接口。
区别:a、Runnable是Thread的接口,多数情况下推荐使用继承接口的方式生成线程。由于接口可以实现多线程,并且Runnable只有一个run()方法,适合继承。
b、在继承Thread时只需new一个实例,调用start()方法即可以启动一个线程;而在使用Runnble的时候需要先new一个实现Runnable的实例,之后用子类Thread调用。
2、线程状态转换:新建态(new();),就绪态(start();),运营态,阻塞态,终止态。
3、线程调度:Java线程的调度不一定是分时的,必须保证代码中的线程会不是地给其它线程运营的机会。以下方法可以做到:
A、让处在运营状态的线程调sleep()方法 线程睡眠; B、让处在运营状态的线程调用yeild()方法 线程让步; C、让处在运营状态的线程调用另一个线程的join()方法(非静态)
当一个正在运营的线程调用了另一个线程的join()方法,那么这个正在运营的线程转到阻塞状态,直至另一个线程运营结束才会恢复运营。
sleep()和yield()的区别:
A、 sleep()方法会其他线程的运营机会,而不考虑其它线程的优先级,而yield()方法智慧给相同优先级或更高优先级的线程运营机会。
B、 当线程执行sleep()方法会转到阻塞状态,而执行yield()方法会转到可运营状态(就绪状态)
C、 Sleep()声明会抛出异常,而yield()方法不会
D、 Sleep()比yield()方法具有更好的移植性,由于yield()方法的实现依赖于底层操作系统对线程的调度策略。
5、 线程同步(Thread Synchronization)通过synchronized关键字实现。
线程同步的特点:a、一把锁可以锁住多个同步代码块; b、锁对非同步代码块无效; c、当一个线程进入同步代码块,并不意味着指定代码必须不以中断的方式运营; d、当一个线程占有了某个对象的锁,其它需要获得这个锁的线程就进入到锁池中,等待获得锁的机会。
6、线程的通信:wait()和notify()/notifyAll()
7、死锁:当一个线程等待由另一个线程持有的锁,而后者正在等待已被第一个线程持有的锁时,就会发生死锁(必须手动结束)。
46
I/O 基本读写文本文献操作
FileInputStream和FileoutStream
public void read(){
FileInputStream in;
try {
in = new FileInputStream("E:\\ss.txt");
int data;
while((data = in.read()) != -1){
System.out.println(data + " abc");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void write(){
try {
FileOutputStream fo = new FileOutputStream("e:\\asd.txt");
fo.write("你好".getBytes());
fo.close();
} catch (FileNotFoundException)
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
字节流:InputStream、OutputStream
字符流:Reader、Writer
通过Inp
展开阅读全文