资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,自我介绍,架构师、产品经理,东软、,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,应用的部署环境,centos,、,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,编程基础,Java,的基本语法格式:,所有的,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,注释,单行注释,/,多行注释,/*/,文档注释,/*/,1.1.5 开发工具,Eclipse,Intellij IDEA,1.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.2.2,关键字,abstract,do,implement,private,this,boolean,double,import,protected,throw,break,else,instanceof,public,throws,byte,extend,int,return,transient,case,false,interface,short,true,catch,final,long,static,try,char,fianlly,native,strictfp,void,class,float,new,super,volatile,continue,for,null,switch,while,default,if,package,synchronized,注:,java,无,sizeof,goto,const,关键字,但不能用,goto const,作为变量名,1.2.3,数据类型,数据类型,基本数据类型,引用数据类型,类,接口,数组,数值型,字符型,(char),布尔型,(boolean),整数型,(byte short,Int 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,,,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,占用一个字节,数字大小为,-2,7,2,7,-1,short,占用两个字节,数字大小为,-2,15,2,15,-1,int,占用四个字节,数字大小为,-2,31,2,31,-1,long,占用八个字节,数字大小为,-2,63,2,63,-1,float,占用四个字节,数字大小为,1.4E-453.4E+38,-1.4E-45-3.4E+38,。用二进制的指数形式表示一个浮点数的格式,如:,101*2,2,101*2,-3,double,占用八个字节,数字大小为,4.9E-3241.7E+308,-4.9E-324-1.7E+308,。,char,占两个字节,数字大小为,0,2,16,-1,,是,unicode,编码。字符的本来面目,我们为什么可以直接将一个数字赋给字符变量。,Boolean,占一个字节,有两种取值,,true,和,false,。,1.2.5,变量,变量作用域,变量要先定义,后使用,但不是在变量定义后的语句中一直都能使用前面定义的变量。比如:可以用大括号将多个语句包起来形成一个复合语句,则复合语句中定义的变量只能在定义它的复合语句中使用。,局部变量,在方法或方法中的代码块中定义的变量称为局部变量,成员变量,在方法外,在类内部定义的变量,1.2.5,变量,局部变量的定义,在方法或方法中的代码块中定义的变量称为局部变量,局部变量在方法或代码块被执行时创建,在方法或代码块结束时被销毁。,局部变量的初始化,局部变量在进行取值操作前必须被初始化,否则会出现编译错误,1.2.6,类型转换,自动类型转换(也叫隐式类型转换),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”+123;,的结果是,“,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.3.1,运算符,比较运算符注意:,注,1,:比较运算符的结果都是,boolean,型,也就是要么是,true,,要么是,false,。,注,2,:比较运算符,“,=”,不能误写成,“,=”,1.3.1,运算符,逻辑运算符,1.3.1,运算符,逻辑运算符注意点,注,1,:逻辑运算符用于对,boolean,型结果的表达式进行运算,运算的结果都是,boolean,型。,注,2,:,“,&”,和,“,&”,的区别在于,如果使用前者连接,那么无论任何情况,,“,&”,两边的表达式都会参与计算。如果使用后者连接,当,“,&”,的左边为,false,,则将不会计算其右边的表达式。,“,|”,和,“,|”,的区别与,“,&”,和,“,&”,的区别一样。,1.3.1,运算符,位运算符,任何信息在计算机中都是以二进制的形式保存的,,&,|,除了可以作为逻辑运算符,也可以做为位算符,它们对两个操作数中的每一个二进制位都进行运算。,只有参加运算的两位都为,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,的结果还是,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(,布尔表达式,),语句或语句块,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,、,short,case 1:System.out.println(“Monday”);,break;,case 2:System.out.println(“Tuesday”);,break;,case 3:System.out.println(“Wednesday”);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 JComponent,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();repaint();,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,方法。,class Bird extends Animal,private 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.,要有重写,3.,父类引用指向子类对象,3,重点类库,为什么java很流行?丰富的类库是很重要的因素。,java,常用的包介绍,java.lang,java,的核心类基本类,如,:String,Integer,System,Runtime,等。,java.io,输入输出的类,网络连接相关的类,java.nio jdk1.4,后出现的新的,io,包,更高的效率。,java.util,一些工具类,如数据结构相关的类。,java.lang.reflect,反射相关的类。,java.security,安全相关的类。,更多请参考,jdk,文档。,字符和字符串,Java API提供了四个处理字符数据的类:,Character,:这个类的实例可以容纳单一的字符数值。该类还定义了一些简洁的方法来操作或者检查单一字符数据。,String,:这个类用于处理由多个字符组成的不可变数据。,StringBuffer,:这个类用于存储和操作由多个字符组成的可变数据。线程安全。,StringBuilder 非线程安全的StringBuffer,,效率更高,异常类,在,Java,中,将异常情况分为,Exception,(异常)和,Error,(错误)两大类。,Error,类对象由,Java,虚拟机生成并抛出;,Exception,类对象由应用程序处理或抛出,。,Object,Throwable,Exception,Error,异常类的继承结构,checked异常与unchecked异常,RuntimeException类及其子类被称为“运行时异常”,一般发生在JRE内部,也称“非必检异常”,如NullPointerException,其他异常被成为“非运行时异常”,一般发生在JRE外部,也称“必检异常”,如IOException,异常处理的一般步骤,异常抛出,异常捕获,异常处理,try,抛出异常的代码,catch(某Exception类型 e),处理该异常类型的代码,catch(某Exception类型 e),处理该异常类型的代码,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类的相关方法:,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,类型,流,作用,内存,CharArrayReader,CharArrayWriter,ByteArrayInputStream,ByteArrayOutputStream,用来从内存读取数据或向内存写入数据,StringReader,StringWriter,StringBufferInputStream,从内存里的某个,String,或,StringBuffer,读,字符或字节,管道,PipedReader,PipedWriter,PipedInputStream,PipedOutputStream,实现一个输入、输出管道。管道可用于,一个线程的输出连接到另一个线程的输入,流的使用(2),文件,FileReader,FileWriter,FileInputStream,FileOutputStream,用于对本机文件系统上的一个,件行读写,对象串行化,ObjectInputStream,ObjectOutputStream,将对象串行化,打印,PrintWriter,PrintStream,包含便捷的打印方法的流。,流的使用(,3,),缓冲,BufferedReader,BufferedWriter,BufferedInputStream,BufferedOutputStream,缓冲流,用于在读写时进行数据缓冲,过滤,FilterReader,FilterWriter,FilterInputStream,FilterOutputStream,过滤流的抽象类接口。数据读写时对,数据进行过滤,在字节和,字符之间,转换,InputStreamReader,OutputStreamWriter,字节流和字符类间的转换桥梁,Serializable接口,并非所有对象都是可串行化的,如果要对某对象进行串行化,该对象的类必须实现Serializable接口,Serializable接口是一个空接口,也就是说,它不包含任何方法的声明,该接口的作用只是表明这个类的对象可以被串行化,数据结构类,集合框架中的接口,Collection,:集合层次中的根接口,,JDK,没有提供这个接口直接的实现类。,Set,:不能包含重复的元素。,SortedSet,是一个按照升序排列元素的,Set,。,List,:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。,Map,:包含了,key-value,对。,Map,不能包含重复的,key,。,SortedMap,是一个按照升序排列,key,的,Map,。,集合框架中的实现类,SortedSet,Set,List,Map,HashSet,LinkedHashSet,TreeSet,ArrayList,LinkedList,SortedMap,HashMap,TreeMap,ArrayList,ArrayList,:我们可以将其看作是能够自动增长容量的数组。,ArrayList,向,ArrayList,对象中添加任何对象,使用,size(),方法打印所有对象,直接输出一个,ArrayList,对象,自定义类应该重写,toString(),方法以便输出时被自动调用,使用,toArray(),方法转换为对象数组,使用,Arrays.asList(Object o),返回一个列表,返回的列表的大小固定,不能添加元素,可以使用,set(),方法修改节点的元素,否则会抛出不支持的操作异常,(,UnsupportedOperationException,),。,ArrayList,迭代器,(Iterator),给我们提供了一种通用的方式来访问集合中的元素。,remove(),方法是一个可选的操作,实现,Iterator,接口可以选择实现该方法,或做空实现并抛出不支持的操作异常,(,UnsupportedOperationException,),,类库采用这种方式避免产生太多的接口,否则会增加学习的难度。,迭代器的工作原理,返回的元素,删除的元素,next(),remove(),next(),Collections,类,排序:,Collections.sort(),(,1,)自然排序,(,natural ordering,),;,(,2,)实现比较器,(Comparator),接口。,取最大和最小的元素:,Collections.max(),、,Collections.min(),。,在已排序的,List,中搜索指定的元素:,Collectons.binarySearch(),。,LinkedList,LinkedList,是采用双向循环链表实现的。,利用,LinkedList,实现栈,(stack),、队列,(queue),、双向队列,(double-ended queue),。,数据结构,一般将数据结构分为两大类:,线性数据结构和非线性数据结构,。,线性数据结构,有线性表、栈、队列、串、数组和文件;,非线性数据结构,有树和图。,栈,栈,(Stack),也是一种特殊的线性表,是一种后进先出,(LIFO),的结构。,栈是限定仅在表尾进行插入和删除运算的线性表,表尾称为栈顶,(top),,表头称为栈底,(bottom),。,栈的物理存储可以用顺序存储结构,也可以用链式存储结构,。,a1,a2,an,栈底,栈顶,出栈,进栈,队列,队列,(Queue),是限定所有的插入只能在表的一端进行,而所有的删除都在表的另一端进行的线性表。,表中允许插入的一端称为队尾,(Rear),,允许删除的一端称为队头,(Front),。,队列的操作是按先进先出,(FIFO),的原则进行的。,队列的物理存储可以用顺序存储结构,也可以用链式存储结构。,a1 a2 a3,an,队头,队尾,出队,入队,ArrayList,和,LinkedList,的比较,ArrayList,底层采用数组完成,而,LinkedList,则是以一般的双向链表,(double-linked list),完成,其内每个对象除了数据本身外,还有两个,引用,分别指向前一个元素和后一个元素。,如果我们经常在,List,的开始处增加元素,或者在,List,中进行插入和删除操作,我们应该使用,LinkedList,,否则的话,使用,ArrayList,将更加快速。,HashSet,实现,Set,接口的,hash table(,哈希表,),,依靠,HashMap,来实现的。,我们应该为要存放到散列表的各个对象定义,hashCode(),和,equals(),。,TreeSet,TreeSet,是依靠,TreeMap,来实现的。,TreeSet,是一个有序集合,,TreeSet,中元素将按照升序排列,缺省是按照自然顺序进行排列,意味着,TreeSet,中元素要实现,Comparable,接口。,我们可以在构造,TreeSet,对象时,传递实现了,Comparator,接口的比较器对象。,HashSet,和,TreeSet,的比较,HashSet,是基于,Hash,算法实现的,其性能通常都优于,TreeSet,。我们通常都应该使用,HashSet,,在我们需要排序的功能时,我们才使用,TreeSet,。,HashMap,HashMap,对,key,进行散列。,keySet(),、,values(),、,entrySet(),。,TreeMap,TreeMap,按照,key,进行排序。,HashMap,和,TreeMap,的比较,和,Set,类似,,HashMap,的速度通常都比,TreeMap,快,只有在需要排序的功能的时候,才使用,TreeMap,。,4 java内存管理,如何回收内存,System.gc(),finallize(),垃圾回收机制,字符串的内存管理,String a=“aaa”;,String b =“aaa”;,内存中,”aaa”,有多少份呢?,看看下面的代码,内存使用建议,
展开阅读全文