1、JAVAJAVA培训宣培训宣讲讲PPTPPT讲座讲座自我介绍架构师、产品经理东软、Tieto、平安科技现在创业中(小豹科技)课程整体内容1. 基础java(面向对象、语法、java基础类库、内存管理) 2课时2. 高级java(多线程、socket、NIO、编程规范) 2课时3. java WEB开发 (servlet、spring、spring mvc、mybatis、事务、quartz、前后端验证、poi、maven、jenkins等) 6课时4. java调优与问题诊断(调试、问题定位、性能调优) 2课时5. centos和tomcat服务器与高可用等 (java web应用的部署环境c
2、entos、tomcat等服务器及高可用环境haproxy、keepalived的使用) 2课时6. 基于java的架构设计(针对示例项目的架构设计 -基于功能性需求、非功能需求做出适合此项目的架构设计) 2课时语言基础面向对象基础类库java的内存管理1 语言基础1 语言基础本章是讲述java语言的基础语法。课程内容:1.1 Java语言入门1.2 标识符、关键字和数据类型1.3 运算符,表达式和语句1.4 数组1.5 方法的封装1.1.1 Java特点简单面向对象 与平台无关健壮性(Java的强类型机制、异常处理、内存的自动收集等)1.1.2 Java程序开发基本过程Java编程基础Jav
3、a的基本语法格式:所有的java程序都应该写在类中 class 类的修饰符:public和默认修饰符public class MyFirstJavaApp public static void main(String args) System.out.println(“This is My First Java Application!”); 1.1.3 Java程序开发基本过程编译Java程序Javac MyFirstJavaApp.java运行Java程序Java MyFirstJavaApp 1.1.4 Java程序开发基本过程Java注释单行注释 /多行注释 /* */文档注释 /*
4、*/1.1.5 开发工具Eclipse Intellij IDEA1.2 标识符、关键字和数据类型1.2.1 标识符1.2.2 关键字1.2.3 数据类型1.2.4 常量1.2.5 变量1.2.6 类型转换1.2.1 标识符标识符命名规则定义:Java对各种变量,方法和类等要素命名时使用的字符序列称为标识符规则:标识符应以字母,下划线,美元符号开头标识符应以字母,下划线,美元符号或数字组成标识符对大小写敏感,长度无限止合法的标识符: Indentifier、username、user_name、_userName、$username非法的标识符:class、98.3、Hello World 1
5、.2.2 关键字abstractdoimplementprivatethisbooleandoubleimportprotectedthrowbreakelseinstanceof publicthrowsbyteextendintreturntransientcasefalseinterfaceshorttruecatchfinallongstatictrycharfianllynativestrictfp voidclassfloatnewsupervolatilecontinuefornullswitchwhiledefaultif package synchronized注:java
6、无sizeof ,goto, const 关键字,但不能用goto const作为变量名1.2.3 数据类型数据类型基本数据类型引用数据类型类接口数组数值型字符型(char)布尔型(boolean)整数型(byte shortInt long)浮点型(float,double)1.2.4 常量常量:就是持续不变的值常量类型:整型常量:十进制(12) ,十六进制 (0 x12),八进制(012)长整型常量:13L浮点数常量: (1) 单精度浮点数 5.1f,.4f ,2e3f ,0f(2) 双精度浮点数 5.1,.4,2e-3,0d布尔常量:true和false 1.2.4 常量字符常量 : a
7、 , 8, u0027 r表示接受键盘输入,相当于按下了回车键;n是换行;t是制表符,相当于table键;b是退格键,相当于Back Space;是单引号,而“是双引号;是一个斜杠“”。字符串常量 :“Hello World“,”123”, Welcome nXXX“null常量 :null常量只有一个值,用null表示,表示对象的引用为空 1.2.5 变量变量概念变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。先声明,再使用变量的元素 变量名,变量值,变量的作用范围变量定义int x=0,y; y=x+3; x和y就是变量1.2.5 变量变量字节大小及有效取值范围byte占用一
8、个字节,数字大小为-2727-1short占用两个字节,数字大小为-215215-1 int占用四个字节,数字大小为-231231-1 long占用八个字节,数字大小为-263263-1 float占用四个字节,数字大小为1.4E-453.4E+38 , -1.4E-45-3.4E+38 。用二进制的指数形式表示一个浮点数的格式,如:101*22 , 101*2-3double占用八个字节,数字大小为4.9E-3241.7E+308, -4.9E-324-1.7E+308 。char占两个字节,数字大小为0216-1,是unicode编码。字符的本来面目,我们为什么可以直接将一个数字赋给字符变
9、量。Boolean占一个字节,有两种取值,true和false。1.2.5 变量变量作用域变量要先定义,后使用,但不是在变量定义后的语句中一直都能使用前面定义的变量。比如:可以用大括号将多个语句包起来形成一个复合语句,则复合语句中定义的变量只能在定义它的复合语句中使用。局部变量在方法或方法中的代码块中定义的变量称为局部变量成员变量在方法外,在类内部定义的变量1.2.5 变量局部变量的定义在方法或方法中的代码块中定义的变量称为局部变量,局部变量在方法或代码块被执行时创建,在方法或代码块结束时被销毁。局部变量的初始化局部变量在进行取值操作前必须被初始化,否则会出现编译错误1.2.6 类型转换自动类
10、型转换(也叫隐式类型转换)byte b = 3;int x = b; /b被自动转换为int型强制类型转换(也叫显式类型转换) byte a; int b; a = (byte)b; /b被强制转换为byte型 1.3 运算符,表达式和语句1.3.1 运算符1.3.2 表达式1.3.3 控制语句1.3.1 运算符何为运算符运算符是一种特殊符号,用以表示数据的运算、赋值和比较,一般由一至三个字符组成 。运算符类型算术运算符赋值运算符比较运算符逻辑运算符位运算符移位运算符1.3.1 运算符1.3.1 运算符算术运算符的注意问题“+”除字符串相加功能外,还能把非字符串转换成字符串 ,如: “x”+1
11、23;的结果是“x123” 。 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论了。对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 int x=3510;x=x/1000*1000;实际运行结果是3000 ,想想为什么? 1.3.1 运算符赋值运算符1.3.1 运算符赋值运算符注意:注1:在JAVA里可以把赋值语句连在一起,如: x = y = z = 5 ; 在这个语句中,所有三个变量都得到同样的值5。注2 :x += 3等效于x = x + 3,等于*= ,-=,/=依此类推。1.3.1 运算符比较运算符1.
12、3.1 运算符比较运算符注意:注1:比较运算符的结果都是boolean型,也就是要么是true,要么是false。注2:比较运算符“=”不能误写成“=” 1.3.1 运算符逻辑运算符1.3.1 运算符逻辑运算符注意点注1:逻辑运算符用于对boolean型结果的表达式进行运算,运算的结果都是boolean型 。注2:“&”和“&”的区别在于,如果使用前者连接,那么无论任何情况,“&”两边的表达式都会参与计算。如果使用后者连接,当“&”的左边为false,则将不会计算其右边的表达式。“|”和“|”的区别与“&”和“&”的区别一样。1.3.1 运算符位运算符任何信息在计算机中都是以二进制的形式保存的
13、,&,|,除了可以作为逻辑运算符,也可以做为位算符,它们对两个操作数中的每一个二进制位都进行运算。只有参加运算的两位都为1,&运算的结果才为1,否则就为0。只有参加运算的两位都为0,|运算的结果才为0,否则就为1。只有参加运算的两位不同,运算的结果才为1,否则就为0。1.3.1 运算符移位运算符 右移 无符号右移1.3.1 运算符移位运算的注意事项及小技巧移位运算符适用类型有byte、short、char、int、long对低于int型的操作数将先自动转换为int型再移位。对于int型整数移位ab,系统先将b对32取模,得到的结果才是真正移位的位数。例如:a33和a1结果是一样的,a32的结果
14、还是a原来的数字。对于long型整数移位时ab ,则是先将移位位数b对64取模。移位不会改变变量本身的值。如a1;在一行语句中单独存在,毫无意义 。x1的结果和x/2的结果是一样的,x2和x*4的结果也是一样的。总之,一个数左移n位,就是等于这个数乘以2的n次方,一个数右移n位,就是等于这个数除以2的n次方。请思考:如何用程序实现求2的x次方。答案:y = 110&b10表达式的运算顺序先按照运算符的优先级优先级相同的,按照约定的结合方向表达值的值和类型1.3.3控制语句条件控制语句循环控制语句特殊的循环流程控制1.3.3控制语句条件控制语句If else 语句的语法:If(布尔表达式)语句或
15、语句块If(布尔表达式)语句或语句块else if(布尔表达式)语句或语句块else语句或语句块1.3.3控制语句switch语句的语法switch(表达式1)case 常量1:语句break;case 常量2:语句break;default:语句break;1.3.3控制语句switch选择语句:switch(x)/x只能为int、byte、char、shortcase 1:System.out.println(“Monday”);break;case 2:System.out.println(“Tuesday”);break;case 3:System.out.println(“Wedne
16、sday”);break;default:System.out.println(“I dont know”);思考:无break的情况1.3.3控制语句for循环语句for(初始化表达式;布尔值测试表达式;更改表达式)语句或语句块;例:for(int i=0;i= 0) size = newSize; public int getSize() return size; Spot对象实例private Spot spot = null; . spot = new Spot(); spot.setSite(1);示例中的继承和接口public class ClickMe extends JComp
17、onent implements MouseListener . public class ClickMe extends JComponent implements MouseListener . /Methods required by the MouseListener interface. public void mousePressed(MouseEvent event) if (spot = null) spot = new Spot(); spot.setSize(RADIUS); spot.x = event.getX(); spot.y = event.getY(); rep
18、aint(); public void mouseClicked(MouseEvent event) public void mouseReleased(MouseEvent event) public void mouseEntered(MouseEvent event) public void mouseExited(MouseEvent event) 多态TestPolymoph/Test.java多态是指在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。上面例子中,根据Lady对象的成员变量Pet所引用的不同的实际类型而调用相应的enjoy方法。cla
19、ss Bird extends Animalprivate String featherColor;Bird(String n,String f) super(n); this.featherColor = f; public void enjoy()System.out.println(鸟叫声.);public class Test public static void main(String args) Bird b = new Bird(“birdname”,”green”); Lady l3 = new Lady(l3,b); l3.myPetEnjoy(); 1.要有继承2.要有重写
20、3.父类引用指向子类对象3 重点类库为什么java很流行?丰富的类库是很重要的因素。java常用的包介绍常用的包介绍java.lang java的核心类基本类,如:String,Integer,System,Runtime等。 java.io 输入输出的类 网络连接相关的类java.nio jdk1.4后出现的新的io包,更高的效率。 java.utiljava.util 一些工具类,如数据结构一些工具类,如数据结构相关的类。相关的类。java.lang.reflect 反射相关的类。 java.securityjava.security 安全相关的类。安全相关的类。更多请参考更多请参考jdk
21、 文档。文档。字符和字符串Java APIJava API提供了四个处理字符数据的类:提供了四个处理字符数据的类:CharacterCharacter:这个类的实例可以容纳单:这个类的实例可以容纳单一的字符数值。该类还定义了一些简洁一的字符数值。该类还定义了一些简洁的方法来操作或者检查单一字符数据。的方法来操作或者检查单一字符数据。 StringString:这个类用于处理由多个字符组:这个类用于处理由多个字符组成的不可变数据。成的不可变数据。 StringBufferStringBuffer:这个类用于存储和操作:这个类用于存储和操作由多个字符组成的可变数据。线程安全。由多个字符组成的可变数
22、据。线程安全。StringBuilder StringBuilder 非线程安全的非线程安全的StringBufferStringBuffer,效率更高效率更高 异常类异常类 在Java中,将异常情况分为Exception(异常)和Error(错误)两大类。 Error 类对象由 Java 虚拟机生成并抛出;Exception 类对象由应用程序处理或抛出。ObjectThrowableExceptionError 异常类的继承结构checked异常与unchecked异常RuntimeExceptionRuntimeException类及其子类被称为类及其子类被称为“运行运行时异常时异常”一般
23、发生在一般发生在JREJRE内部内部也称也称“非必检异常非必检异常”如如NullPointerExceptionNullPointerException其他异常被成为其他异常被成为“非运行时异常非运行时异常”一般发生在一般发生在JREJRE外部外部也称也称“必检异常必检异常”如如IOExceptionIOException异常处理的一般步骤异常抛出异常抛出异常捕获异常捕获异常处理异常处理trytry 抛出异常的代码抛出异常的代码 catch ( catch (某某ExceptionException类型类型 e) e) 处理该异常类型的代码处理该异常类型的代码 catch ( catch (某
24、某ExceptionException类型类型 e) e) 处理该异常类型的代码处理该异常类型的代码 finally finally Io包Reader与Writer类Reader类的相关方法:类的相关方法:void close()void mark(int readAheadLimit)boolean markSupported()int read() int read(char cbuf) int read(char cbuf, int off, int len) boolean ready() void reset() long skip(long n) Writer类的相关方法:类的相
25、关方法:void close() void flush() void write(char cbuf) void write(char cbuf, int off, int len) void write(int c) void write(String str) void write(String str, int off, int len) 流的使用(1)I/O类型类型流流作用作用内存CharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStream用来从内存读取数据或向内存写入数据StringReaderStri
26、ngWriterStringBufferInputStream从内存里的某个String或StringBuffer读字符或字节管道PipedReaderPipedWriterPipedInputStreamPipedOutputStream实现一个输入、输出管道。管道可用于一个线程的输出连接到另一个线程的输入流的使用(2)文件文件FileReaderFileWriterFileInputStreamFileOutputStream用于对本机文件系统上的一个用于对本机文件系统上的一个件行读写件行读写对象串行化对象串行化ObjectInputStreamObjectOutputStream将对象串
27、行化将对象串行化打印打印PrintWriterPrintStream包含便捷的打印方法的流。包含便捷的打印方法的流。流的使用(3)缓冲缓冲BufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream缓冲流,用于在读写时进行数据缓冲缓冲流,用于在读写时进行数据缓冲过滤过滤FilterReaderFilterWriterFilterInputStreamFilterOutputStream过滤流的抽象类接口。数据读写时对过滤流的抽象类接口。数据读写时对数据进行过滤数据进行过滤在字节和在字节和字符之间字符之间转换转换Input
28、StreamReaderOutputStreamWriter字节流和字符类间的转换桥梁字节流和字符类间的转换桥梁Serializable接口 并非所有对象都是可串行化的,如果要对某并非所有对象都是可串行化的,如果要对某对象进行串行化,该对象的类必须实现对象进行串行化,该对象的类必须实现SerializableSerializable接口接口 SerializableSerializable接口是一个空接口,也就是说,接口是一个空接口,也就是说,它不包含任何方法的声明,该接口的作用只它不包含任何方法的声明,该接口的作用只是表明这个类的对象可以被串行化是表明这个类的对象可以被串行化 数据结构类集合
29、框架中的接口Collection:集合层次中的根接口,JDK没有提供这个接口直接的实现类。Set:不能包含重复的元素。SortedSet是一个按照升序排列元素的Set。List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。Map:包含了key-value对。Map不能包含重复的key。SortedMap是一个按照升序排列key的Map。集合框架中的实现类SortedSetSortedSetSetSetListListMapMapHashSetHashSet LinkedHashSetLinkedHashSet TreeSetTreeSet ArrayListArrayList
30、 LinkedListLinkedList SortedMapSortedMapHashMapHashMap TreeMapTreeMap ArrayListArrayList:我们可以将其看作是能够自动增长容量的数组。ArrayList向ArrayList对象中添加任何对象使用size()方法打印所有对象直接输出一个ArrayList对象 自定义类应该重写toString()方法以便输出时被自动调用使用toArray()方法转换为对象数组使用Arrays.asList(Object o)返回一个列表 返回的列表的大小固定,不能添加元素,可以使用set()方法修改节点的元素,否则会抛出不支持的
31、操作异常(UnsupportedOperationException ) 。ArrayList迭代器(Iterator) 给我们提供了一种通用的方式来访问集合中的元素。 remove()方法是一个可选的操作,实现Iterator接口可以选择实现该方法,或做空实现并抛出不支持的操作异常(UnsupportedOperationException ),类库采用这种方式避免产生太多的接口,否则会增加学习的难度。迭代器的工作原理返回的元素删除的元素next()remove()next()Collections类排序:Collections.sort()(1)自然排序(natural ordering
32、);(2)实现比较器(Comparator)接口。取最大和最小的元素:Collections.max()、Collections.min()。在已排序的List中搜索指定的元素:Collectons.binarySearch()。LinkedListLinkedList是采用双向循环链表实现的。利用LinkedList实现栈(stack)、队列(queue)、双向队列(double-ended queue )。数据结构一般将数据结构分为两大类:线性数据结构线性数据结构和非线性数据结构和非线性数据结构。线性数据结构有线性表、栈、队列、串、数组和文件;非线性数据结构有树和图。栈栈(Stack)也是
33、一种特殊的线性表,是一种后进先出(LIFO)的结构。栈是限定仅在表尾进行插入和删除运算的线性表,表尾称为栈顶(top),表头称为栈底(bottom)。栈的物理存储可以用顺序存储结构,也可以用链式存储结构。栈底栈顶出栈进栈队列队列(Queue)是限定所有的插入只能在表的一端进行,而所有的删除都在表的另一端进行的线性表。表中允许插入的一端称为队尾(Rear),允许删除的一端称为队头(Front)。队列的操作是按先进先出(FIFO)的原则进行的。队列的物理存储可以用顺序存储结构,也可以用链式存储结构。队头队尾出队 入队ArrayList和LinkedList的比较ArrayList底层采用数组完成,
34、而LinkedList则是以一般的双向链表(double-linked list)完成,其内每个对象除了数据本身外,还有两个 引用,分别指向前一个元素和后一个元素。如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,我们应该使用LinkedList,否则的话,使用ArrayList将更加快速。HashSet实现Set接口的hash table(哈希表),依靠HashMap来实现的。我们应该为要存放到散列表的各个对象定义hashCode()和equals()。TreeSetTreeSet是依靠TreeMap来实现的。TreeSet是一个有序集合,TreeSet中元素将按照
35、升序排列,缺省是按照自然顺序进行排列,意味着TreeSet中元素要实现Comparable接口。我们可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象。HashSet和TreeSet的比较HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。HashMapHashMap对key进行散列。keySet()、values()、entrySet()。TreeMapTreeMap按照key进行排序。HashMap和TreeMap的比较和Set类似,HashMap的速度通常都比TreeMap快,只有在需要排序的功能的时候,才使用TreeMap。4 java内存管理如何回收内存System.gc()finallize()垃圾回收机制 字符串的内存管理String a = “aaa”;String b = “aaa”;内存中”aaa”有多少份呢? 看看下面的代码内存使用建议课后练习往一个文件中写入100万个随机整数,用逗号分隔,并存储到硬盘中。 将这100万个整数进行排序后再写入到另外一个文件中。 请大家注意程序的效率。 效率?