第三章 Java的基本程序设计结构 | 学习笔记(二)
3.6 字符串
Java字符串就是Unicode字符序列。
例如:
String e = "";
String greeting = "Hello";
- 子串
String类的substring方法可以从一个较大的字符串提取一个子串。
例如:
String greeting = "Hello";
String s = greeting.substring(0,3);//Hel
substring的工作方式有点:容易计算子串的长度。字符串s.substring(a,b)的长度为b-a。
- 拼接
Java语言允许使用+号连接两个字符串。
例如:
System.out.println("The answer is " + answer);
如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态join方法。
例如:
String all = String.join(" / ", "S", "M", "L", "XL");
// all is the string "S / H / L / XL"
- 不可变字符串
String类没有提供用于修改字符串的方法。可以通过拼接方法进行修改。
原因:String类底层是final修饰的。
- 检测字符串是否相等
可以使用equals方法检测两个字符串是否相等。
例如:
s.equals(t);//相等返回true,否则false
Hello".equals(greeting);
Hello".equalsIgnoreCase("hel1o");//不区分大小写的比较
一定不要使用==运算符检测两个字符串是否相等!此运算符只能确定两个字符串是否放置在同一个位置。
- 空串与Null串
空串""是长度为0的字符串。即长度为0、内容为空。Null串则是没有任何对象与该变量关联。
-
码点与代码单元
-
String API
• char charAt (int index)
返回给定位置的代码单元。除非对底层的代码单元感兴趣, 否则不需要调用这个方法。
• int codePointAt(int Index) 5.0
返回从给定位置开始的码点。
• int offsetByCodePoints(int startlndex, int cpCount) 5.0
返回从 startlndex 代码点开始,位移 cpCount 后的码点索引。
• int compareTo(String other)
按照字典顺序,如果字符串位于 other 之前, 返回一个负数;如果字符串位于 other 之后,返回一个正数;如果两个字符串相等,返回 0。
• IntStream codePoints() 8
将这个字符串的码点作为一个流返回。调用 toArray 将它们放在一个数组中。
• new String(int[] codePoints, int offset, int count) 5.0
用数组中从 offset 开始的 count 个码点构造一个字符串。
• boolean equals(0bject other)
如果字符串与 other 相等, 返回 true。
•boolean equalsIgnoreCase(String other )
如果字符串与 other 相等 ( 忽略大小写,) 返回 tme。
•boolean startsWith(String prefix )
•boolean endsWith(String suffix )
如果字符串以 suffix 开头或结尾, 则返回 true。
•int indexOf(String str)
•int indexOf(String str, int fromlndex )
•int indexOf(int cp)
•int indexOf(int cp, int fromlndex )
返回与字符串 str 或代码点 cp 匹配的第一个子串的开始位置。这个位置从索引 0 或fromlndex 开始计算。 如果在原始串中不存在 str, 返回 -1。
•int lastIndexOf(String str)
•Int lastIndexOf(String str, int fromlndex )
•int lastindexOf(int cp)
•int lastindexOf(int cp, int fromlndex )
返回与字符串 str 或代码点 cp 匹配的最后一个子串的开始位置。 这个位置从原始串尾端或 fromlndex 开始计算。
•int length( )
返回字符串的长度。
•int codePointCount(int startlndex , int endlndex ) 5.0
返回 startlndex 和 endludex-l之间的代码点数量。没有配成对的代用字符将计入代码点。參
• String replace( CharSequence oldString,CharSequence newString)
返回一个新字符串。这个字符串用 newString 代替原始字符串中所有的 oldString。可以用 String 或 StringBuilder 对象作为 CharSequence 参数。
• String substring(int beginlndex )
• String substring(int beginlndex, int endlndex )
返回一个新字符串。这个字符串包含原始字符串中从 beginlndex 到串尾或 endlndex-l的所有代码单元。
• String toLowerCase( )
• String toUpperCase( )
返回一个新字符串。 这个字符串将原始字符串中的大写字母改为小写,或者将原始字符串中的所有小写字母改成了大写字母。
• String trim( )
返回一个新字符串。这个字符串将删除了原始字符串头部和尾部的空格。
• String join(CharSequence delimiter,CharSequence ... elements ) 8
返回一个新字符串, 用给定的定界符连接所有元素。
- 构建字符串
StringBuilder类,允许采用多线程的方式执行添加或删除字符的操作。
3.7 输入输出
- 读取输入
首先需要构建一个Scanner对象,并与“标准输入流”System.in关联。
Scanner in = new Scanner(System.in);
现在,可以使用Scanner类的各种方法实现输入操作。
例如:
nextLine方法将输入一行
System.out.print("What is your name? ");
String name = in.nextLine();
读取一个单词
String firstName = in.next();
• Scanner (InputStream in)
用给定的输人流创建一个 Scanner 对象。
• String nextLine( )
读取输入的下一行内容。
• String next( )
读取输入的下一个单词(以空格作为分隔符。)
• int nextlnt( )
• double nextDouble( )
读取并转换下一个表示整数或浮点数的字符序列。
• boolean hasNext( )
检测输人中是否还有其他单词。
• boolean hasNextInt( )
• boolean hasNextDouble( )
检测是否还有表示整数或浮点数的下一个字符序列。
- 格式化输出
例如:
System.out.printf("Hello,%s. Next year, you'll be %d", name, age);
例如:
Systen.out.printf("%.2f", 10000.0 / 3.0);//3,333.33
例如:
System.out.printf("%tc", new Date());//Mon Feb 09 18:05:19 PST 2015
- 文件输入与输出
想要对文件进行读取,就需要用File对象构建一个Scanner对象。
例如:
Scanner in = new Scanner(Paths.get("myflle.txt"), "UTF-8");
3.8 控制流程
Java使用条件语句和循环结构确定控制流程。
- 块作用域
块(即符合语句)是指由一对大括号起来的若干条简单的Java语句。块确定了变量的作用域。
例如:
public static void main(String[] args)
{
int n;
...
{
int k;
...
} // k is only defined up to here
}
- 条件语句
条件语句格式:
if (condition) statement
例如:
if (yourSales >= target)
{
performance = "Satisfactory";
bonus = 100;
}
例如:
if (yourSales >= target)
{
performance = "Satisfactory";
bonus = 100 + 0.01 * (yourSales - target);
}
else
{
performance = "Unsatisfactory";
bonus = 0;
}
例如:
if (youSales >= 2 * target)
{
performance = "Excellent";
bonus = 1000;
}
else if (yourSales >= 1.5 * target)
{
performance = "Fine";
bonus = 500;
}
else if (yourSales >= target)
{
performance = "Satisfactory";
bonus = 100;
}
else
{
System.out.println("You're fired");
}
- 循环
当条件为true时,while循环执行一条语句。
格式为:while { condition } statement
例如:
while (balance < goal)
{
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
years++;
}
System.out.println(years + " years.");
循环体至少执行一次。
格式为:do statement while ( condition);
例如:
do
{
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
year++;
// print current balance
...
//if ready to retire and get input
...
}
while (input.equals ("N"));
- 确定循环
for循环语句是支持迭代的一种通用结构,利用每次迭代之后更新的计数器或类似的变量来控制迭代次数。
例如:
for (int i = 1; i <= 10; i++)
System.out.println(i);
- 多重选择:switch语句
例如:
System.out.print("Select an option (1, 2,3, 4)");
int choice = in.nextlnt();
switch (choice)
{
case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
default:
// bad input
...
break;
}
switch语句将从与选项值相匹配的case标签处开始执行直到遇到break语句,或者执行到switch语句的结束处为止。
case 标签可以是:
- 类型为 char、byte、 short 或 int 的常量表达式。
- 枚举常量。
- 从 Java SE 7开始, case 标签还可以是字符串字面量。
例如:
Size sz = . . .;
switch (sz)
{
case SMALL: // no need to use Size.SMALL
...
break;
}
- 中断控制流程语句
终止流程语句
例如:
label:
{
...
if (condition) break label;// exits block
...
}
...
// jumps here when the break statement executes
而continue语句则是跳出本次循环,继续下一次循环。
3.9 大数值
如果基本的整数和浮点数精度不能满足要求,那么可以使用java.math包中的两个类:BigInteger和BigDecimal。
BigInteger类实现了任意精度的整数运算,BigDecimal类实现了任意精度的浮点数运算。
使用静态的valueOf方法可以将普通的数值转换为大数值:
例如:
Biglnteger a = Biglnteger.valueOf(100);
不过,不能使用算术运算符处理大数值,而需要使用大数值的方法。
例如:
Biglnteger c = a.add(b);//c =a+ b
Biglnteger d = c.nultipiy(b.add(Biglnteger.valueOf(2)));// d = c * (b + 2)
3.10 数组
数组是一种数据结构,用来存储同一类型值的集合。
例如:
int[] a; 或者 int a[];
int[] a = new int[100];//可以存储100个整数的数组
for (int i = 0;i < a.length; i ++)
System.out.println(a[i]);
- for each 循环
增强for循环格式:
for (variable : collection) statement
例如:
for (int element : a)
System.out.println(element);
等价于
for (int i = 0; i < a.length; i++)
System,out.println(a[i]);
- 数组初始化以及匿名数组
Java中提供了一种创建数组对象并同时赋予初始值的简化书写形式。
例如:
int[] smallPrimes = { 2, 3, 5, 7, 11, 13 };
在Java中,允许数组长度为0。
new elementType[0];//数组长度为0与null不同
- 数组拷贝
在Java中,允许将一个数组变量拷贝给另一个数组变量。
例如:
intQ luckyNumbers = smallPrimes;
1uckyNumbers[S] = 12; // now smallPrimes[5] is also 12
如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf方法:
例如:
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers , luckyNumbers.length);
- 命令行参数
每一个Java应用程序都有一个带String arg[]参数的main方法。这个参数表明main方法将接收一个字符串数组,也就是命令行参数。
例如:
public class Message
{
public static void main(String[] args)
{
if (args.length ==0 || args[0].equals("-h"))
System.out.print("Hello,");
else if (args[0].equa1s("-gM"))
System.out.print("Goodbye ,");
// print the other command-line arguments
for (int i=1; i < args.length; i ++)
System.out.print(" "+ args[i]);
System•out.println("!");
}
}
如果使用下面这种形式运行这个程序:
java Message -g cruel world
args数组将包含下类内容:
args[0]:"-g"
args[l]:"cruel"
args[2]:"world"
将会出现以下信息:
Goodbye, cruel world!
- 数组排序
想要对数组型数组进行排序,可以使用Arrays类中的sort方法:
例如:
int[] a = new int[10000];
...
Arrays.sort(a)
此方法使用了优化的快速排序算法。
- 多维数组
多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列顺序。
声明方式:double[][] balances;
例如:
int[][] magicSquare =
{
{16, 3, 2, 13},
{5, 10, 11, 8},
(9, 6, 7, 12},
{4, 15, 14, 1}
};
- 不规则数组
Java实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”。
不规则数组即数组的每一行有不同的长度。
例如:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 1 0 1 0 5 1
1 6 1 5 2 0 1 5 6 1
上一篇: 精通CSS 第8章 布局
下一篇: Shell多分支case语句