1.字符串
从概念上讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫String。
每个用双引号括起来的字符串都是 String类的一个实例
子串(截取字符)
String类的substring方法可以从一个较大的字符串提取出一个子串。
public String substring(int beginIndex, int endIndex)
第一个int为开始的索引,对应String数字中的开始位置,
第二个是截止的索引位置,对应String中的结束位置
拼接
Java允许使用+号连接(拼接)两个字符串
如果需要把多个字符串放在一起,用定界符分隔,可以使用静态join方法
String all = String.join("/","S","M","L","XL");
//输出"S/M/L/XL"
检测字符串是否相等
可以使用equals()方法检测两个字符串是否相等。
检测两个字符串是否相等,而不区分大小写可以使用equalsIgnoreCase()方法
不能使用==运算符来检测两个字符串是否相等。
==与equals的区别
==是用来对基本数据类型进行比较,比较的是它们的值是否相同
作用于引用类型的变量,则比较的是所指向的对象的地址
equals是用来比较是否是同一对象
没有对equals方法进行重写,比较的是引用类型的变量所指向的对象的地址
如果是使用String、Date等类对equals方法进行重写的话,比较的是所指向对象的
内容
equals不能作用于基本数据类型的变量
空串与Null串
空串""是长度为0的字符串。可以调用以下代码检查一个字符串是否为空:
if (str.length() = 0)
或
if (str.equals(""))
空串有自己的串长度(0)和内容(空)
String变量还可以存放一个特殊的值,null,表示目前没有任何对象与该变量关联。
检查代码
if (str != null && str.length() != 0)
长度(码点)
在Java中可以使用length()返回给定字符串的长度(单元代码数量)
使用charAt(n)将返回指定位置N的字符(代码单元)
字符串常用方法
除了书中提到的方法,还有一些在开发过程中会经常使用的方法
字符串名.toLowerCase() //将字符串中的字母全部转换为小写,非字母不受影响
字符串名.toUpperCase() //将字符串中的字母全部转换为大写,非字母不受影响
字符串名.trim() //去除空格
str.split(String sign) //分割字符串
str.split(String sign,int limit) //分割字符串
示例:
String Colors="Red,Black,White,Yellow,Blue";
String[] arr1=Colors.split(","); //不限制元素个数
String[] arr2=Colors.split(",",3); //限制元素个数为3
输出:
所有颜色为:
Red
Black
White
Yellow Blue
前三个颜色为:
Red
Black
White,Yellow,Blue
字符串.replace(String oldChar, String newChar) //replace() 方法用于将目标字符串中的指定字符(串)替换成新的字符(串)
字符串.replaceFirst(String regex, String replacement) //用于将目标字符串中匹配某正则表达式的第一个子字符串替换成新的字符串
示例:
String words="hello java,hello php";
String newStr=words.replaceFirst("hello","你好 ");
System.out.println(newStr); //输出:你好 java,hello php
字符串.replaceAll(String regex, String replacement) //用于将目标字符串中匹配某正则表达式的所有子字符串替换成新的字符串
String words="hello java,hello php";
String newStr=words.replaceAll("hello","你好 ");
System.out.println(newStr); //输出:你好 java,你好 php
//根据字符查找,返回索引位置
str.indexOf(value)
str.indexOf(value,int fromIndex) fromIndex 表示从指定字符串中的开始位置
indexOf() 方法用于返回字符(串)在指 定字符串中首次出现的索引位置,如果能找到,则返回索引值,否则返回 -1。
str.lastIndexOf(value)
str.lastlndexOf(value, int fromIndex)
lastIndexOf() 方法的查找策略是从右往左查找,如果不指定起始索引,则默认从字符串的末尾开始查找。
字符串名.charAt(索引值)
charAt() 方法可以在字符串内根据指定的索引查找字符
StringBuilder类
作用:存储字符进行连接,减少内存占用,节约时间
1.构建一个空的字符串构建器
StringBuilder builder = new StringBuilder();
使用append()方法添加内容
builder.append(ch)
需要构建字符串时,调用toString()方法。得到一个String对象,其中包含了构建器中的字符序列
String completedString = builder.toStringO;
构建器中的重要方法
StringBuilder() 构造一个空的字符串构建器。
int length() 返回构建器或缓冲器中的代码单元数量
StringBuilder append(string str) 追加一个字符串并返回 this。
StringBuilder append(char c) 追加一个字符串并返回 this。
StringBuilder appendCodePoint(int cp) 追加一个代码点,并将其转换为一个或两个代码单元并返回 this。
void setCharAt(int i,char c) 将第 i 个代码单元设置为 c。
StringBuilder insert(int offset,String str) 在 offset 位置插入一个字符串并返回 this。
StringBuilder insert(int offset,Char c) 在 offset 位置插入一个字符串并返回 this。
StringBuilder delete(int startIndex,int endIndex) 删除偏移量从 startindex 到 -endlndex-1 的代码单元并返回 this。
String toString() 返回一个与构建器或缓冲器内容相同的字符串
2.输入输出
读取输入
在Java中读取标准输出流只需调用System.out.println即可。
读取标准输入流时,首先需要构建一个Scanner对象:Scanner in = new Scanner(System.in);
再使用Scanner类的各种方法实现输入操作String name = in.nextLine();
其中nextLine()可以输入空格
如果想读取一个单词(以空白符作为分隔符)则需要调用in.next()
如果想调用一个整数,就嗲用in.nextInt()
如果想调用一个浮点数,就调用in.nextDouble()
最后在程序的最开始添加
import java.util.*;
如果需要从控制台读取密码,则需要使用
Console cons = Systrm.console();
String username = cons.readLine("User name:")
char[] passwd = cons.readPassWord("Password:");
文件输入输出
要想对文件进行读取,就需要一个用File对象构造一个 Scanner对象,如下所示:
Scanner in = new Scanner(Paths.get("myfile.txt"), "UTF-8");文件路径中包含\则需要再加一个额外的反斜杠\
要想写入文件, 就需要构造一个 PrintWriter 对象。在构造器中,只需要提供文件名:
PrintWriter out = new Printlulriter("myfile.txt", "UTF-8");
如果文件不存在,创建该文件。 可以像输出到 System.out—样使用 print、 println 以及 printf命令。
在开发工程中,一般会针对excel做写入和输出,这时可以使用apache POI解决
3.控制流程
控制流程是指使用条件语句和循环结构确定控制业务流程走向
块作用域(block)
块(即复合语句)是指由一对大括号括起来的若干条简单的Java语句。块确定了变量的作用域。一个块可
以嵌套在另一个块下。在嵌套的两个块中,不能声明同名的变量,否则无法通过编译
条件语句
在Java中,条件语句的格式为
if(condition) statement
在某个条件为真时执行多条语句,可以使用块语句,形式为
{
statement1
statement2
}
在开发过程中,更多的使用格式为
if(condition) statement1 else statement2
其中else部分是可选的。
if可以嵌套多个if例如
if(condition){
if(condition){
statement1
}
else{
statement2
}
}
循环
当条件为true时,while循环执行一条语句(也可以是一个语句块)。格式一般为
while(condition) statement
如果开始循环条件的值就是false,则while循环体一次也不执行
while循环语句搜仙检测循环条件。所以,循环体中的代码可能不被执行。如果希望循环体至少执行一
次,则应该将检测条件放在最后。使用do-while循环语句,可以实现这种操作方式,语法格式为
do statement while(condition);
这种循环先执行语句,再检测循环条件;然后重复语句,再检测循环条件。
确定循环
for循环语句是支持迭代的一种通用结构,利用每次迭代之后更新的计数器或类似的变量来控制迭代次
数。
示例
for(int i = 1; i <= 10; i++){
System.out.println(i);
}
for语句的第一部分通常用于对计数器初始化;第二部分给出每次新一轮循环执行前要检测的循环条件 ;第三部分指示如何更新计数器
如果在 for 语句内部定义一个变量, 这个变量就不能在循环体之外使用。因此,如果希望在for循环体 之外使用循环计数器的最终值,就要确保这个变量在循环语句的前面且在外部声明!在各自独立的不同
for循环中就可以定义同名的变量。for循环是while循环的一种简化变体
多重选择:switch语句
在开发过程中,可能会有同一变量,但又多个数值,每个数值代表含义不同,这时候可以使用switch来
处理多个选项,语句为:
switch(a)
{
case 1:
...
break;
case 2:
...
break;
default:
...
break;
}
switch语句将从与选项值匹配的case标签处开始执行,直到遇到break语句,或执行到switch语句的结
束处为止。如果没有相匹配的case标签,而有default子句,就执行这个子句
case标签可以是
类型为char、byte、short或int的常量表达式
枚举类型
也可以是字符串字面量
中断控制流程语句
在Java中,为了在特定地方跳出循环可以使用break语句
示例
while(years <= 100){
balance += payment;
double interest = balance * interestRate / 100;
balance += interrest;
if(balance >= goal)break;
years++;
}
在Java中还可以使用一种带标签的break语句,用于跳出多重嵌套的循环语句。
Scanner in = new Scanner(System.in);
int n;
read_data:
while (. . .)
{
for (. . .)
{
Systen.out.print("Enter a number >= 0: ");
n = in.nextlntO;
if (n < 0) {
break read_data;
}
}
标签必须放在希望跳出的最外层循环之前, 并且必须紧跟一个冒号。
标签可以应用到任何语句中,甚至可以应用到if语句或者块语句中
continue语句,和break语句一样,它将中断正常的控制流程。continue语句将控制转移到最内层循环的首部。
例如:
for (count = 1; count <= 100; count++)
{
System.out.print("Enter a number, -1 to quit: ");
n = in.nextInt();
if (n < 0) continue;
sum += n;
}
continue一般用于跳个某个特定条件的值或某个特定更新语句,进入下次循环
4.大数值
如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个类:BigInteger和 BigDecimal。这两个类可以处理包含任意长度数字序列的数值。
BigInteger类实现了任意精度的整数运算,Bigdecimal实现了任意精度的浮点数运算使用静态的valueOf方法可以将普通的数值转换为大数值:
BigInteger a = BigInteger.valueOf(100);
但是不能使用算术运算符处理大数据。而需要使用大数值类中的add和multiply方法
例如
BigInteger c = a.add(b);
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2)));
常用方法
5.数组
数组是一种数据结构,用来存储同一类型值得集合。通过一个整形下标可以访问数组中的每一个值。例如,如果a是一个整形数组,a[i]就是数组中下标为i的整数。
在声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字。例如
int[] a;
以上示例只是声明了变量a,并没有将a初始化为一个真正的数组。应使用关键字new创建数组
int[] a = new int[100];
其中100表示数组长度。表示可以存储100个整数的数组。数组长度不是常量:new int[n]会创建一个长度为n的数组。
声明数组的方式有两种,分别为int[] a;和int a[];
一般开发过程中使用第一种
创建数组后,可以给数组元素进行赋值。例如a[1] = 1。
for(int i = 0; i<10; i++){
a[i] = i;
}
创建数字数组时,所有元素都初始化为0。boolean数组的元素会初始化为false。对象数组的元素则初 始化为一个特殊值null,表示元素未存放任何对象。
如果希望这个数组包含空串可以为元素指定空串
for(int i = 0; i < 10; i++)names[i] = "";
访问创建数组长度之外的元素,会引起数组越界的问题,并导致程序终止
创建数组后不能改变它的大小,如果经常需要在运行过程中扩展数组的大小,则需要使用,另外一种数
据结构---数组列表(array list)、
for each循环
for each循环是一种功能很强的循环结构,用来依次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标分心
例如:
for(variale : collection) statement
定义一个变量用于暂存集合中的每一个元素,并执行相应的语句(当然,也可以是语句块)。
collection 这一集合表达式必须是一个数组或者是一个实现了 Iterable 接口的类对象(例如ArrayList)。
foreach 循环语句的循环变量将会遍历数组中的每个元素, 而不需要使用下标值。
打印数组中的所有值可以使用Arrays类的toString方法。例如
System.out.println(Arrays.toString(a))
数组初始化以及匿名数组
在Java中提供了一种创建数组对象并同时赋予初始值的简化书写方式。
int[] a = {1,2,3,4}
在使用这种语句时,不需要调用new
还可以初始化一个匿名数组
new int[] {1,2,3,4,5}
这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数。
使用这种语法形式可以在不创建新变量的情况下重新初始化一个数组。例如
a = new int[] {1,2,3}
如果需要创建一个长度为0的数组,可以用以下方法
new elementType[0]
数组拷贝
在Java中,允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一数组
如果希望将一个数组的所有值拷贝到一个新的数组中去,
就要使用 Arrays 类的 copyOf方法:
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers , luckyNumbers .length);
第 2 个参数是新数组的长度。这个方法通常用来增加数组的大小:
luckyNumbers = Arrays.copyOf(luckyNumbers , 2 * luckyNumbers.length);
如果数组元素是数值型,那么多余的元素将被赋值为 0 ; 如果数组元素是布尔型,则将赋值为 false。相反,如果长度小于原始数组的长度,则只拷贝最前面的数据元素。
数组排序
要想对数值型数组进行排序, 可以使用 Arrays 类中的 sort 方法;
int[] a = new int[10000];
...
Arrays.sort(a)
Arrays类中的sort方法只能升序排列,如果需要降序排列可以使用下面方法
Arrays.sort(a,Collections.reverseOrder());
//实现Comparator接口
class MyComparator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
/*如果o1小于o2,我们就返回正值,如果o1大于o2我们就返回负值,
这样颠倒一下,就可以实现降序排序了,反之即可自定义升序排序了*/
return o2-o1;
}
在开发中也可能会使用以下三种排序方式
冒泡排序、直接选择排序、反转排序
冒泡排序代码
int[] arr = {23,12,48,56,45};
int temp = -1;
for(int i=0;i<arr.length;i++) {
for(int j=i+1;j<arr.length;j++) {
if(arr[i]>arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
直接选择排序
int[] arr = {23,12,48,56,45};
for(int i=0;i<arr.length;i++) {
int tem = i;
for(int j=i;j<arr.length;j++) {
if(arr[j] < arr[tem]) {
tem = j;
}
}
int temp1 = arr[i];
arr[i] = arr[tem];
arr[tem] = temp1;
}
System.out.println(Arrays.toString(arr));
反转排序
int[] arr = {23,12,48,56,45};
for(int i=0;i<arr.length / 2;i++) {
int temp = arr[i];
arr[i] = arr[arr.length-i-1];
arr[arr.length-i-1] = temp;
}
System.out.println(Arrays.toString(arr))
多维数组
不规则数组
(暂未完全明白)