1、安装JDK{java开发环境,包含JRE(java运行环境)}
在dos命令中就可以使用了(需要切换到JDK的安装目录bin之下);
2、配置环境变量(就是JDK安装的路径添加到path中),一般命名为JAVA_HOME再添加到path,这样做的原因是方便修改jdk的安装路径(可能有多个jdk的版本,切换更加方便)
配置环境变量的目的是使计算机可以自动查找JDK,dos环境中无需切换至JDK的安装目录;
3、常用的DOS命令(windows版本):
请屏幕(擦黑板) cls
切换盘符 : 例如 d:
进入指定目录 cd 例如 cd D:\smSoft
返回上一级目录 cd…
返回盘符根目录 cd
列出当前目录下所有目录 dir
运行应用程序 程序完整名称 参数 例如:notepad
4、java程序可实现跨平台运行的原因是JVM虚拟机(java程序运行于虚拟机上然后再转换为各系统的机器指令,根据不同的操作系统实现其各自的虚拟机)
5、java程序的注释方法:
单行注释 //注释内容
多行注释 /*注释内容 */
文档注释 /**文档注释 */
其中文档注释可以用javadoc.exe命令生成API文档
{j建议,甚至是养成习惯:编写代码时先写思路、分析、步骤,然后再写代码。其中思路、分析、步骤都使用注释放在源代码中}
6、Java中的关键字:
八大基本类型:byte short int long float double char boolean
循环控制: if else break continue do while switch case for
访问修饰符: public private protected
类等定义相关:class enum abstract
7、标识符:
组成元素有:英文字符、数字、符号(_和$)
规则:数字不能开头、不可以使用关键字、区分大小写
建议命名规则:类(首字母大写,驼峰式命名)、方法(首字母小写)、包名(首字母小写)
8、数据类型
基本数据类型:
引用数据类型:数组、类、接口
9、常量
整数类型、小说类型、布尔类型、字符类型、字符串类型
10、变量
内存中装载数据的容器,只能用来存数据和取数据
计算机设备的最小信息单元叫“bit”(位)
计算机最小的存储单元叫"byte",及B(字节)这就是最小的存储单元(操作系统操作的最小单元,因为操作bit没有意见也不被允许);
1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
整型
byte 1 -128~127
short 2 -32768~32767
int 4 -2147483648~2147483648
long 8 -263~263-1
浮点型
float 4 -3.403E38~3.403E38
double 8 -1.798E308~1.798E308
字符型
char 2 表示一个字符,如(‘a’,‘A’,‘0’,‘家’)
布尔型
boolean 1 只有两个值true与false
java中默认的整数类型是int类型,超过int数据位的整数后加L表示long型,例如12345678901L,不加L就是错的;
java中默认的浮点类型是double类型;float类型常量必须添加“F”后缀
变量的定义:
数据类型 变量名 = 数据值;
变量使用的注意点(其实都是废话,谁使用时都不会这样做,因为编辑器肯定报错):
变量定义后可以不赋值,但是使用前必须要赋值;
变量的使用有作用域限制;
变量不可以重复定义
11、数据类型转换
不同数据类型的变量可以互相转换:
自动类型转换:小范围转换为大范围的数据类型
强制类型转换:大范围转换为小范围的数据类型
格式:范围小的数据类型 变量 = (范围小的数据类型) 范围大的数据类型值;
12、运算符
算术运算符
+、+、-、-、*、/、%、++、--
加 连接字符串 负号 减 乘 除 取模 自增 自减
其中:++,--运算符前置时,先将变量的值自增1或者自减1,然后使用更新后的新值参与运算操作
赋值运算符
=、+=、-=、*=、/=、%=
比较运算符(关系运算符)
==、!=、<、>、<=、>=
逻辑运算符
&、|、^、!、&&、||
三元运算符
(条件表达式)?表达式1:表达式2;
运算符的优先级:无需记忆,加()就可以了,谁也不会根据优先级来写,难以阅读
二、掌握基础的JDK API(基础类库) 掌握方法只有多敲多记
格式:
数据类型 变量名 = new 数据类型();
类:其方法使用可以参考 jdk api
Scanner【扫描】 扫描类
Random【随机】 随机类
三、流程控制
if(){}
if(){}
else{}
if(){}
else if(){}
else{}
while(){}
do{}
while();
for(初始化表达式; 循环条件; 操作表达式){
执行语句
………
}
跳转语句:
break 跳出循环 也可通过添加标记来跳出多层循环
continue 终止本次循环、继续下一次循环(还在循环内,并未跳出)
switch(){
case 1:
case 2:
...
}
四、数组
定义
数据类型[] 数组名 = new 数据类型[元素个数或数组长度];
默认值
数据类型 默认初始化值
byte、short、int、long 0
float、double 0.0
char 一个空字符(空格),即’\u0000’
boolean false
引用数据类型 null,表示变量不引用任何对象
数组遍历:array.length
数组的异常:ArrayIndexOutOfBoundsException (数组下标越界异常) 访问超过了该数组的长度
NullPointerException (空指针异常) 访问了非数组的元素(一般是变量的值为null,则意味着没有指向任何数组)
二维数组的定义:
int[][] arr = new int[3][4];
int[][] arr = new int[3][];
int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};
五、方法
语法格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,......){
执行语句
………
return 返回值;
}
其中 返回值类型为void 则无需返回,去掉return语句。
方法的重载:
只有两个条件 1、方法名相同 2、参数列表不同(参数的个数或参数的类型不同)
关于“形参”与“实参”只是概念上的区别,参数哦列表中的是形参,实际调用方法时传入的参数是实参。
六、类
引用数据类型(类)分为API提供(别人创建的)和自己创建的类(自定义):
类的定义格式
创建java文件,与类名相同
public class 类名{
数据类型 属性名称1;
数据类型 属性名称2;
…
}
类的使用格式:
导包:我们将所有的类放到同一个文件夹下,可以避免导包。
创建对象:数据类型 变量名 = new 数据类型();
调用方法: 变量名.方法名(参数类型 参数 ...)
调用属性: 变量名.属性名
集合:
集合的存在就是为了方便对多个对象的操作才出现的,集合是存储对象最常用的一种方式,也就是说,集合的从有到无都是因为对象,人们发现要保存多个对象很麻烦,于是便发明了集合,集合是依赖对象而生的
集合中存放的可都是对象的引用,实际内容都在堆上面或者方法区里面,但是基本数据类型是在栈上分配空间的。随时就被收回的。但是通过自动包装类就可以把基本类型转为对象类型
ArrayList:内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此也可以将ArrayList集合看作一个长度可变的数组。
集合存放类型必须是引用数据类型或者称为对象。
ArrayList 常用的方法:
boolean add(Object obj) 将指定元素obj追加到集合的末尾
boolean add(int index,Object obj) 将指定元素obj插入到集合中指定的位置
Object get(int index) 返回集合中指定位置上的元素
int size() 返回集合中的元素个数
Object remove(int index) 从集合中删除指定位置的元素,并返回该元素
void chear() 清空集合中所有的元素
Object set(int index,Object obj) 用指定元素替代集合指定位置的元素
还是需要查询JDK API 更加了解ArrayList的方法。
集合的遍历:
与数组的遍历类似,都是通过索引的方式;
经常用的算法有:
冒泡排序、二分查找
至此可以开始开发工具的使用了(当然基础全部学完更好)
选择idea就可以了(Java来说,目前它就是最好的开发工具)
基本类型作为参数传递时,其实就是将基本类型变量(比如x)空间中的值复制了一份给调用的方法,而不影响原来的值(局部变量的改变不影响成员变量)。而引用变量不同,它是将引用地址复制一份给调用的方法,若是修改了引用对象所指向的对象值,那么其他引用再次使用也都是修改后的值。
封装:
private 属性私有化,提供getter()和setter()方法
this:
指代本类(本对象)
可以在成员变量名前面加上this.来区别成员变量和局部变量
继承:
格式:
class 子类 extends 父类 {}
继承的好处:1、提高了代码复用性(提高开发效率);
2、让类与类之间有了联系,是实现多态的前提;
类的继承是单继承、可以多层继承;
父子类有相同的成员变量时,子类调用父类的成员变量要使用super关键字;
子父类中成员方法的特点:
先查找子类有无该方法,如没有再调用父类的方法;
子类成员方法的覆盖,完成自己的特有需求 即override;
抽象类、抽象方法 用abstract修饰的类和方法
抽象类可以包含非抽象方法也可以包含抽象方法;接口中的方法都是抽象方法;
接口:功能性抽取集合,包含的方法都是抽象方法
1、 接口中可以定义变量,修饰符必须是public static final 所以该变量也通常被称为常量;
2、接口中可以定义方法,方法也有固定的修饰符,public abstract
接口的出现一定程度上解决了类无法多继承的短板;
接口可以多继承(一个接口可以继承多个接口);
多态:
继封装、继承后面向对象的第三大特征。
最终多态体现为父类引用变量可以指向子类对象。多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
instanceof关键字
使用格式:
boolean b = 对象 instanceof 数据类型;
构造方法:
就是创建对象要执行的方法,
格式:
修饰符 构造方法名(参数列表)
{
}
构造方法的细节:
1、一个类中可以有多个构造方法,多个构造方法是以重载的形式存在的
2、构造方法是可以被private修饰的,作用:其他程序无法创建该类的对象。
类中的构造方法默认第一行都有隐式的super()语句,在访问父类中的空参数构造方法。所以父类的构造方法既可以给自己的对象初始化,也可以给自己的子类对象初始化。
如果默认的隐式super()语句在父类中没有对应的构造方法,那么必须在构造方法中通过this或者super的形式明确要调用的构造方法
关键字final (最终、不可变) 可以修饰 类、类的方法以及局部变量
final修饰类不可以被继承,但是可以继承其他类
final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final。
final修饰的变量称为常量,这些变量只能赋值一次。
引用类型的变量值为对象地址值,地址值不能更改,但是地址内的对象属性值可以修改。
修饰成员变量,需要在创建对象前赋值,否则报错。(当没有显式赋值时,多个构造方法的均需要为其赋值。)
关键字static 静态修饰符
多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量;
建议通过类名访问static修饰的成岩变量;例如:类名
.静态成员变量名
类名.静态成员方法名(参数)
静态常量:public static final修饰的变量来完成定义。此时变量名用全部大写,多个单词使用下划线连接
匿名对象:
创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。
创建匿名对象可以直接使用,没有变量名,只能使用一次;
匿名对象可以作为方法接受的参数、方法返回值使用;
内部类:
将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类
内部类分为成员内部类与局部内部类。
我们定义内部类时,就是一个正常定义类的过程,同样包含各种修饰符、继承与实现关系等。在内部类中可以直接访问外部类的所有成员
成员内部类 访问方式
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
局部内部类 访问方式
在外部类方法中,创建内部类对象,进行访问
代码块:
局部代码块:定义在方法或语句中
构造代码块:定义在类中成员位置的代码块
构造代码块优先于构造方法执行,构造代码块用于执行所有对 象均需要的初始化动作
每创建一个对象均会执行一次构造代码块
静态代码块:定义在成员位置,使用static修饰的代码块。
它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。
该类不管创建多少对象,静态代码块只执行一次。
可用于给静态变量赋值,用来给类进行初始化。
常用API
Object: Java语言的根类,即所有类的父类,它描述的所有方法,子类都可以访问
方法:
boolean equals(Object obj) 指示其他对象是否与此对象相等(该equals()方法内部使用==,就是将两个对象的内存地址相比较,所以开发经常需要子类重写equals方法根据对象的属性值进行比较)
String toString() 返回该对象的字符串表示(该字符串内容就是对象的类型+@+内存地址值,所以在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它)
String:
多个构造方法(参数列表不同)
int length() 返回此字符串的长度
String subString(int beginIndex) 返回一个新字符串,是此字符串的子字符串
String subString(int beginIndex,int endIndex) 返回一个新字符串,是此字符串的子字符串
boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始
boolean endWith(String suffix) 测试此字符串是否以指定的后缀结束
boolean contains(CharSequence s) 当且仅当此字符串包含指定的char值序列时,返回true
int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引
byte[] getByte() 使用平台的默认字符集将此String 编码为byte序列,并将结果存储到一个新的byte数组中;
char[] toCharArray() 将此字符串转换为一个新的字符数组;
boolean equals(Object obj) 将此字符串与指定字符串比较
boolean equalsIgnoreCase(String anotherString) 将此String与另一String比较,不考虑大小写
String toString() 返回此对象本身(它已经是一个字符串)
判断该字符串的内容是否为空的字符串
获取给定的字符,在该字符串中第一次出现的位置
获取该字符串中指定位置上的字符
把该字符串转换成 小写字符串
把该字符串转换成 大写字符串
在该字符串中,将给定的旧字符,用新字符替换
在该字符串中, 将给定的旧字符串,用新字符串替换
去除字符串两端空格,中间的不会去除,返回一个新字符串
StringBuffer: 字符串缓冲区支持可变的字符串
StringBuffer又称为可变字符序列,是个字符串的缓冲区,即就是它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作;
StringBuffer append(String str) 将指定的字符串追加到此字符序列
StringBuffer delete(int start,int end) 移除此序列的子字符串中的序列
StringBuffer insert(int offset,String str) 将字符串插入此字符序列中
StringBuffer replace(int start,int end,String str) 使用给定String中的字符替换此序列的子字符串中的字符
StringBuffer reverse()【颠倒】 将此字符序列用其反转形式取代
String toString() 返回此序列中数据的字符串表示形式
StringBuilder类:
(用法与StringBuffer类似)它也是一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步
正则表达式(Regular Expression,在代码中常简写为regex):
它就是一个字符串,用来定义“匹配规则”,匹配一系列符合该“匹配规则”的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
正则表达式的语法规则:
字符:x
含义:代表的是字符x
例如:匹配规则为 "a",那么需要匹配的字符串内容就是 ”a”;
字符:\\
含义:代表的是反斜线字符'\'
例如:匹配规则为"\\" ,那么需要匹配的字符串内容就是 ”\”
字符:\t
含义:制表符
例如:匹配规则为"\t" ,那么对应的效果就是产生一个制表符的空间
字符:\n
含义:换行符
例如:匹配规则为"\n",那么对应的效果就是换行,光标在原有位置的下一行
字符:\r
含义:回车符
例如:匹配规则为"\r" ,那么对应的效果就是回车后的效果,光标来到下一行行首
字符类:[abc]
含义:代表的是字符a、b 或 c
例如:匹配规则为"[abc]" ,那么需要匹配的内容就是字符a,或者字符b,或字符c的一个
字符类:[^abc]
含义:代表的是除了 a、b 或 c以外的任何字符
例如:匹配规则为"[^abc]",那么需要匹配的内容就是不是字符a,或者不是字符b,或不是字符c的任意一个字符
字符类:[a-zA-Z]
含义:代表的是a 到 z 或 A 到 Z,两头的字母包括在内
例如:匹配规则为"[a-zA-Z]",那么需要匹配的是一个大写或者小写字母
字符类:[0-9]
含义:代表的是 0到9数字,两头的数字包括在内
例如:匹配规则为"[0-9]",那么需要匹配的是一个数字
字符类:[a-zA-Z_0-9]
含义:代表的字母或者数字或者下划线(即单词字符)
例如:匹配规则为" [a-zA-Z_0-9] ",那么需要匹配的是一个字母或者是一个数字或一个下滑线
预定义字符类:.
含义:代表的是任何字符
例如:匹配规则为" . ",那么需要匹配的是一个任意字符。如果,就想使用 . 的话,使用匹配规则"\\."来实现
预定义字符类:\d
含义:代表的是 0到9数字,两头的数字包括在内,相当于[0-9]
例如:匹配规则为"\d ",那么需要匹配的是一个数字
预定义字符类:\w
含义:代表的字母或者数字或者下划线(即单词字符),相当于[a-zA-Z_0-9]
例如:匹配规则为"\w ",,那么需要匹配的是一个字母或者是一个数字或一个下滑线
边界匹配器:^
含义:代表的是行的开头
例如:匹配规则为^[abc][0-9]$ ,那么需要匹配的内容从[abc]这个位置开始, 相当于左双引号
边界匹配器:$
含义:代表的是行的结尾
例如:匹配规则为^[abc][0-9]$ ,那么需要匹配的内容以[0-9]这个结束, 相当于右双引号
边界匹配器:\b
含义:代表的是单词边界
例如:匹配规则为"\b[abc]\b" ,那么代表的是字母a或b或c的左右两边需要的是非单词字符([a-zA-Z_0-9])
数量词:X?
含义:代表的是X出现一次或一次也没有
例如:匹配规则为"a?",那么需要匹配的内容是一个字符a,或者一个a都没有
数量词:X*
含义:代表的是X出现零次或多次
例如:匹配规则为"a*" ,那么需要匹配的内容是多个字符a,或者一个a都没有
数量词:X+
含义:代表的是X出现一次或多次
例如:匹配规则为"a+",那么需要匹配的内容是多个字符a,或者一个a
数量词:X{n}
含义:代表的是X出现恰好 n 次
例如:匹配规则为"a{5}",那么需要匹配的内容是5个字符a
数量词:X{n,}
含义:代表的是X出现至少 n 次
例如:匹配规则为"a{5, }",那么需要匹配的内容是最少有5个字符a
数量词:X{n,m}
含义:代表的是X出现至少 n 次,但是不超过 m 次
例如:匹配规则为"a{5,8}",那么需要匹配的内容是有5个字符a 到 8个字符a之间
字符串中涉及的正则表达式的常用方法:
boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式
String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串
String replaceAll(String regex,String replacement) 使用给定的replacement 替换此字符串中所有匹配给定正则表达式的子字符串
Date类:
Date 表示特定的瞬间,精确到毫秒;
long getTime() 返回自1970年1月1日00:00:00 GMT 以来,此对象表示的毫秒数
DateFormat:
是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间;
日期/时间格式化子类(如 SimpleDateFormat类)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。
String format(Date date) 将一个Date 格式化为日期/时间字符串(用来将Date对象转换成String)
Date parse(String source) 从给定字符串的开始解析文本,以生成一个日期(就是来将String转换成Date;转换时,该String要符合指定格式,否则不能转换)
构造方法: SimpleDateFormat(String pattern) 用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat
DateFormat类的作用:即可以将一个Date对象转换为一个符合指定格式的字符串,也可以将一个符合指定格式的字符串转为一个Date对象。
指定格式的具体规则我们可参照SimpleDateFormat类的说明,这里做简单介绍,规则是在一个字符串中,会将以下字母替换成对应时间组成部分,剩余内容原样输出:
当出现y时,会将y替换成年
当出现M时,会将M替换成月
当出现d时,会将d替换成日
当出现H时,会将H替换成时
当出现m时,会将m替换成分
当出现s时,会将s替换成秒
Calendar:日历类
static Calendar getInstance() 使用默认时区和语言环境获得一个日历 (即返回当前时间)
abstract void add(int field,int amount) 根据日历规则,为给定的日历添加或减去指定的时间量
int get(int field) 返回给定日历字段的值
Date getTime() 返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象;
void set(int field,int value) 将给定的日历字段设置为给定值;
基本类型包装类:用于在基本数据和字符串之间进行转换
将字符串转换为基本数据类型:
parseXXX(String s) 其中XXX表示基本类型,参数为可以转成基本类型的字符串,如果字符串无法转成基本类型,将会发生数字转换异常 NumberFormatException
将基本数值转成字符串有3种方式:
1、基本类型直接与””相连接即可;34+""
2、调用String的valueOf方法;String.valueOf(34) ;
3、调用包装类中的toString方法;Integer.toString(34) ;
基本类型和对象转换:
其他基本类型转换方式与int和Integer相同
基本类型——>包装对象:
Integer(int value) 构造一个新分配的Integer对象,表示value的值;
Integer(String s) 构造一个新分配的Integer对象,表示String参数所表示的value值
例子:Integer i = new Integer(4);//使用构造函数函数
Integer ii = new Integer("4");//构造函数中可以传递一个数字字符串
static Integer valueOf(int i) 返回一个表示指定的int值的Integer实例;
static Integer valueOf(String s) 返回保存指定的String的值的Integer对象
例子;Integer iii = Integer.valueOf(4);//使用包装类中的valueOf方法
Integer iiii = Integer.valueOf("4");//使用包装类中的valueOf方法
包装对象——>基本类型
int intValue() 以int类型返回该Integer的值
int num = i.intValue();
System类:
该类不能手动创建对象,因为构造方法被private修饰,阻止外界创建对象。System类中的都是static方法,类名访问即可。System中代表程序所在系统,提供了对应的一些系统属性信息,和系统操作。
常用的方法:
static long currentTimeMillies() 返回以毫秒为单位的当前时间
static void exit(int status) 终止当前正在运行的Java虚拟机(JVM)
static void gc() 运行垃圾回收器
static String getProperty(String key) 获取指定键指示的系统属性
static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length) 从指定源数组中复制一个数组,复制从指定位置开始,到目标数组的指定位置结束。
Math类:
数学运算工具类,类似这样的工具类,其所有方法均为静态方法,并且一般不会创建对象。如System类。
常用方法:
static double abs(double a) 返回double值的绝对值
static double ceil(double a) 返回最小的(最接近负无穷大)double值,该值大于等于参数,并等于某个整数(就是往大取整)
static double floor(double a) 返回最大的(最接近正无穷大)double值,该值小于等于参数,并等于某个整数(就是往小取整)
static double max(double a,double b) 返回较大的一个
static double min(double a,double b) 返回较小的一个
static double pow(double a,double b) 返回第一个参数的第二次参数次幂的值
static double random() 返回带正号的double值,该值大于等于0.0且小于1.0
static long round(double a) 返回最接近参数的long(就是四舍五入)
Arrays类;
此类包含用来操作数组(比如排序和搜索)的各种方法
static int binarySearch(int[] a,int key) 使用二分搜索法来搜索指定的数组,以获得指定的值
static void sort(int[] a) 对指定的int型数组按照数字升序排序
static String toString(int[] a) 返回指定数组内容的字符串表示形式
大数据运算:
BigInteger类
部分构造方法
BigInteger(byte[] val) 将包含BigInteger的二进制补码表示形式的byte数组转换为BigInteger
BigInteger(int signum,byte[] magnitude) 将BigInteger的符号数量表示形式转换为BigInteger
BigInteger(int bitLength,int certainty,Random rnd) 构造一个随机生成的正BigInteger,它可能是一个具有指定bitLength的素数
BigInteger(int numBits,Random rnd)
BigInteger(String val)
BigInteger(String val,int radix)
BigDecimal类
double和float类型在运算中很容易丢失精度,造成数据的不准确性,Java提供我们BigDecimal类可以实现浮点数据的高精度运算
常用方法:
暂略
Collection接口:(集合层次结构的根)
常用方法:
boolean add(E e)
boolean addAll(Collection<? extends E> c)
void clear()
boolean contains(Object obj)
boolean containsAll(Collection<?> c)
int hashCode()
…
子类:
List接口:
元素存取有序的集合;
带有索引的集合;
可以有重复的元素
常用的子类有:ArrayList、LinkedList
常用的方法:
boolean add(E e)
void add(int Index,E element)
E get(int Index)
E remove(int index)
boolean remove(Object obj)
E set(int index,E element)
Iterator iterator()
Iterator接口:迭代器接口
迭代过程中,使用集合的方法对元素进行操作,迭代器并不知道集合中的变化,将导致数据的不确定性,易引发异常ConcurrentModificationException【并发修改异常】
通过ListIterator迭代器操作元素是可以的,ListIterator的出现,解决了使用Iterator迭代过程中可能会发生的错误情况
List接口下有很多个集合,它们采用不同的结构方式来存储元素,有各自的特点(这也是各使用场景的不同要求需要这么多的实现方式)。数据存储的常用结构有:堆栈、队列、数组、链表。
堆栈:
先进后出,栈的入口、出口的都是栈的顶端位置
压栈:就是存元素
弹栈:就是取元素
队列
先进先出
数组
查找元素快
增删元素慢:
链表
多个节点之间,通过地址进行连接
查找元素慢:
增删元素快:
ArrayList集合:数据存储的结构是数组结构
LinkedList集合:数据存储的结构是链表结构。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
Vector集合:数据存储的结构是数组结构(该集合已经被ArrayList替代了)
Set接口:该集合所存储的元素就是不重复的。
子类:
HashSet:数据存储的结构是哈希表
不能保证的迭代顺序与元素存储顺序相同;
采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。
所以,如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式(存储JavaAPI中提供元素时不需要再重写hashCode和equals,因为JavaApi都重写过了)
LinkedHashSet:数据存储的结构是哈希表和链表的结合(所以该集合存储的数据是有序的)
判断元素是否重复的方法:
boolean contains(Object obj) 如果集合中包含指定的元素则返回true
Map接口:与Collection接口的集合不同,其元素是成对存在的,每个元素由键与值两部分组成,通过键可以找对所对应的值。该集合不能包含重复的键,值可以重复;常用的集合为HashMap集合、LinkedHashMap集合。
常用的方法:
V get(Object key)
V put(K key,V value)
V remove(Object key)
Set keySet()
Set<Map.Entry<E,V>> entrySet()
HashMap<K,V> : 存储数据采用的哈希表结构
LinkedHashMap<K,V> : 存储数据采用的哈希表结构+链表结构,通过链表结构可以保证元素的存取顺序一致.
Map接口提供了一个静态内部嵌套接口Entry
static interface Map.Entry<K,V>
方法: K getKey()
V getValue()
可变参数的定义(可变参数一定要写在参数列表的末尾位置):
修饰符 返回值类型 方法名(参数类型… 形参名){ }
等价于:修饰符 返回值类型 方法名(参数类型[] 形参名){ }
Collections集合工具类:
方法都是静态方法,该类调用其方法对集合对象(collection、Map)进行操作。