循序渐进学java-创新互联
/-matool API查询网站
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、虚拟空间、营销软件、网站建设、淮北网站维护、网站推广。重点内容:
第一阶段:变量:数据类型
运算符:二进制
控制结构:循环
数组排序和查找:数组
面向对象编程:成员方法,成员方法传参机制,构造器
面向对象编程(中级):封装,继承,多态
第二阶段:面向对象编程(高级):类变量和类方法,接口,内部类
Exception:异常体系图,异常处理
常用类:string,stringbuffer,stringbuilder
集合:
![](/upload/otherpic11/3d009721079388d48b2f56f2dc15caa5.jpg)
泛型:自定义泛型
线程:线程使用,Synchronized,互斥锁
IO流:输入流,输出流
开发注意事项:
1一个源文件中最多只能有一个public类,其他类的个数不限
2如果源文件包含一个public类,则文件名必须按该类名命名
3.一个源文件中最多只能有一个public类。其它类的个数不限,也可以将main方法写在非public类中,然后指定运行非public类,这样入口方法就是非public的main方法
/r为回车:回车后光标会回到“韩”字前,然后“韩顺”被“北京”代替
![](/upload/otherpic11/aaa30e27811d676a1ab76915c8aef664.jpg)
使用tab键,实现缩进,整体右移。Shift+tab整体左移。
相对路径和绝对路径:
![](/upload/otherpic11/fd97ac4316b72a86d488c2feafd18ca5.jpg)
加号的说明:
![](/upload/otherpic11/9d5b4c8cdaaf069890b03754dc577566.jpg)
两边都是数值型的时候做加法运算,左右两边有一方为字符串时做拼接运算
基本数据类型:
+byte
使用long类型时,需要在变量后面加一个‘l’或“L“
例:long a = 10l;
Java默认浮点型常量为double型,因此在使用float型时需要在变量后面加上l或L
例:floa a = 1.1l;
浮点型可以写成.123 等价于0.123
对于运算结果时小数的进行判断时,应该用两个数的差值的绝对值,在某个精度范围内判断。
不同的字符编码表之间有所不同:
ASCII编码表:一个字符一个字节
Unicode编码表:字母和汉字都占用两个字节(最多编码2的16次方个字符)
utf-8:字母一个字节,汉字三个字节
等等。
布尔类型(boolean):赋值只能为true/false
在将精度(容量)大的数据类型转换成精度(容量)小的数据类型时会报错。
(Byte,short)和char之间不能相互转换,也不能自动转换
Byte,short,char之间或者同类型之间进行运算时,会转换为int类型。
Boolean不参与类型的自动转换。
字符串和其它数据类型之间的转换:
其它类型转字符串:+“”
![](/upload/otherpic11/2052114ba04f010e8417dd77fe6e18ca.jpg)
字符串转其它类型:
![](/upload/otherpic11/08a0cd623e77f2f655bef136350dac3e.jpg)
取模:a % b =a-a/b*a;
结果的正负值要取决于a的负号。
重点:
![](/upload/otherpic11/62896ab6a887baa6a9bc85aad847ac08.jpg)
关系运算符的运算结果为布尔类型:即ture或false
短路与:&& 逻辑与:&
对于短路与,如果第一个条件为假,则后面的条件不再判断,即不执行,效率高
对于逻辑与,如果第一个条件为假,后面的语句仍会执行
短路或:|| 逻辑或:|
效果同短路与和逻辑与
^:逻辑异或
复合赋值运算符会进行类型转换
byte b = 3;
b +=2;等价于b = (byte)(b+2);
输入的实现:
1引入java.util.Scanner,java.util下的Scanner类
![](/upload/otherpic11/3ed4bbe0bc909a1d8d73e4f5c52bae3a.jpg)
2.创建一个类的对象,new创建对象
Scanner myScanner = new Scanner(System.in);
3.接收
String name = myScanner.next();输入为字符串类型
int age = myScanner.nextInt();输入为整形
double salary = myScanner.nextDouble();输入为浮点型
四种进制:
二进制:以OB或Ob开头
八进制:以数字0开头
十六进制:以OX或Ox开头 ,并且A-F不区分大小写
![](/upload/otherpic11/7417834fa5f4f386aca699ae1f238c49.jpg)
按位与:&
按位或:|
按位异或:^
按位取反:~
位运算符:
>>算数左移:地位补0
<<算数右移:高位补符号位
>>>逻辑右移:地位溢出,高位补0
没有逻辑左移
switch:返回类型必须是byte,short,int,char,enum,String类型之一。
case:值必须为常量或者常量表达式
break后面加标签:可以表示终止某个循环,类似于goto
![](/upload/otherpic11/19dcb96b003f1977e474249636c06628.jpg)
判断两个字符串:推荐第二种
如:String name;
Name.equals(“字符串内容”)或”字符串内容”.equals(name)
数组:
数组类型[ ] 数组名 ([ ])= new 数组类型[个数]
double[] score = new double[5];
或
double score[];
score = new double[5];
数组赋值:arr2是arr1的一份拷贝,当arr2改变时,arr1也改变
![](/upload/otherpic11/fa889fc3d6eac507c2509cc4057110f0.jpg)
冒泡排序:优化:j初始值为1,增加count变量,若执行一次交换则count增加,若count在循环后为0则提前终止循环。
![](/upload/otherpic11/fa853e78ac182aac83767233b6ae342f.jpg)
动态开辟二维数组空间:
![](/upload/otherpic11/4d120655676bd5b9a5f4a3ce614bb434.jpg)
面向对象(基础):
对象中的整型放在堆区,字符串类型放在方法区中的常量池。
![](/upload/otherpic11/b39e0001aa488fc5356f7f5c27a3d595.jpg)
过程:
1先加载类信息(属性和方法信息,只会加载一次)
2在堆中分配空间,进行默认初始化
3把地址赋给用类创建的变量,变量指向对象
4.进行指定初始化
方法重载:减轻记名麻烦
要求:方法名相同,形参的类型或个数或顺序不同。
注意:返回类型不同不能构成重载。
可变参数,写法(变量类型... 变量名)
可以接受0-多个参数,此时的变量名相当于数组名,可以用变量名.length获得参数个数,用变量名[i]访问每个变量。
![](/upload/otherpic11/4aafea7fee5556f1cc87bc84ec5d3345.jpg)
细节:
可变参数的实参可以为数组,即直接传入一个数组。
可以同时存在普通类型的参数和可变参数,但是可变参数必须在最后。
一个形参列表中只能出现一个可变参数。
作用域细节:
属性和局部变量可以重名,访问时遵循就近原则。如:
![](/upload/otherpic11/a8b4801523dbe887f4a22ea4925f0592.jpg)
此时name的值为“king”
全局变量可以加修饰符
局部变量不能加修饰符
构造方法/构造器:完成对新对象的初始化,类似于构造函数
![](/upload/otherpic11/5dc643a28b5e5658066910918f3d4f64.jpg)
细节:
一个类可以定义多个构造器,即构造器重载
This指针:当构造方法中的形参的类的对象名字相同时,可以在对象前加this.来区分
在一个构造器中访问另一个构造器时(本类),需要使用this(参数列表)
注意:需要将this语句放在第一条语句,只能在构造器中使用。
![](/upload/otherpic11/ddd6077f35eb819f30561edea838d0e8.jpg)
在需要获取数组的大值时,为了避免传入的数组为空值,或者数组地址为null时,需要加上判断,当地址为null时,arr.length语句会报错。
![](/upload/otherpic11/7411b7b17e14408d33dda696f8a95cbd.jpg)
直接new 类名(),此方法只创建一个对象,而没有返回,属于匿名对象,匿名对象在使用后,就不能使用。
![](/upload/otherpic11/064b3c0ec710e829ad59ad125d8e136f.jpg)
IDEA中的快捷键:
Ctrl+D 删除当前行(自己配置)
Alt+/ 补全代码
Ctrl+alt+l 格式化代码
Alt+r 运行程序(自己配置)
将光标放在方法上,ctrl+B(或鼠标左键)可以定位到方法
模板快捷键:
Fori,输出for循环
Sout,输出System.out.println语句
包
创建不同的文件夹来保存类文件
方法如下:
![](/upload/otherpic11/25781562b7d773aa26e3a04a44f55581.jpg)
命名规则:不能以数字开头,不能是关键字或保留字。
命名规范:com.公司名.项目名.业务模块名
如:
![](/upload/otherpic11/b710897fbd671640f2f340bd1f55f0c2.jpg)
Arrays.sort(数组名),对数组进行升序排列。
Package的作用是声明当前类所在的包,需要放在类(或者文件)的最上面。
![](/upload/otherpic11/62b651142f230860256bc26bab39d39b.jpg)
![](/upload/otherpic11/b69306b0c328c4b372cfd8509ddf6829.jpg)
类只能用public和默认来修饰。
类的成员方法和属性可以用四个来修饰。
封装:
可以隐藏实现细节
可以对数据进行验证,保证安全合理
实现:
将属性私有化
提供一个公共的set方法,用于修改私有属性的值
提供一个公共的get方法,用于获取私有属性的值
构造器也同样需要对数据进行检测,因此可以把set方法写入构造器中,实现对数据赋值的同时完成验证。
继承:
可以解决代码复用。
基本语法:
class 子类(派生类) extends 父类(基类){}
细节:
子类必须调用父类的构造器,完成对父类的初始化
子类在调用构造器时,会自动调用父类的无参构造器,super语句(被隐藏)
![](/upload/otherpic11/a82b1a573041d943b0f6c5839c3e7063.jpg)
若父类中无无参构造器,则需要用super语句指定构造器
![](/upload/otherpic11/cf1943f3de113ff43fae602edd36505a.jpg)
![](/upload/otherpic11/f26dc33d810fd17f5bf8f1826da871e6.jpg)
super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。
Object类时所有类的基类
父类构造器的调用不限于直接父类!将一直追溯到Object类,即父类的父类的无参构造器也会被调用等。
Java中是单继承机制,即一个类只能继承一个,可以用A继承B,B继承C,来实现A同时继承B和C。
继承访问:
![](/upload/otherpic11/084d979be7af4a009f28ee010cb59f59.jpg)
![](/upload/otherpic11/7c0bd5b33408b8877c99e0b0ed502490.jpg)
![](/upload/otherpic11/8d157b84e69433884b4338cac29cd0ee.jpg)
此时aa.name的值为大头儿子,aa.hobby的值为旅游:以此方法在访问变量时,会从当前类开始寻找,若当前类没有,会依次往上寻找,直到找到为止或报错。
![](/upload/otherpic11/37ad33149c23bfd77d1b91f57ab65c83.jpg)
此时aa.age会报错,在Father类中有age但是没有权限,不会再往上寻找。
Super的使用:(访问父类)
super.语句,访问父类属性和方法,private属性除外
![](/upload/otherpic11/70c678bb9435a87275eeef7400e9007a.jpg)
![](/upload/otherpic11/1f896d0c684ec4e2f53d99e9491ef66f.jpg)
访问父类构造器
语句:super();
![](/upload/otherpic11/43eb2aeb81c9a14bd2011b086a85e234.jpg)
方法重写(覆盖):
实现条件:子类和父类的方法,参数,方法名均相同。此时子类的方法覆盖父类的方法。
1返回类型可以相同,或者子类的返回类型是父类返回类型的子类。如:
![](/upload/otherpic11/33c766387850f8a2cafc74f5dc0db84a.jpg)
String是Object的子类
2子类方法不能缩小父类方法的访问权限。
错误示例:子类是protected,父类是public。
多态:
方法的多态:体现在方法的重载和重写
对象的多态:
一个对象的编译类型和运行类型可以不一致。
编译类型看定义时 = 号的左边,运行类型看 = 号的右边
![](/upload/otherpic11/829f8d4a55bf7c51dc59025641b5baad.jpg)
animal1的编译类型时animal,运行类型时cat。
此时animal1.cry()相当于cat.cry(),因为animal的运行类型时cat。
重新指定后:
animal1的编译类型依然是animal,运行类型变为dog。
细节:
1向上转型:父类的引用指向了子类的对象。如上图举例。
![](/upload/otherpic11/7e49088a674b52b25db27c90b1c454d1.jpg)
2向下转型:
![](/upload/otherpic11/676e01e82563ba92442051250c2da680.jpg)
animal可以通过强转再次变成cat类型,因为animal本身在编译后为cat类型,但是不能转换成dog类型。
属性没有重写之说!属性的值看编译类型,如下图输出结果为10.
![](/upload/otherpic11/05824f2506a9bfebdcc8e2e1c552305b.jpg)
Instaniof语句,用于判断对象的运行类型是否是XX类型或其子类型。
![](/upload/otherpic11/be53e92a07198644a8aed1e56bf8a717.jpg)
动态绑定机制:
1当调用对象方法的时候,改方法会和该对象的内存地址/运行类型绑定
2当调用对象属性时,没有动态绑定机制,哪里声明哪里使用
多态数组:如
![](/upload/otherpic11/f56443c6ce44fd7576376ebc312a250f.jpg)
Object类:
==运算符:判断两个值是否相等,或是两个地址是否相同
equals是Object类中的方法,只能判断引用类型地址
查看方法源码:ctrl+左键
注意:
在Object子类中往往重写改方法,用于判断内容是否相等。
HashCode方法:
1提高具有哈希结构的容器的效率
2两个引用,如果指向的是同一个对象,则哈希值肯定是一样的,如果不是,则哈希值肯定不一样。
3哈希值主要根据地址号来,但是不完全等价于地址
Tostring方法:
![](/upload/otherpic11/221d10de45ae73cd212d44b438a3c923.jpg)
方法重写后:把对象的属性输出,也可以自己修改
直接用sout输出一个对象等价于sout 对象名.toString
Debug断点调试:可以在调试过程中加断点
F8逐行执行
F7跳入方法(查看方法)
Shift+F8跳出方法
F9直接跳到下一个断点
零钱通:
日期显示:
![](/upload/otherpic11/bc17e694e08e2eb99261059c3e1ccd3d.jpg)
![](/upload/otherpic11/adcbd5f3feb89ee67c9a0185b14df135.jpg)
类变量:
用static修饰的变量,是类共有的变量,可以通过类名来访问。同时需要遵守访问修饰符的权限。
![](/upload/otherpic11/bff612ff19c68178b0e927afa4c1613e.jpg)
类方法和类变量相似。
细节:
类方法中不能使用和对象有关的关键字,如this和super。
类方法只能访问静态变量或静态方法。
要在静态方法中访问,非静态方法或变量的话,可以通过在静态方法中new一个类,通过类访问非静态成员。
main方法:
由java虚拟机调用,而虚拟机所在为不同类,因此为public
Java虚拟机在执行main方法时,不必创建对象,所以为static
Java执行的程序,参数1,参数2,参数3,作为三个字符串数组传入args数组中
代码块:
(修饰符(static)){
代码
}(;)
代码块在构造器被调用时优先执行。
当有static修饰时,代码块随着类的加载而执行,并且只会执行一次
普通代码块:在对象创建时执行(new)
类的加载:在创建对象实例时(new)
创建子类对象实例,父类也会被加载(父类先加载)
使用类的静态成员时
创建对象时:在一个类中调用顺序:
![](/upload/otherpic11/45b2e47f7137b80fe6c2b41a1074fb3d.jpg)
(1)使用new创建对象之后,静态代码块和静态属性初始化调用的优先级一样,哪个在前先调用哪个,如上图先调用静态代码块。多个静态代码块和多个静态属性初始化的调用顺序同样。
(2)普通代码块和普通对象初始化,顺序同上
(3)调用构造方法
构造器代码顺寻:
(1).父类构造器
(2)本类代码块
(3)本类构造器代码
![](/upload/otherpic11/952f67f34878a4644957f3cf44ed81d3.jpg)
总结:先执行静态(先父类后子类),再普通(先父类后子类)。
静态代码块只能调用静态成员,普通代码块可以调用任意成员。
单例模式-饿汉式:
1将构造器私有化
2在类的内部直接创建
3提供一个公共的static方法,返回对象
![](/upload/otherpic11/74258e5835b6afae1fa69e5909b70157.jpg)
缺点:创建了对象但是没有使用,造成资源浪费
单例模式-饿汉式:
1构造器私有化
2定义一个static静态对象
3提供一个public的static方法,可以返回一个对象
4当用户使用getInstacnce时才返回对象,再次使用时返回同一个对象。
![](/upload/otherpic11/53ea7b60fdf6cecebba5c9eb20cc286c.jpg)
final关键词:
1可以用来修饰类:使类无法被继承(不希望被其中方法被重写)
2修饰方法,使方法无法被改写
3修饰属性,使属性无法被修改
4修饰局部变量,使无法被修改
细节:
1被final修饰的变量,需要在进行初始化,如在定义时,通过构造器,通过代码块
![](/upload/otherpic11/596d753d2edeeddd928d02d762da9820.jpg)
如果还有static修饰,则不能在构造器中赋值(代码块为静态)
2.final不能修饰构造器
3..final和static搭配使用,效率更高,不会导致类加载
![](/upload/otherpic11/57d0d7099e461a9c075049c5617d8ecf.jpg)
![](/upload/otherpic11/67981262f99a283661b798a30cde75f4.jpg)
![](/upload/otherpic11/50d2bfaf1c99615cb86db34faf8219d9.jpg)
4.包装类都是final类型,如String
抽象类:
当父类的一些方法不能确定时,用abstra修饰该方法。
用abstra修饰的方法没有方法体
抽象类不能被实例化(不能通过new的方式创建)
抽象类可以没有抽象方法,有抽象方法的类必须是抽象类
abstra只能修饰类和方法
抽象类本质还是类,可以有任意成员
当一个类继承抽象类后,它本身必须是一个抽象类或者实现父类中所有的抽象方法
![](/upload/otherpic11/3ebdcd3d685115b6a440d02f09d395a0.jpg)
抽象方法不能被private,final,static关键词修饰
接口:
interface 接口名{}
class 类名 implements 接口{
自己的属性
自己的方法:
![](/upload/otherpic11/3f1248d142df5faf2b401417deffd113.jpg)
必须实现的接口的抽象方法
}
细节:
接口不能被实例化(即new)
接口中的方法都是public方法,抽象方法可以不用abstra修饰
一个普通类实现接口,必须将改接口所有方法实现,可以使用alt+enter
抽象类去实现接口时,可以不实现接口的抽象方法
一个类可以实现多个接口
接口中的属性都是public static final 修饰符
接口可以继承接口,不能继承类
接口的修饰符只能是public或者默认,和类相同
接口可以解决单继承的问题
内部类:
局部内部类:
即在类中的一个方法中的类,该类可以直接访问外部类所有的成员(包括私有),不能使用修饰符(本质上是局部变量),但是可以用final修饰
作用域:仅仅在定义它的方法或代码块中。
外部类在方法中可以创建内部类对象,然后调用成员
当外部类和内部类的成员重名时,访问时默认遵循就近原则,可以通过外部类.this.成员,来访问
![](/upload/otherpic11/23e5bbe4d502d2f54ac53760c2ce12fd.jpg)
![](/upload/otherpic11/3ee7a5ff5a89233ef4e580ec30594f76.jpg)
![](/upload/otherpic11/57d84b60a24e79117dbf4485d610cb5e.jpg)
匿名内部类:
是一个类,同时是一个对象。是一个局部变量。
作用:简化开发
![](/upload/otherpic11/c1b2a37423b8c16e74171259fe1110f6.jpg)
匿名内部类的本质是一个匿名类继承一个类或者实现一个接口
![](/upload/otherpic11/27d85bf8078847ca7e214b2419b08f15.jpg)
第二个演示表示匿名内部类是一个对象。
匿名内部类可以当作实参直接传递
![](/upload/otherpic11/97f3799b027f12be91c5779330a08c9c.jpg)
创建内部成员类的方法:
![](/upload/otherpic11/f40ebaef8a9549d50e78711b2628b5b7.jpg)
2.
![](/upload/otherpic11/9409b06e1944c893ae5ed486df8d580f.jpg)
![](/upload/otherpic11/defeb7462042269c5ba6a7764325947a.jpg)
静态内部类:
是类的成员,遵循相同的访问规则。
枚举:
将构造器私有化,删掉set方法,将定义常量对象写在前面。
![](/upload/otherpic11/22cf45c72fbfe12e5501795ec73564c6.jpg)
细节:
创建枚举对象时,自动继承了Enum类。
成员必须放在前面,且用逗号隔开,最后一个用分号。
如果调用的构造器是无参时,“()”可以省略。
Enum的成员方法:
name()返回成员名称
ordinal()返回成员序号(从0开始)
values()返回成员数组
可以通过增强for循环来实现遍历
![](/upload/otherpic11/170b71ffb9ffb104688497bd67fc9f7f.jpg)
valueOf(“常量名”),在枚举中寻找该常量名
![](/upload/otherpic11/d73f16f2fc8554a8c03153cd8a62d2ed.jpg)
![](/upload/otherpic11/5924b52467018a1da42d5f0d05898a30.jpg)
常量1.compare To(常量2),返回得到常量1的编号减常量2的编号。
注解:
如:重写方法上的@Override
只能用在方法上,可以删掉,加上后编译器会检验方法是否被重写。
@Deprecated
可以修饰方法,类,字段,参数等到,用于做版本升级过渡
@SuppressWarnings
用于抑制警告,可以使用@ SuppressWarnings({“all“})抑制所有警告,也可以换成其它类型用于抑制相应类型的警告。
异常处理:
当程序出现一个异常后,可以让程序继续向下执行
![](/upload/otherpic11/7ba498b3ab2e1719074f0a8e6cc70f82.jpg)
使用ctrl+alt+t对可能出现异常的代码块进行异常处理。
![](/upload/otherpic11/ce7f246ba2d5ac00b6365b810e953caa.jpg)
细节:
当异常发生时,异常后面的代码不再执行,直接跳入catch代码块中
如果异常没有发生,则catch代码块不执行
finall代码块无论如何都会执行
可以没有catch,只有try和finally,此时若发生异常,程序会在执行完finally后结束。
Finally代码块必须执行,虽然在catch中返回3
![](/upload/otherpic11/fac31cbcf19f42bcb6d1c0f6f5deede3.jpg)
![](/upload/otherpic11/51d77e188577774c1eb5326f8f1edc77.jpg)
Throws:
Throws的对象可以是异常类型本身也可以是它的父类
子类在重写父类的方法时,抛出的异常类型要么和父类一致,要么是父类所抛出异常的子类异常
![](/upload/otherpic11/1d2c67c7298b32d4f669edfbad20e5fc.jpg)
![](/upload/otherpic11/75ee5dabac0677ec55a9ad81bc237081.jpg)
包装类:
![](/upload/otherpic11/bd6b1b0a0b428b09a0065703f0f1cf5e.jpg)
![](/upload/otherpic11/3479ccbfb025b505db8fc56636bf3286.jpg)
![](/upload/otherpic11/10ae50acf0b2466a692a10a0a940094e.jpg)
![](/upload/otherpic11/abaebd6a63f26af678b5d6036cd24659.jpg)
精度提升,三元运算符是一个整体
![](/upload/otherpic11/34ebd39aee52b50977731d4e5ad88e23.jpg)
包装类的转换
![](/upload/otherpic11/c0dc2eeb6defd3d4afcaaadcb67e4bc1.jpg)
包装类中的方法:
![](/upload/otherpic11/2d94038c52584a5412dc00e046034710.jpg)
![](/upload/otherpic11/d7e69405a4b513870f1615de7116fa42.jpg)
String类
![](/upload/otherpic11/4c8250dea4279ec28dcbe45e5b8fb604.jpg)
String类有很多构造器:
![](/upload/otherpic11/b2d01a72cda18afadcd406cb7b610c55.jpg)
用finally修饰的变量指向的地址不可改变。
当常量池中有变量时
![](/upload/otherpic11/cadf3ed6e1d514b33e01897fe10c3eb9.jpg)
String字符串特性:
![](/upload/otherpic11/7c5a5bb97c21c9f2353e9d973bb1f439.jpg)
该语句创建了两个对象(若常量池中无haha)
说明:String时一个finally类,其内容不可改变。
![](/upload/otherpic11/b8b492d70c05f19e24eef1e7d3d3b345.jpg)
编译器会优化:判断创建的常量池对象是否有引用的指向
等价于 Sting a = “helloabc”;
![](/upload/otherpic11/52c1836a2de00b88ab920844cdb2df85.jpg)
![](/upload/otherpic11/9f1c1c3c1ec1cd1317a4d3b5d86c4c6f.jpg)
String 中的intern方法:
![](/upload/otherpic11/17d3d6a5e4e24b562fbbbd1fd97018f3.jpg)
如果池中有“s1+s2“字符串,则返回该字符串的地址,若没有则创建一个该字符串
常用方法:
![](/upload/otherpic11/c56b2ce919b05895b9b8ab1ea46b9dd9.jpg)
示例:如果找不到,则返回-1;第一次出现的位置。可以找字符串
![](/upload/otherpic11/cc9b4268a0f7bf0d307870c8acaae8e3.jpg)
从下标6开始截取字符串
![](/upload/otherpic11/9e2c25f8a877b889f2b9ad71686a586e.jpg)
前闭后开截取字符串
![](/upload/otherpic11/eaa0703725ad636dd4d35c74b18fd486.jpg)
![](/upload/otherpic11/85bb64e4dd2504176215d1439a751c01.jpg)
示例:
![](/upload/otherpic11/9674ad061859215748c2f1301982c96b.jpg)
![](/upload/otherpic11/52d7756fda618d4b2465fbe14c03b260.jpg)
注意:原字符串没有被替换
![](/upload/otherpic11/a1c2f3b2cfd590216b4930884f390de1.jpg)
![](/upload/otherpic11/6537a2dd35b83241a84425028294e40f.jpg)
![](/upload/otherpic11/00656f52018b04b555ef189af1386a7b.jpg)
![](/upload/otherpic11/df98c37a41aaa513764eab7a4afabd6e.jpg)
![](/upload/otherpic11/94f4dd18be2e353e7bda7f57d550d83b.jpg)
![](/upload/otherpic11/76dda04dbec812aca36ace8bd8cffe04.jpg)
![](/upload/otherpic11/562f58a1580c154183262f114ca986d2.jpg)
StringBuffer:
直接父类:AbstractStringBuilder
父类中有属性 char[] value 不是final类型
StringBuffer是一个finally类,不能被继承
![](/upload/otherpic11/72abacb8b2044e84bf2ab6f77884e226.jpg)
String转StringBuffer
![](/upload/otherpic11/c3600538725700125ad4b296243a2bbd.jpg)
StringBuffer转String
![](/upload/otherpic11/619db0452f6cab7889b60fe9bb4dcac9.jpg)
StringBuffer中的方法:
![](/upload/otherpic11/d40ad7609b4252c91598f7eebb1c0f35.jpg)
![](/upload/otherpic11/e6a9517801406ddba6be8c1187c56259.jpg)
![](/upload/otherpic11/9f14d9ce3c0ac4765b23e6438f59ba07.jpg)
如果要对String进行大量修改,就不要使用String,考虑StringBuffer,如果是单线程同时考虑StringBuilder
![](/upload/otherpic11/a20f5293480e8c1d8f8ae9d9c26af7f5.jpg)
Math方法:
![](/upload/otherpic11/4187afd83fb029ec4ce658b1756e34b0.jpg)
round为四舍五入保留整数
Arrays类:
![](/upload/otherpic11/d7bb732c5faf49f8def3d8f2a0f65b37.jpg)
![](/upload/otherpic11/9d903005f8a3bdc227d5aeb52451117f.jpg)
![](/upload/otherpic11/3b171e3c7ab7189e42fe91830f2d4b1d.jpg)
![](/upload/otherpic11/5e5e2206d8d23086d07af7e893205684.jpg)
![](/upload/otherpic11/74317bfd4040e22a0e1998a55c70e65e.jpg)
如果传入的值为负数,则会报错
![](/upload/otherpic11/a015f1a268ad420afcb529c5d72aff53.jpg)
![](/upload/otherpic11/0f7a9c9f1964e453cd42605f2b4804d0.jpg)
System方法:
System.exit(0)
0表示程序正常退出
![](/upload/otherpic11/d926a01bbfdefc0d57b28dc98f977ba0.jpg)
Src:原数组
0:从原数组开始拷贝的位置
Dest:目的数组
0:从目的数字开始拷贝的位置
![](/upload/otherpic11/553d3ddd4040f6b18090e72c2d22a3b5.jpg)
处理大数和需要保持高精度计算时使用
Date:
![](/upload/otherpic11/8c09c3c1bf2eeef0c064a3a03295d91f.jpg)
Calendar:
![](/upload/otherpic11/e2d8a3b4e4a5154a3ca36666cffa1596.jpg)
Local:
![](/upload/otherpic11/8afbe3e8d053128f9a1c5de3ead6e0e2.jpg)
![](/upload/otherpic11/fae045f73ee4c9589ea5e7b8b364e085.jpg)
集合:
![](/upload/otherpic11/3e345df80dfe03265204e303257f2a96.jpg)
![](/upload/otherpic11/51a64514d864dd38f5beade1f23a3844.jpg)
ArrayList演示:
![](/upload/otherpic11/1683bd2bfc413332b6dbc32ac1309a7d.jpg)
迭代器:
![](/upload/otherpic11/30c31d85d05e05c663b240374efb5418.jpg)
List接口:
集合中的元素有序,且可以重复
每个元素都有对应的索引
可以根据其索引号来获取元素
![](/upload/otherpic11/d4cdcd70a518b58d92fb08c1cc557583.jpg)
![](/upload/otherpic11/504ec8d67bef57c96b0150aa9c834021.jpg)
ArraysList:
1.ArrayList基本等同于vector,效率高,但是不安全
2.ArrayList中维护了一个Object类型的数组
![](/upload/otherpic11/4bc548398390efc1f9ff0fd785d5ebd3.jpg)
Transient表示该属性不会被序列化
当创建ArrayList对象时,如果用的是无参构造器,则初始容量为0,第一次添加时数组扩容为10,如果需要再次扩容则扩容为当前容量的1.5倍。
如果使用指定大小的构造器,则在需要再次扩容则扩容为当前容量的1.5倍。
Vector:
底层依然是一个可变的数组
安全,但是效率不高
如果是无参,则在第一次添加后扩容为10,以后每次需要扩容为当前的2倍
![](/upload/otherpic11/357355ed01434d50d895e4edb949ded1.jpg)
![](/upload/otherpic11/33840eb1f052c64814a0df22a26d0754.jpg)
ArrayList和LinkList都是不安全的
Set接口:
无序,没有索引
不允许重复元素
虽然取出的顺序不是添加的顺序,但是顺序是固定的。
可以用迭代器和增强for循环进行遍历,不能用普通for循环,因为没有get方法
HashSet底层是hashmap,是一个数组加链表的结构
再添加一个元素时,先得到hash值,然后转换成索引值。
根据索引值存放到数组对应的位置
若对应的位置已有元素,则调用equals方法与元素进行比较,如果相同则放弃添加,如果不相同则添加到最后。
当一条链表的元素个数超过8以后,并且table的大小>=64,就会进行树化。
当添加的元素个数大于阈值(当前数组大小的0.75倍,数组初始化大小为16)时,数组会进行扩容,扩大为原来的两倍,同时阈值也会扩大为2倍。
Map:
保存具有映射关系的数据
Key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中
Key不允许重复,否则会覆盖
Key和value都可以为null,但是key只能有一个,value可以有多个
![](/upload/otherpic11/d2a25954f0e712d84eae8a61c634639c.jpg)
5.k-v最后是HashMap$Nodenode = newNode(hash,key,value,null)
6.为了方便程序员遍历,还会创建EntrySet集合,该集合存放的元素的类型Entry,而一个Entry对象就有k,v,EntrySet
7.entrySet中定义的类型是Map.Entry,但是实际上存放的还是HashMap$Node,因为Node实现了Map.Entry
8.当把HashMap$Node对象存放到EntrySet就方便我们的遍历,因为Map.Entry提供了重要的方法:getKey和getValue
![](/upload/otherpic11/5c3c341d6df2b84fa8f2a6963ec56744.jpg)
![](/upload/otherpic11/6ff775b828ab528a0c72db18bd108bda.jpg)
遍历方式:
![](/upload/otherpic11/ae58a7d0daf295b176e2fb0ff128eed1.jpg)
![](/upload/otherpic11/0888f1c19988624659d6bd4c7e664d7c.jpg)
HashTable:
键和值都不能为空,否则会抛出异常
使用方法基本和HashMap一样
每次扩容变为原容量的2倍+1,初始容量为11
Properties:
![](/upload/otherpic11/84271e1ad9c8b132fb14dc28dbd56acb.jpg)
Treeset:有序,可以自定义
![](/upload/otherpic11/0b9558c6272146df76308e84f7049073.jpg)
自定义比较器的作用:决定了数据的顺序,同时决定了数据能否被添加进去的规则,如上图:以长度升序排列字符串,如果有长度相同的情况则无法添加
Collection工具类:
![](/upload/otherpic11/48dc199083007f23ff5345925736e6fe.jpg)
![](/upload/otherpic11/b4a1698d2c4143fc3311c28c720fca3b.jpg)
![](/upload/otherpic11/e517350ddbe7506365a0feaf3891f08c.jpg)
下面的代码会报错,原因是在底层要尝试把加进去的对象转换成Comparable,对象没有实现comparable接口,因此会有转换类型的异常。
泛型:
1.为了约束数据类型
2.省去转型的麻烦
![](/upload/otherpic11/c99a21d44431beb500ebeae1272aa5cf.jpg)
约束加入的类型只能为Dog
![](/upload/otherpic11/93f2914645e2ad17e7ec402deb29a34a.jpg)
不用再向下转型
用来解决数据的安全性问题
作用:可以在类声明时通过一个表示表示类中的某个属性,或是某个方法的返回类型,或是参数类型
![](/upload/otherpic11/07d48bff7b1ece7aad09c788a4e962ad.jpg)
泛型使用细节:
1.泛型指向的数据类型要求是引用类型,不能是基本数据类型。如:
![](/upload/otherpic11/49131fee3c5d6da5c24e5e6c5f0c3e36.jpg)
Int是基本数据类型
2.在指定泛型后,传入的数据类型可以是其本身。也可以是其子类
3.使用形式:后面的括号里的内容可以省略,推荐这种写法
![](/upload/otherpic11/5279711fce33129323c8c15415120647.jpg)
4.如果没有指定泛型,则默认为Object类型
自定义泛型:
1.泛型标识符可以有多个,一般都是大写字母
2.普通成员(属性,方法)可以使用泛型
3.使用泛型的数组不能初始化(因为数组在new时,不能确定类型,因此无法开辟空间)
4.静态方法中不能使用泛型(静态方法在类加载时,对象还未创建,无法完成初始化)
自定义泛型接口:
1.接口中,静态成员不能使用泛型
2.泛型接口的类型,在继承接口或实现接口时确定
3.没有指定类型,默认为Object
泛型在方法中的使用:
1.泛型方法可以定义在普通类中,也可以定义在泛型类中
2.当泛型方法被调用时,类型会确定
3.泛型方法,可以使用类声明的泛型类型,也可以使用自己声明的泛型
4.注意泛型方法和方法使用了泛型的区别
形如:
![](/upload/otherpic11/26d82e66d48dd8ea46028558a40cbb6d.jpg)
R要在参数中使用,在调用方法时,会根据传入的参数的类型,变化R的类型
![](/upload/otherpic11/47bd2ff2659d668130caf711c78634e3.jpg)
Say1方法使用了泛型
![](/upload/otherpic11/37b3bd73141e07604456a046acbe5a5b.jpg)
Say2方法是泛型方法,同时也使用了泛型
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前标题:循序渐进学java-创新互联
文章路径:http://jxruijie.cn/article/csgipo.html