1、JDK和JRE
(1)JDK
是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
(2)JRE
Java Runtime Environment缩写,指Java运行环境,是Sun的产品。运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。有时候直接是以java命名,如java8就是jre8。
目前在官网下载低于jdk1.8的java jdk的时候需要登陆,这边分享一个账号,方便下载
账号:2696671285@qq.com
密码:Oracle123
2、基本数据类型
JAVA中一共有八种基本数据类型,他们分别是 :byte、short、int、long、float、double、char、boolean
类型 | 型别 | 字节 | 取值范围 |
byte | 整型 | 1byte | -27 ~ 27-1 |
short | 整型 | 2byte | -215 ~ 215-1 |
int | 整型 | 4byte | -231 ~ 231-1 |
long | 整型 | 8byte | -263 ~ 263-1 |
float | 浮点型 | 4byte | 3.402823e+38 ~ 1.401298e-45 |
double | 浮点型 | 8byte | 1.797693e+308~ 4.9000000e-324 |
char | 文本型 | 2byte | 0~216-1 |
boolean | 布尔型 | 1byte | true/false |
对于long,若赋值大于int最大或最小值,需在数字后加L或l,表示该数字为长整型。在默认下,小数被看作double,若使用float型小数,则需要在小数后加F或f。可以使用后缀D或d来明确这是一个double,不加也不会出错,但声明float型变量时如果不加f,系统会认为变量是double,从而出错。布尔值不能与整数类型进行转换。
3、常量和变量
(1)常量
Java中声明常量出数据类型外还要final关键字(也称“final变量”)。
final 数据类型 常量名[=值]
注意,当定义的final变量属于“成员变量”(在类中声明时)是,必须在定义时就设定它的初值,否则将会产生编译错误。final变量在方法中时则没此限制。
(2)变量
a、成员变量
类体中的变量为成员变量,分为静态变量(static)和实例变量。静态变量的有效范围可以跨类,甚至可达到整个应用程序之内,在定义它的类内直接存取外,还可以“类名.静态变量”的方式在其他类内使用。
class var{
int x = 5; // 实例变量
static int y = 10; // 静态变量
}
b、局部变量
在类的方法体中定义的变量。当局部变量和成员变量的名字相同时,成员变量将被隐藏。
4、移位操作
(1)左移(<<)
将运算符左边的操作数的二进制数据,安装运算符右边操作数指定的位数向左移动,右边移空的部分补0。
(2)右移(>>)
如果最高位是0,右移空的位填入0;若干==如果最高位是1,右移空的位填入1。
(3)无符号右移(>>>)
无论最高位是0还是1,右移空的为的最高位都填入0。
注:以为可实现整数乘或除以2的n次方的效果。一个数左移n位,就是将这个数乘2的n次方;一个数右移n位,就是将这个数除以2的n次方。
5、循环控制之“标签”功能
Java中break和continue都支持“标签”功能,可指定跳出的循环。
Loop: for (int i = 0; i < 3; i++) {// 在for循环前用标签标记
for (int j = 0; j < 6; j++) {
if (j == 4) {// 如果j等于4的时候就结束外层循环
break Loop;// 跳出Loop标签标记的循环体
}
System.out.println("i=" + i + " j=" + j);
}
}
6、String类
String类用来处理字符,包含在java.lang包中。
(1)创建字符串
a、String(char a[])
用一个字符数组a创建一个String对象。
例:
char a[] = {‘g’, ’o’, ‘o’, ‘d’};
String s = new String(a);
// 等价于:
String s = new String(“good”);
b、String(char a[], int offset, int length)
提取字符数组a中的一部分创建一个字符串对象。参数offset表示开始截取字符串的位置,length表示截取字符串的长度。
例:
char a[]{‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’};
String s = new String(a, 2, 4);
// 等价于:
String s = new String(“uden”);
c、String(char[] value)
该构造方法可分配一个新的String对象,使其表示字符数组参数中所有元素连接的结果。
例:
char a[]{‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’};
String s = new String(a);
// 等价于:
String s = new String(“student”);
d、通过字符串常量的引用赋值给一个字符串变量。
String str1, str2;
str1 = “studnet”;
str2 = “studnet”;
// 注:此时str1和str2引用相同的字符串常量,因此具有相同的实体。
(2)连接多个字符串
在String中使用“+”可连接多个字符串。在字符串中也可同其他基本数据类型进行连接。如果将字符串同这些数据类型数据进行连接,会将这些数据直接转换成字符串,即此时会自动调用toString()方法。
int booktime = 4; // 声明的int型变量booktime
float practice = 2.5f; // 声明的float型变量practice
// 将字符串与整型、浮点型变量相连,并将结果输出
System.out.println("我每天花费" + booktime + "小时看书;"
+ practice + "小时上机练习");
(3)字符串查找
String提供两种字符串查找方法。
a、indexOf(String s)
该方法会从当前字符串的开始位置搜索s的位置,如果检索到字符串s则返回参数字符串s在指定字符串中首次出现的索引位置 ;如果没有检索到字符串s,返回-1;
例:
String str = ”we are student”;
int size = str.indexOf(“a”); // size的值为3
b、lastIndexOf(String str)
该方法从右向左反向查找指定的字符串,如果找到指定字符串,则返回该字符串中第一个字符的索引(实际上就是返回指定字符串最后一次出现的索引位置);若干没有找到则返回-1。
注:如果lastIndexOf()方法中的参数是空字符串””,则返回结果与调用该字符串length()方法的返回结果相同(即返回该字符串的长度)。
c、charAt()
该方法可将指定索引处的字符返回。
例:
String str = "hello word"; // 定义字符串str
char mychar = str.charAt(6); // 将字符串str中索引位置是6的字符返回
System.out.println("字符串str中索引位置是6的字符为:" + mychar); // 输出信息
(4)获取子字符串
a、substring(int beginIndex)
返回指定索引位置开始截取直到该字符串结尾的子串。
str.substring(int beginIndex);
b、substring(int beginIndex, int endIndex)
返回字符串从beginIndex开始到endIndex索引位置的子串,实际是左闭右开的位置,即包含beginIndex索引的字符但是不包含endIndex位置的字符。
例:
String str = "hello word"; // 定义的字符串
String substr = str.substring(0, 3); // 对字符串进行截取
System.out.println(substr); // 输出截取后的字符串,输出hel
(5)去除空格
trim()返回字符串的副本,忽略前导空格和尾部空格。
例:
String str = " Java class "; // 定义字符串str
System.out.println("字符串原来的长度:" + str.length()); // 将str原来的长度输出为16
System.out.println("去掉空格后的长度:" + str.trim().length()); // 去掉空格后为11
(6)字符串替换
replace()可将指定字符或字符串替换成新的字符或字符串。如果字符串oldChar中没有出现该对象表达式中的字符串序列中,则将原字符串返回。如果要替换的字符oldChar在字符串中重复出现多次,replace()会将所有oldChar全部替换成newChar。
str.replace(char lodChar, char newChar);
(7)判断字符串的开始于结尾
a、startsWith()
判断当前字符串对象的前缀是否为参数指定的字符。
str.startsWith(String preflx);
b、endsWith()
判断当前字符串对象的后缀是否为参数指定的字符。
str.endsWith();
(8)判断字符串是否相等
对字符串对象的比较不能简单使用比较运算符“==”,因为比较运算符比较的是两个字符串的地址是否相同,而字符串对象拥有不同的内存地址,所有即使两个字符串的内容相同,两个对象的内存地址也是不同的。
a、equals()
如果两个字符串具有相同的字符和长度,则使用equals()进行比较时,返回true。
str.equals(String otherstr);
b、equalsIgnoreCase
使用equals()比较两个字符串时时区分大小写的,而使用equalsIngoreCase()则是在忽略大小写的情况下比较两个字符串是否相等,返回结果为boolean类型。
str.equalsInnoreCse(String otherstr);
(9)按字典顺序比较两个字符串
compareTO()为按字典顺序比较两个字符串,该比较基于字符串中各个字符串的Unicode值,按字段顺序将此String对象表示的字符序列与参数字符串的字符序列进行比较。如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为0。
注:compareTo()方法只有在equals(object)方法返回true时才放回0。
String str = new String("b");
String str2 = new String("a"); // 用于比较的3个字符串
String str3 = new String("c");
System.out.println(str + " compareTo " + str2 + ":"
+ str.compareTo(str2)); // 将str与str2比较的结果输出:1
System.out.println(str + " compareTo " + str3 + ":"
+ str.compareTo(str3)); // 将str与str3比较的结果输出:-1
(10)字母大小写转换
a、toLowerCase()
将字符串中所有字符从大写转换为小写。
str.toLowerCase();
b、toUpperCase()
将字符串中所有字符从小转换为大写。
str.toUpperCase();
注:使用toLowerCase()和toUpperCase()进行大小写转换时,数字或非字符不受影响。
(11)字符串分割
a、split(String sign)
根据给定的分割符对字符串进行拆分。sign为分割字符串的分割符,也可是正则表达式。
b、split(Sring sign, int limit)
根据给定的分割符对字符串进行拆分,并限定拆分次数。sign为分割字符串的分割符,也可是正则表达式;limit为模式匹配次数,如果值设置为n,那么将根据正则表达式匹配n-1次,得到的结果数组的长度不会大于n,数组的最后一项是最后匹配的分割符以后的全部内容。
例:
String str = "192.168.0.1";
// 按照"."进行分割,使用转义字符“\\.”
String[] firstArray = str.split("\\.");
// 按照"."进行两次分割,使用转义字符“\\.”
String[] secondArray = str.split("\\.", 2);
// 输出str原值
System.out.println("str的原值为:[" + str + "]");
// 输出全部分割的结果
System.out.print("全部分割的结果:");
for (String a : firstArray) {
System.out.print("[" + a + "]");
}
System.out.println();// 换行
// 输出分割两次的结果
System.out.print("分割两次的结果:");
for (String a : secondArray) {
System.out.print("[" + a + "]");
}
System.out.println();
输出:
(12)格式化字符串
a、format(String format, Object ...args)
使用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境。
- foramt:格式字符串
- args:格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数模是可变的,可为0。
b、format(Local l, String format, Object ...args)
- l:格式化过程中要应用的语言环境。如果l为null,则不会进行本地化。
- foramt:格式字符串
- args:格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数模是可变的,可为0。
例:
Date date = new Date();
String time = String.format("%tc", date);
日期格式化转换符:
时间格式化转换符:
日期和时间组合的格式:
常规转换符:
(13)正则表达式
正则表达式通常用于判断语句中某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。
正则表达式的元字符:
注:正则表达式中“.”代表任何一个字符,因此正则表达式中如果想使用普通意义的点字符“.”,必须使用转义字符“\”。
正则表达式中可使用方括号括起若干字符来表示一个元字符,该元字符可代表方括号中的任何一个字符,例如:
正则表达式之后再给你允许使用限定符来限定元字符出现的次数,例如:
为了检查输入的数据是否满足某种格式,从JDK1.4开始可以使用String类的matches()方法进行判断。语法如下所示:
boolean matches(String regex)
- regex:指定的正则表达式
返回值:如果当前字符串与正则表达式匹配,则该方法返回true,否则返回false。
例:
// 定义要匹配E_mail地址的正则表达式
String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
String str1 = "1111@111ffyu.dfg.com";
if (str1.matches(regex)) { // 判断字符串变量是否与正则表达式匹配
System.out.println(str1 + "是一个合法的E-mail地址格式");
}
输出:
(14)字符串生成器
创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用“+” 可以达到附加新字符或字符串的目的,但“+”会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改,将极大地增加系统开销。而J2SE 5.0新增了可变的字符序列String- Builder类,大大提高了频繁增加字符串的效率。
String str = ""; // 创建空字符串
// 定义对字符串执行操作的起始时间
long starTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) { // 利用for循环执行10000次操作
str = str + i; // 循环追加字符串
}
long endTime = System.currentTimeMillis(); // 定义对字符串操作后的时间
long time = endTime - starTime; // 计算对字符串执行操作的时间
System.out.println("Sting消耗时间:" + time); // 将执行的时间输出
StringBuilder builder = new StringBuilder(""); // 创建字符串生成器
starTime = System.currentTimeMillis(); // 定义操作执行前的时间
for (int j = 0; j < 10000; j++) { // 利用for循环进行操作
builder.append(j); // 循环追加字符
}
endTime = System.currentTimeMillis(); // 定义操作后的时间
time = endTime - starTime; // 追加操作执行的时间
System.out.println("StringBuilder消耗时间:" + time); // 将操作时间输出
输出:
通过这一实例可以看出,两种操作执行的时间差距很大。如果在程序中频繁地附加字符串,建议使用StringBuilder. 新创建的StringBuilder对象初始容量是16个字符,可以自行指定初始长度。如果附加的字符超过可容纳的长度,则StringBuilder对象将自动增加长度以容纳被附加的字符。若要使用StringBuilder最后输出字符串结果,可使用toString0方法。利用StringBuilder类中的方法可动态地执行添加、删除和插入等字符串的编辑操作。该类的常用方法如下。
(a) append(content)方法
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如int、 boolean、char、 String、 double 或者另一个字符串生成器等。
语法如下:
append(content);
- content:表示要追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象。
(b) insert(int offset, arg)方法
该方法用于向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入int、float、char和boolean等基本数据类型或其他对象。
语法如下:
insert(int offset, arg)
- offset:字符串生成器的位置。该参数必须大于等于0,且小于等于此序列的长度。
- arg: 将插入至字符串生成器的位置。该参数可以是任何的数据类型或其他对象。
例:
StringBuilder bf = new StringBuilder(“hello”);
bf.insert(5, “word”);
System.out.println(bf.toString()); // 输出helloworld
(c) delete(int start,int end)方法
移除此序列的子字符串中的字符。该子字符串从指定的start 处开始,- -直到索引end -1处的字符,如果不存在这种字符,则一-直到序列尾部。如果start等于end,则不发生任何更改。
语法如下:
delete(int start,int end)
start:将要删除的字符串的起点位置。
end:将要删除的字符串的终点位置。
例:
StringBuilder bf = new StringBuilder(“StringBuilder”);
bf.delete(5, 10);
System.out.println(bf.toString()); // 输出Strinder
7、数组
Java中将组数看作一个对象,虽然基本数据类型不是对象,但由基本数据类型组成的数组却是对象。数组作为对象允许使用new关键字进行内存分配。在使用数组之前,必须首先定义数组变量所属的类型。
(1)创建一维数组
(a)先声明,再用new运算符进行内存分配
声明一维数组有两种方式:
数组元素类型 数组名字[];
数组元素类型[] 数组名字;
例:
int arr[];
string[] str;
声明数组后,还不能立即访问它的任何元素,因为声明数组只是给出了数组名字和元素的数据类型,要想真正使用数组,还要为它分配内存空间。在为数组分配内存空间时必须指明数组的长度。为数组分配内存空间的语法格式如下:
数组名字 = new 数组元素的类型[数组元素的个数];
例:
arr = new int[5];
(b)声明的同时为数组分配内存
数组元素的类型 数组名 = new 数组元素的类型[数组元素的个数];
例:
int month[] = new int[12];
注:使用new为数组分配内存时,整型数组中各个元素的初始值都是0。
(2)初始化一维数组
两种形式:
例:
int arr[] = new int[]{1, 2, 3};
int arr2[] = {1, 2, 3};
(3)二维数组的创建
(a)先声明,再用new运算符进行内存分配
数组元素类型 数组名字[][];
数组元素类型[][] 数组名字;
两种方法为数组分配内存:
// 直接为每一维分配内存空间
a = new int[2][4];
// 分别为每一维分配内存
a = new int[2][]
a[0] = new int[2];
a[1] = new int[3];
(4)二维数组初始化
type arrayname[][] = {value1, value2... valuen};
例:
int myarr[][] = {{1, 2}, {4, 5}};
注:对于整型二维数组,创建成功后系统会给数组中每个元素赋予初始值0。
(5)填充替换数组元素
数组中的元素定义完成后,可通过Arrays类的静态方法fll0来对数组中的元素进行替换。该方法通过各种重载可完成对任意类型的数组元素的替换。
(a)fill(int[] a, int value)
将指定的int值分配给int型数组的每个元素。
- a:要进行元素替换的数组
- value:要存储数组中的所有元素的值
例:
int arr[] = new int[5];
Array.fill(arr, 8); // arr中的每个元素都有8替换
(b)fill(int[] a, int fromIndex, int toIndex, int value)
将指定的int值分配给int型数组指定范围中的每个元素。填充的范围从索引fromIndex(含)到索引toIndex(不含)。如果fromIndex = toIndex,则填充范围为空。
- a:要进行填充的数组
- fromIndex:要使用指定值填充的第一个元素的所有(含)
- toIndex:要使用指定值填充的最后一个元素的所有(不含)
- value:要存储数组中的所有元素的值
例:
int arr[] = new int[]{45, 52, 32, 10};
Arrays.fill(arr, 1, 2, 8); // 将数组中的第1个元素替换为8
注:如果指定的索引位置大于或等于要进行填充的数组的长度,则会报出ArrayIndexOutOfBoundsException (数组越界异常)异常。
(6)对数组排序
通过Arrays类的静态sort(0方 法可以实现对数组的排序。sort)方 法提供了多种重载形式,可对任意类型的数组进行升序排序。
例:
int arr[] = new int[]{45, 52, 12, 32};
Arrays.sort(arr); // 升序排序
上述实例是对整型数组进行排序。Java 中的String 类型数组的排序算法是根据字典编排顺序排序的,因此数字排在字母前面,大写字母排在小写字母前面。
(7)复制数组
(a)copyOf(arr, int newlength)
复制数组至指定长度。
- arr:要进行复制的数组;
- newlength: int 型常量,指复制后的新数组的长度。如果新数组的长度大于数组arr 的长度,则用0填充(根据复制数组的类型来决定填充的值,整型数组用0填充,char 型数组则使用。null来填充);如果复制后的数组长度小于数组arr 的长度,则会从数组arr的第一个 元素开始截取至满足新数组长度为止。
例:
int arr[] = new int[] {12, 52, 32};
int newArr[] = Arrays.copyOf(arr, 5); // 将arr的值复制到newArr
(b)copyOfRange(arr, int fromIndex. int toIndex)
将指定数组的指定长度复制一个新数组中。
- arr:要进行复制的数组;
- formIndex:指定开始复制数组的索引位置。formIndex 必须在0至整个数组的长度之间。新数组包括索引是formIndex的元素。
- toIndex:要复制范围的最后索引位置。可大于数组arr的长度。新数组不包括索引是toIndex的元素。
例:
int arr[] = new int[] {12, 52, 32, 56, 74};
int newArr[] = Arrays.copyOf(arr, 0, 3); // 将arr的第0个到第2个元素复制到newArr中
(8)数组查询
Arrays类的binarySearch()方法,可使用二分搜索法来搜索指定数组,以获得指定对象。该方法返回要搜索元素的索引值。binarySearch()方法提供了多种重载形式,用于满足各种类型数组的查找需要。binarySearch0方法有两种参数类型:
(a)binarySearch(Object[], Object key)
- a:要搜索的数组
- key:要搜索的值
如果key包含在数组中,则返回搜索值的索引。如果数组中的所有元素都小于指定的键,则返回-(a.length+1) ;如果数组中的所有元素都大于指定的键,返回-1。即不在数组中的时返回的是该key在从小到大排序的数组中的索引值的负数。
注:
必须在进行此调用之前对数组进行排序(通过sort())方法)。如果没有对数组进行排序,则结果是不确定的。如果数组包含多个带有指定值的元素,则无法保证找到的是哪一个。
例:
int ia[] = new int[] {4, 25, 10 };
Arrays.sort(ia);
int index = Arrays.binarySearch(ia, 0, 1, 8);
上面的代码中变量index的值是元素“8”在数组arr中索引在0~1内的索引位置。由于在指定的范围内并不存在元素“8”,index 的值是“_”(插入点)。如果对数组进行排序,元素“8”应该在“25”的前面,因此插入点应是元素“25”的索引值2,所以index的值是-2。
例:
int ia[] = new int[] { 1, 8, 9, 4, 5 }; // 定义int型数组ia
Arrays.sort(ia); // 将数组进行排序
int index = Arrays.binarySearch(ia, 4); // index 值为“1”,是对ia排序后元素4的索引位置
(b)binarySearch(Object[] a, int fromIndex, int toIndex, Object key)
在指定的范围内检索某一元素。
- a:要进行检索的数组。
- fromIndex:指定范围的开始处索引(包含)。
- toIndex:指定范围的结束处索引(不包含)。
- key:要搜索的元素。
在使用该方法之前同样要对数组进行排序,来获得准确的索引值。如果要搜索的元素key在指定的范围内,则返回搜索键的索引。如果范围中的所有元素都小于指定的键,则为返回toIndex +1;如果范围中的所有元素都大于指定的键,则为返回-1。即不在数组中的时返回的是该key在从小到大排序的数组中的索引值的负数。
如果指定的范围大于或等于数组的长度,则会报出ArrayIndexOutOfBoundsException异常。
例:
String str[] = new String[] { "ab", "cd", "ef", "yz" };
Arrays.sort(str); // 将数组进行排序
int index = Arrays.binarySearch(str, 0, 2, "cd"); // index的值为1
// int index = Arrays.binarySearch(str, 0, 2, "g"); // index的值为-3