JSE第一部分分享者:张振羽2017.6.30JSE第一部分张振羽20171.什么是JDKAPI(1)ApplicationProgrammingInterface,应用程序编程接口(2)是一些预先定义的函数,开发人员可提供直接调用的功能。2.JDK包结构便于维护,按照功能划分,不同功能的累划分在不同功能的包中,常用的包如下表:包功能java.lang基础类,字符串,多线程,这个包不用importjava.util集合、随机数、日历、时钟等java.io文件操作,输入输出流java.net网络操作java.math数学运算java.security安全相关java.sql数据库访问java.text处理文字、信息的格式3.字符串的基本操作3.1String及其APIintindexOf(Stringstr)在字符串中检索str,返回其第一次出现的位置如果找不到返回-1intindexOf(Stringstr,inta)返回字符串str中从下标为a开始寻找,第一次出现str的下标;str.length();用于返回字符串str的长度,返回类型是int类型,空格也是一个字符str.lastIndexOf(Stringstr);返回字符串str中最后一次出现string的下标;str.subString(intstart,intend)取出str中从下标为start开始,到end结束的字符串,返回的是一个字符串类型str.subString(intstart,intend);取出str中从下标为start开始,到end结束的字符串,返回的是一个字符串类型;str.subString(intstart);字符串str中从start一直截取到结尾str.trim();去掉字符串开始和结尾的空字符串str.CharAt(intindex);用于返回在str字符串中,指定下标index处的字符,返回的类型是char;可以用来判断回文;str.starsWith(Stringstring)判断字符串str中是否是以string开始的,返回的类型是boolean类型;str.endsWith(Stringstring);判断字符串str中是否是以string结束的,返回的类型是boolean类型str.toUpperCase();将字符串str所有字母都转换为大写,返回的类型为String类型;str.toLowerCase();将字符串str所有字母都转换为小写,返回的类型为String类型;String.valueOf(intvalue);将基本类型的value转换为字符串类型,不只是int类型,其他的也可以,这是一个静态方法,因此调用时使用类名来调用;JSE第一部分张振羽20173.1.1String(1)String是不可变对象(2)java.lang.String使用了final修饰,不能被继承。(3)字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中(4)任何一个字符对应2个字节的长度,1个字节=8位二进制。3.1.2Strings=newString(“abc”)(1)众所周知,答案是:创建两个对象(2)why?举例子:分析步骤:a)栈中开辟一块空间存放引用str1(地址信息);b)String池中有一块空间,存放String常量abc;c)引用str1指向池中String常量abc;d)str1所指代的地址即常量abc所在地址,输出为true;结论:创建了一个引用对象str1JSE第一部分张振羽2017分析步骤:1)栈中开辟一块空间存放引用str3;2)堆中开辟一块空间存放一个新建的String对象abc;3)引用str3指向堆中的新建的String对象abc;4)str3所指代的对象地址为堆中地址,而常量abc地址在池中,输出false;3.2StringBuilder常见APIbuilder.append(Stringstring)追加builder.insert(intnum,Stringstring)插入builder.delete(intstart,intend)删除builder.replace(intstart,intend,Stringstring);替换StringBufferreverse();字符串反转注意:含头不含尾JSE第一部分张振羽20173.2.1StringBuiler特点(a)JDK1.5出现StringBuiler(b)StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用(c)线程不安全3.2.2String、StringBuiler、StrngBuffer三者区别(a)String长度不可变,StringBuiler和StringBuiler长度可变(b)每一次对String操作改变,都会创建新的对象,而后两个不生成新的对象(c)StringBuiler和StringBuiler创建必须通过关键字new来创建,String可以不用new,可以直接赋值(d)StringBuffer线程安全,多线程操作时,使用StringBuffer安全。StringBuilder线程不安全,单线程操作时,使用StringBuilder效率高。。3.3基本数据类型包装类byte1字节ByteShort2字节Shortint4字节Integerlong8字节Longfloat4字节Floatdouble8字节Doublechar2字节CharacterBoolean1字节Boolean注意:基本数据类型对象包装类都有XXXparseXXX方法,只有一个类型没有parse方法:Character。4.正则4.1正则(1)正则本身也是字符串(2)用于匹配字符串中字符次序的规则字符串(3)很多编程语言,包括Java都支持了正则表达式JSE第一部分张振羽20174.2字符集[abc]表示a,b,c中的任意一个字符[^abc]表示除了a,b,c以外的任意字符[a-z]表示a,b,c,„„,z中的任意一个字符[a-zA-Z0-9]表示a~z,A~Z,0~9中的任意一个字符[a-z&&[^bc]]表示a~z中除了b,c以外的任意一个字符.表示任意一个字符\d表示任意一个数字\w表示任意一个单词字符(只能是数字,字母,下划线)\s表示任意一个空白字符(\t\r\n\f\x0B)\D表示任意一个非数字字符\W表示任意一个非单词字符\S表示任意一个非空白字符X?表示0个或者1个XX*表示0个或者任意多个XX+表示1个到任意多个X(大于等于1个X)X{n}表示n个XX{n,}表示n个到任意多个X(大于等于n个X)X{n,m}表示n个到m个X^,$表示字符串的开始,后面的表示字符串的结束4.3常用APIstr.matches(Reg)字符串和正则表达式进行匹配,返回booleanstr.split(Reg)将字符串按照正则表达式的规则拆分为一个字符串数组str.replaceAll(Reg,str);将字符串中符合正则表达式的字符串替换为str4.4经典的正则案例匹配电话号码(0086|\\+86)?\\s?1\\d{10}匹配图片格式\\w+\\.(png|jpg|jpeg|gif)检查一个字符串是否是整数数组类型int\\[\\s*\\]注意:在使用\时候要注意,在Java字符串中需要转意为\\5.Object5.1toString(a)该方法java希望我们重写时返回一个字符串,这个字符串的原则为:用一个字符串来描述当前对象.(c)因为Object实现的toString()方法不具备什么实际开发意义,所以若我们需要在子类中使用该方法时通常我们会重写它JSE第一部分张振羽2017举例子:(3)重写toString(a)没有重写结果(a)重写后结果5.2equalsObject提供了比较两个对象是否相等方法equals:1.默认的equals不能比较对象中数据是否相等建议子类重写这个方法!2.重写时候,按照关键数据比较两个对象是否相等举例:不重写equals方法:JSE第一部分张振羽20173.重写equals方法应遵循几个规则:(a)任何对象与null比较都应返回false(b)两个对象不属于同一个类时应返回false(c)同一个对象equals比较应当恒等为true5.3equals与==的区别(1)==是变量值比较,(2)对于引用类型变量而言,该变量保存的是对象的地址(3两个变量的地址是否相等,换句话说就是看两个变量引用的是否为同一个对象(2)equals是内容比较(4)对于两个引用变量而言,是比较两个变量所引用的对象内容是否相同举例:没有toString的情况下输出p和p1JSE第一部分张振羽20176.日期及常用API6.1Date及常用API6.2SimpleDateFormat6.3Calenda(1)Calendar本身是抽象类,规定了操作时间的方法定义.(2)常用实现类GregorianCalendar,即:阳历立法(3)Calendar提供了一个静态方法getInstance来根据(4)获取和设置时间分量注意:老外的周日是中国的周一JSE第一部分张振羽20177.集合7.1什么是集合(1)java提供了一种可以存数一组数据的数据结构.(2)集合,用来存储一组元素,提供了相关操作元素的方法.JSE第一部分张振羽2017(3)Collection(接口)有两个常见的子接口:List:可重复集,且有序.常用的有:ArrayList和LinkedList实现类Set:不可重复集,大部分实现类是无序的.7.2集合和数组的区别(1)数组是固定长度的;集合可变长度的。(2)数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。(3)数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。7.3ArrayList和LinkedList的区别1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数结构。2.对于随机访问get和set,ArrayList觉得优于LinkedList,因LinkedLis要移动指针。3.对于新增和删除操作add和remove,LinedList比较占优势,因ArrayList要移动数据。问题:为什么ArrayList随机访问快,而LinkedList增删快?7.4什么是数据结构(1)Java中常用的结构:数组、链表、栈、队列(2)是指相互之间存在一种或多种特定关系的数据元素的集合(3)特定语法组成的程序+针对不同的事物制定的不同算法。7.5ArrayList数据结构(数组)举例子:它在内部的数据结构即为数组,类似下面:JSE第一部分张振羽2017int[]arrays={2,4,6,8},假设,使数组变成{2,4,5,6,8}。ArrayList内部实现:(1)动态扩大数组。(2)将原来数组索引为“2”及其后面所有的元素向后移动。(3)新元素5到索引为2的位置。7.6LinkedList链表结构7.6.1链表:(a)是在非连续的内存单元中保存数据,并且通过指针将各个内存单元链接在一起。(b)链表不需要提前分配固定大小存储空间,当需要存储数据的时候分配一块内存并将这块内存插入链表中。7.6.2链表分类(a)单向链表JSE第一部分张振羽2017(b)双向链表(c)循环链表LinkedList内部其实做了下面这些事情:(a)对半查找出原来索引为2的节点将其前驱改为新增节点5;(b)将新增节点5的前驱改为4,后继改为6;节点4的后继改为5。JSE第一部分张振羽20177.7栈结构栈结构:(1)栈用来存储一组元素,但是存取元素必须遵循先进后出原则(2)栈结构常被用来实现后退功能(3)Deque是双端队列,但是若只从一段进出队就实现了栈结构.JSE第一部分张振羽20177.8队列结构Deque队列只允许在队尾添加数据,在队头删除数据。但是可以查看队头和队尾的数据。还有一种是双端队列,在两端都可以插入和删除