1、%Java学习笔记目 录一、 Java技术基础编程语言 Java的特点 Java开发环境 Java开发环境配置( Linux命令与相关知识 Eclipse/Myeclipse程序结构二、 Java语言基础基础语言要素八种基本数据类型常量和变量运算符与表达式编程风格:流程控制语句数组字符串方法三要素插入排序冒泡排序冒泡排序:轻气泡上浮的方式二分法查找 Java系统API方法调用二进制基础 Java基础其他注意事项三、 面向对象类对象包方法及其调用。引用访问控制(封装)构造器 super()、super和 this()、this重载和重写继承 static final(多态抽象类接口内部类匿名类二
2、维数组和对象数组其他注意事项四、 Java SE核心I; Object类 String类 StringUtils类 StringBuilder类正则表达式 Date类 Calendar类 SimpleDateFormat类 DateFormat类包装类 BigDecimal类 BigInteger类 Collection集合框架 List集合的实现类ArrayList和LinkedList Iterator迭代器泛型&增强型for循环 List高级数据结构:Queue队列 List高级数据结构:Deque栈 Set集合的实现类HashSet Map集合的实现类HashMap单例模式和模版方法模
3、式五、 Java SE核心II Java异常处理机制 File文件类 RandomAccessFile类基本流:FIS和FOS缓冲字节高级流:BIS和BOS基本数据类型高级流:DIS和DOS字符高级流:ISR和OSW缓冲字符高级流:BR和BW文件字符高级流:FR和FW| PrintWriter对象序列化 Thread线程类及多线程 Socket网络编程线程池双缓冲队列 Java技术基础编程语言/机器语言:0 1在硬件直接执行汇编语言:助记符高级语言: (Java运行比C/C+慢)1)面向过程的高级语言:程序设计的基本单位为函数,如:C/C+语言。2)面向对象的高级语言:程序设计的基本单位为类,
4、如:Java、C#。 Java的特点平台无关性、简单性、面向对象、健壮性、多线程、自动内存管理。平台无关性:指Java语言平台无关,而Java的虚拟机却不是,需要下载对应平台JVM虚拟机的。自动内存管理:对临时存储的数据自动进行回收,释放内存。如:引用类型的变量没有指向时,被回收;程序执行完后,局部变量被回收。 Java开发环境Java Developement KitJava开发工具包,简称JDK,是由Sun公司提供的一个免费的Java开发工具,编程人员和最终用户可以利用这个工具来编译、运行Java程序。目前版本有、()、()、()。JDK结构:JDK |-开发工具(Tools)命令:jav
5、a、javac、jar、rmic . |- JRE(Java基本运行环境) |-系统API库,系统类库 | 系统带来的标准程序库,标准API |- J VM java虚拟机 java 语言的执行环境 Java开发环境配置安装完JDK之后,不能立刻使用,需要设置环境变量:1)设置PATH:D:Java(指向JDK中bin文件夹,有各种编译命令)。2)CLASSPATH:告诉Java程序去哪里查找第三方和自定义类,如果 .class文件和类源文件在同一文件夹内,则不需要配置classpath,后续有包,则需要。AWindows:在命令行执行set CLASSPATH=E:workspace1304
6、bin (临时环境配置)java u 注意事项:v E: set classpath= c: (不加分号就不找当前路径) = . ; c: ; d: ;(先找classpath,若无,再找当前路径)v C、D两盘有同名 . class 文件,classpath设置为D盘,而命令行窗口当前盘符为C盘,则JVM现找classpath路径,后找当前路径。BLinux:在控制台执行设置CLASSPATH环境变量,指向package所在的目录,一般是项目文件夹中的bin目录。?执行java (包名必须写)。 export CLASSPATH=/home/soft01/workspace/1304/bin
7、 (临时环境配置) java java -cp /home/soft01/workspace/1304/bin (二合一)u 注意事项:v Windows根目录是反斜线:v Linux根目录是斜线:/ Linux命令与相关知识?1)Linux无盘符,只有一个根目录(root)2)终端 = 控制台 = 命令行窗口3)pwd:打印当前工作目录,显示当前工作目录的位置4)ls:列表显示目录内容,默认显示当前目录内容5)cd:改变当前工作目录;cd后不加参数=返回home文件夹;cd :返回home; cd /:切换到根目录;cd . :返回上一层目录(相对的);6)mkdir:创建文件夹(目录) 注
8、意:目录 = 文件夹7)rm:删除文件;rm xx xx:可删多个文件; rm rf xx:-为减号,r表递归,f表强制8)cat xx:显示文本文件内容9)启动Java开发工具:cd/opt/eclipse ./eclipse . 表当前目录下10)绝对路径: /home (以 / 开始为绝对路径,相对于根目录) 相对路径:home (相对于当前工作目录)11)home(用户主目录,用户的家):/home/username 如:/home/soft0112)主目录(home):有最大访问权限:什么都能干,增删改查、建目录等 其他地方:一般只能查看,不能增删改查、创建目录等、 Eclipse/
9、Myeclipse程序结构Project项目文件 |- src源文件| |- Package包|-.java源文件 |- bin |- Package包|- .class字节码程序u (u 注意事项:v 消耗少,最稳定Java语言基础基础语言要素1)标识符:给类、方法、变量起的名字A必须以字母或下划线或 $ 符号开始,其余字符可以是字母、数字、$ 符号和下划线。B只能包含两个特殊字符,即下划线 _ 和美元符号 $ 。不允许有任何其他特殊字符。C标识符不能包含空格。!D区分大小写。2)关键字:只有系统才能用的标识符u 注意事项:v true、false、null不是关键字!是字面量。v main
10、不是关键字!但是是一个特殊单词,可以被JVM识别,主函数是固定格式,作为程序的入口。v 注释:单行注释:0*210(2次方)=*211(3次方)= . 10*21010(10次方)v 尾数: . 10 指数:1010 基数:2v 浮点数字面量默认都为double类型,所以在定义的float型数据后面加F或f;double类型可不写后缀,但在小数计算中一定要写D或。v ,v float 的精度没有long高,有效位数(尾数)短。v float 的范围大于long 指数可以很大。v 浮点数是不精确的,不能对浮点数进行精确比较。3)一种字符类型(char):char:16位,是整数类型,用单引号括起
11、来的1个字符(可以是一个中文字符),使用Unicode码代表字符,0216-1(65535)。u 注意事项:v 不能为0个字符。v 转义字符:n 换行 r 回车 t Tab字符 双引号 表示一个v v 两字符char中间用“+”连接,内部先把字符转成int类型,再进行加法运算,char本质就是个数!二进制的,显示的时候,经过“处理”显示为字符。4)一种布尔类型(boolean):true真 和false假。5)类型转换: char-自动转换:byte-short-int-long-float-double 强制转换:会损失精度,产生误差,小数点以后的数字全部舍弃。 容易超过取值范围。常量和变量
12、变量:内存中一块存储空间,可保存当前数据。在程序运行过程中,其值是可以改变的量。、1)必须声明并且初始化以后使用(在同一个作用域中不能重复声明变量)!2)变量必须有明确类型(Java是强类型语言)。3)变量有作用域(变量在声明的地方开始,到块结束)。变量作用域越小越好。4)局部变量在使用前一定要初始化!成员变量在对象被创建后有默认值,可直接用。5)在方法中定义的局部变量在该方法被加载时创建。常量:在程序运行过程中,其值不可以改变的量。u 注意事项:v 字面量、常量和变量的运算机制不同,字面量、常量由编译器计算,变量由运算器处理,目的是为了提高效率。eg:小于32位数的字面量处理byte b1
13、= 1; byte b2 = 3; u 注意事项:v int类型指:byte、short、int,只能写long类型,要写也必须强转成int类型;而byte、short为自动转换成int。v swtich-case:若case中无符合的数,并且default写在最前(无break时),则为顺序执行,有break或 则退出。v swtich-case:若case中无符合的数,并且default写在最后,则执行default。v swtich-case:若case中有符合的数,并且default写在最后,并且default前面的case没有break时,default也会执行。【2)循环控制语句f
14、or:最常用,用在与次数有关的循环处理,甚至只用for可以解决任何循环问题。u 注意事项:for中定义的用于控制次数的循环变量,只在for中有效,for结束则循环变量被释放(回收)。while:很常用,用在循环时候要先检查循环条件再处理循环体,用在与次数无关的情况。如果不能明确结束条件的时候,先使用while(true),在适当条件使用if语句加break结束循环。do-while:在循环最后判断是否结束的循环。如:使用while(true) 实现循环的时候,结束条件break在while循环体的最后,就可以使用 do-while 。do-while 的结束条件经常是“否定逻辑条件”,不便于思
15、考业务逻辑,使用的时候需要注意。可以利用while(true)+ break 替换。循环三要素:A循环变量初值 B循环条件 C循环变量增量(是循环趋于结束的表达式)for和while循环体中仅一条语句,也要补全 ,当有多条语句,且不写 时,它们只执行紧跟着的第一条语句。 循环的替换: while(布尔表达式) 等价 for(;布尔表达式;) while(true) 等价 for(;) while(true) + break 替换 dowhile(布尔表达式); for(;) + break 替换 dowhile(布尔表达式);3)跳转控制语句continue:退出本次循环,直接执行下一次循环b
16、reak:退出所有循环数组&类型一致的一组数据,相当于集合概念,在软件中解决一组,一堆XX数据时候使用数组。1)数组变量:是引用类型变量(不是基本变量)引用变量通过数组的内存地址位置引用了一个数组(数组对象),即栓到数组对象的绳子。eg:数组变量的赋值u int ary = new int3;quals(cmd) 比(1) 要好。方法三要素方法:method(函数function = 功能) y=f(x) 1)方法的主要三要素:方法名、参数列表、返回值。2)什么是方法:一个算法逻辑功能的封装,是一般完成一个业务功能,如:登录系统,创建联系人,简单说:方法是动作,是动词。(3)方法名:一般按照方
17、法实现的功能定名,一般使用动词定义,一般使用小写字母开头,第二个单词开始,单词首字母大写。如:createContact() 。4)参数列表:是方法的前提条件,是方法执行依据,是数据。如: login(String id, String pwd) ,参数的传递看定义的类型及顺序,不看参数名。5)方法返回值:功能执行的结果,方法必须定义返回值,并且方法中必须使用return语句返回数据;如果无返回值则定义为void,此时return语句可写可不写;返回结果只能有一个,若返回多个结果,要用数组返回(返回多个值)。u 注意事项:递归调用:方法中调用了方法本身,用递归解决问题比较简练,只需考虑一层逻辑
18、即可!但是需要有经验。一定要有结束条件!如:f(1)=1; 递归层次不能太深。总之:慎用递归!插入排序将数组中每个元素与第一个元素比较,如果这个元素小于第一个元素,则交换这两个元素循环第1条规则,找出最小元素,放于第1个位置经过n-1轮比较完成排序。 for(int i = 1; i ; i+) int k = arri;1)开始令low=0(指向3),high=7(指向88),则mid=3(指向36)。因为kmid,故确定应在后半段中查找。3)令新的low=mid+1=2(指向24),而high=2(指向24)不变,则新的mid=2,此时k=arrmid,查找成功。如果要查找的数不是数列中的
19、数,例如k=25,当第四次判断时,kmid2,在后边半段查找,令low=mid+1,即low=3(指向36),high=2(指向24)出现lowhigh的情况,表示查找不成功。 Java系统API方法调用Arrays类,是数组的工具类,包含很多数组有关的工具方法。如:1)toString() 连接数组元素为字符串,方便数组内容输出。2)equals 比较两个数组序列是否相等。-3)sort() 对数组进行排序,小到大排序。4)binarySearch(names, Tom) 二分查找,必须在有序序列上使用。二进制基础1)计算机中一切数据都是2进制的! 基本类型,对象,音频,视频。2)10进制是
20、人类习惯,计算按照人类习惯利用算法输入输出。 10 -算法转化- 1010(2) 1010 -算法转化- 10 3)16进制是2进制的简写,16进制就是2进制!4)计算机硬件不支持正负号,为了解决符号问题,使用补码算法,补码规定高位为1则为负数,每位都为1则为-1,如1111 1111 = -1 = 0xff:5)二进制数右移:相当于数学 / 2(基数),且正数高位补0,负数高位补1;二进制字左移:相当于数学 / 2(基数),且不论正负,高位都补0。6)注意掩码运算:把扩展后前面为1的情况除去,与0xff做与运算。eg1:二进制计算int max = 0x7fffffff; long l =
21、max + max + 2; l );和 this() Cell c = new Cell(); + ,+; class Cell int x; int y; public Cell() this(1,1);Foo);lass类进行初始化。在堆内存中开辟空间,分配内存地址,栈内存中开辟空间也就有了。在堆内存中建立对象的特有属性,并进行默认(隐式)初始化。对属性进行显式初始化。对对象进行构造代码块初始化。对对象进行对应的构造器初始化。将内存地址赋给栈内存中的P变量。 final最终的,可以修饰:类、方法、变量(成员变量和局部变量)。1)final 修饰的类:不能再继承。、2)final修饰的方法
22、:不能再重写。3)final 的方法和类,阻止了动态代理模式!动态代理模式广泛的应用在: Spring Hibernate Struts2 4)企业编程规范:不允许使用final 的方法和类!5)final的变量:final变量只能初始化一次(赋值一次,且方法中不能有给final变量赋值的语句!因为方法可被调用多次!),不能再修改!也可在方法的参数列表中添加final。eg1:final的局部变量final int a;a = 5;宏观说:字面量和常量都称为常量!多态继承体现了多态:父类型变量可以引用各种各样的子类型实例,也可接收子类对象。个体的多态:父类型的子类型实例是多种多样的。行为的多态
23、:父类型定义方法被子类重写为多种多样的,重载也是多态的方法。1) 千万不能出现将父类对象转成子类类型,会造型异常!2) 多态前提:必须是类与类之间有关系。要么继承,要么实现。通常还有一个前提:存在覆盖。3) 多态的好处:多态的出现大大的提高程序的扩展性。4) 多态的弊端:虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。5)在多态中成员函数的特点:在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。(在运行时期:参阅对象所属的类中是否有调用的方法。简单总结就是:成员方法在多态调用时,编译看左边,运行看右边。6)在多态中,成员变量的特点:无论编译和运
24、行,都参考左边(引用型变量所属的类)。7)在多态中,静态成员方法和属性的特点:无论编译和运行,都参考做左边。8)父类引用指向子类对象,当父类想使用子类中特有属性、方法时,要向下转型。抽象类抽象就是将拥有共同方法和属性的对象提取出来,提取后,重新设计一个更加通用、更加大众化的类,就叫抽象类。1)abstract关键字可以修饰类、方法,即抽象类和抽象方法。2)抽象类可以有具体的方法,或者全部都是具体方法,但一个类中只要有一个抽象方法,那么这个类就是抽象类,并且必须用abstract修饰类。3)抽象类可以被继承,则子类必须实现抽象类中的全部抽象方法,否则子类也将是抽象类。抽象类也可主动继承实体类。4
25、)抽象类不能实例化,即不能用new生成实例。5)可以声明一个抽象类型的变量并指向具体子类的对象。6)抽象类可以实现接口中的方法。7)抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。接口interface 差不多 = = abstract class1) |2) 接口是like a :“像”我中的一种,是继承体系之外的,用于功能扩展!想扩展就实现,不想就不用实现。3) 接口中只能声明抽象方法和常量且声明格式都是固定的,只不过可以省略。eg:接口中声明常量和抽象方法的格式是固定的 interface Runner /*public abstract final*/int SPEED=10
26、0;ew Inner();5)当内部类在成员位置上,就可以被成员修饰符所修饰。比如private:将内部类在外部类中进行封装。6)静态内部类:被static修饰后就具备了静态的特性。当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。在外部其他类中,如何直接访问static内部类的非静态成员呢new ().function();在外部其他类中,如何直接访问static内部类的静态成员呢u 注意事项:v 当内部类中定义了静态成员,该内部类必须是static的。v 当外部类中的静态方法访问内部类时,内部类也必须是static的。7)内部类想调用外部类的成员,需要使
27、用:外部类名this成员,即OutterClassNamethis表示外部类的对象。如果写this成员= =成员,调用的还是内部类的成员(属性或方法)。8)Timer 和 TimerTask:继承TimerTask 重写run()方法,再用Timer类中的schedule方法定时调用,就能自动启用run()(不像以前似的要用 XXX 调用)。eg:内部类】 class Xoo Timer timer = new Timer(); public void start() (new MyTask(), 0, 1000);quals方法去和变量进行比较,即:if(Hello.equals(str)因
28、为这样不会产生空指针异常。而反过来用,即:if(Hello)则我们不能保证变量不是null,若变量是null,我们在调用其equals方法时会引发空指针异常,导致程序退出。若都为变量则if(str!=null&(str1)也可。4)String另一个特有的equals方法:euqalsIgnoreCase,该方法的作用是忽略大小写比较字符串内容,常用环境:验证码。if(hello.equalsIgnoreCase(str)。5)String的基本方法:String toLowerCase():返回字符串的小写形式。如:()String toUpperCase():返回字符串的大写形式。如:()
29、String trim():去掉字符串两边的空白(空格tnr),中间的不去。如:()】boolean startsWith():判断字符串是否以参数字符串开头。如:(s)boolean endsWith():判断字符串是否以参数字符串结尾。如:(s)int length():返回字符串字符序列的长度。如:()eg:如何让HelloWorld这个字符串以hello开头成立 if().startsWith(hello)ength();v String charsetName) :通过使用指定的charset解码指定的byte数组,构造一个新的String。如:String str=new Stri
30、ng(bs,UTF-8);10) split方法(拆分):字符串的拆分。String split(String regex):参数regex为正则表达式,以regex所表示的字符串为分隔符,将字符串拆分成字符串数组。其中,regex所表示的字符串不被保留,即不会存到字符串数组中,可理解为被一刀切,消失!】eg:对图片名重新定义,保留图片原来后缀 String name=; String nameArray=(.); 特殊含义,所以用. 转义数组长度:+;长度为0任意字符都切一刀,都被切没了String newName=3.+nameArray1;新图片名:+newName);u 注意事项:分隔
31、符放前、中都没事,放最后将把无效内容都忽略。 String str=123,456,789,456,; String array=(,);ppend(好好学习) .append(天天向上); |)4) 月里边的天-号; 星期里的天-星期几 年里的天Calendar calendar=(); int year=;int month=;int day=;1) 年+(month+1)+月+day+日);、(、ength()+位); Collection集合框架在实际开发中,需要将使用的对象存储于特定数据结构的容器中。而JDK提供了这样的容器集合框架,集合框架中包含了一系列不同数据结构(线性表、查找表
32、)的实现类。1)Collection常用方法:int size():返回包含对象个数。boolean isEmpty():返回是否为空。boolean contains(Object o):判断是否包含指定对象。void clear():清空集合。boolean add(E e):向集合中添加对象。boolean remove(Object o):从集合中删除对象。boolean addAll(Collection c):另一个集合中的所有元素添加到集合boolean removeAll(Collection c):删除集合中与另外一个集合中相同的原素Iterator iterator():返
33、回该集合的对应的迭代器2) Collection和Collentions的区别Collection是下的接口,它是各种集合的父接口,继承于它的接口主要有Set 和List;Collections是个下的类,是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 List集合的实现类ArrayList和LinkedList.List接口是Collection的子接口,用于定义线性表数据结构,元素可重复、有序的;可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少。1)List接口的两个常见的实现类:ArrayList和LinkedList,分别用
34、动态数组和链表的方式实现了List接口。List、ArrayList和LinkedList均处于包下。2)可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别,ArrayList更适合于随机访问,而LinkedList更适合于插入和删除,在性能要求不是特别苛刻的情形下可以忽略这个差别。 ArrayListLinkedList3)使用List我们不需要在创建的时候考虑容量集合的容量是根据其所保存的元素决定的换句话说,集合的容量是可以自动扩充的。4)List的实现类会重写toString方法,依次调用所包含对象的toString方法,返回集合中所包含对象
35、的字符串表现。5)常用方法:?add(Object obj):向想集合末尾追加一个新元素,从该方法的参数定义不难看出,集合可以存放任意类型的元素,但在实际编程中我们发现,几乎不会向集合中存放一种以上的不同类型的元素。size()方法:返回当前集合中存放对象的数量。clear()方法:用于清空集合。isEmpty()方法:用于返回集合是否为空。 List list=new ArrayList(); (One); (Two); (Three);quals(i);(i); quals(i)(i);addAll(Collection c)方法:允许将c对应的集合中所有元素存入该集合,即并集。注意,这里
36、的参数为Collection,所以换句话说,任何集合类型都可以将其元素存入其他集合中!$removeAll(Collection c)方法:删除与另一个集合中相同的元素。它的“相同”逻辑通过equals方法来判断。retainAll(Collection c)方法:保留与另一个集合中相同的元素,即交集。它的“相同”逻辑通过equals方法来判断。(list2);义一个类并实现Comparator接口。B.实现接口中的抽象方法compare(E o1,E o2)。C.实例化这个比较器D.调用Collections的重载方法:sort(Collection c,Comparator compara
37、tor)进行排序。通常使用匿名类方式创建一个实例来定义比较器。Comparator c=new Comparator()public int compare(ComparablePoint o1,ComparablePoint o2)return ()();quals(element)012345678quals(name)return 行;else if(曾哥.equals(name)return 行;else if(我女朋友.equals(name)return 不行;else/*当出现了错误(不一定是真实异常)可以主动向外界抛出一个异常!*/throw new RuntimeExcept
38、ion(人家不干!);catch(NullPointerException e)throw e;+);+demo+A);if(!() ();if()&(); File files=(); if(files!=null&0)代表相同文件,也可直接写目录名,但要注意第2条。删除目录时:要确保该目录下没有任何子项后才可以将该目录删除,否则删除失败!|File dir=new File(.); File files=();if(files!=null&0)for(File file:files)if()deleteDirectory(file);ndsWith(.java);ava结尾的;quals(
39、)break;输出到控制台 ();文件字符高级流:FR和FW用于读写“文本文件”的“字符”输入流和输出流。1)FileWriter写入:继承OutputStreamWriter-A常用构造方法FileWriter(File file)、FileWriter(File file, boolean append)FileWriter(String filePath)、FileWriter(String fileName, boolean append)意思和FileOutputStream的四个同类型参数的构造方法一致。u 注意事项:FileWriter的效果等同于:FileOutputStrea
40、m + OutputStreamWriter。B常用方法:void write(int c):写入单个字符。void write(char c, int off, int len):写入字符数组从off到len长度的部分void write(String str, int off, int len):写入字符串从off到len长度的部分。void flush():将缓冲区中的数据一次性写出,“清空”缓冲区。void close():关闭流。FileWriter writer=new FileWriter();tart(); /* * 匿名类实现继承Thread形式*/Thread t1=new
41、 Thread()public void run()for(int i=0;i;new Thread(new Runnable()public void run().start();/*匿名类实现Runnable接口的形式 */Thread t2=new Thread(new Runnable()public void run()for(int i=0;i1000;i+)?你好+i+次); );8)线程生命周期:9)线程睡眠阻塞:使当前线程放弃cpu时间,进入阻塞状态。在阻塞状态的线程不会分配时间片。直到该线程结束阻塞状态回到Runnable状态,方可再次获得时间片来让cpu运行(进入Running状态)。static void sleep(times)方法:让当前线程主动进入Block阻塞状态,并在time毫秒后回到Runnalbe状态。u /u 注意事项:使用()方法阻塞线程时,强制让我们必须捕获“中断异常”。 引发情况:当前线程处于Sleep阻塞期间,被另一个线程中断阻塞状态时,当前线程会抛出该异常。int i=0;while(true)秒);i+;try (1000); catch (InterruptedException e) (