Java笔记5

子串,顾名思义就是原本字符串其中一部分字符组成的新字符串,那我们可以尝试用substring返回一个新的字符串,其中包含已有字符串从指定索引到末尾的字符

1
2
3
4
5
6
7
8
public class Test {
public static void main(String[] args) {
String text = "woshishuaige";
System.out.println(text.substring(0));
System.out.println(text.substring(2));
System.out.println(text.substring(5));
}
}

运行截图
图片

这里把字符串里的每个字符进行排序编号,就会很容易理解

1
2
3
4
5
6
7
8
9
public class Test {
public static void main(String[] args) {
String text = "woshishuaige";
System.out.println(text.substring(0,2));
System.out.println(text.substring(2,5));
System.out.println(text.substring(5,10));
System.out.println(text.substring(10,12));
}
}

图片

前面数字表示起始字符,后面表示结束字符

方法indexof用于在字符串中查找字符

1
2
3
4
5
6
7
8
9
public class Test {

public static void main(String[] args) {
String name = "zhang";
int index = name.indexOf('a');
System.out.println(index);
}

}

这个例子确定了字符’a’在字符串的索引,会返回字符第一次出现的索引,如果需要返回后面多次出现位置的索引,就要其他参数

1
2
3
4
5
6
7
8
9
public class Test {

public static void main(String[] args) {
String name = "zhangzhangzhang";
int index = name.indexOf('a',3);
System.out.println(index);
}

}

int index = name.indexOf(‘a’,3);从索引3(每个字符编号从0开始)开始查找下一个字符‘a’;
如果字符串中没有指定的字符,indexOf将返回-1;另外indexOf也可以用于查找子串

1
2
3
4
5
6
7
8
9
public class Test {

public static void main(String[] args) {
String name = "yangwenhao";
int index = name.indexOf("wen");
System.out.println(index);
}

}

我们要查找wen这一子串,最后会返回’w’索引4
字符串比较

由于一开始我们接触的语言是C语言,所以我们会本能反应用==或者!=来比较字符串,但是这是错误的

1
2
3
4
5
6
7
8
9
10
11
public class Test {

public static void main(String[] args) {
String name1 = "zbc";
String name2 = "zbc";
if(name1 == name2) {
System.out.println("相等");
}
}

}

以上是我们按照C语言思路来进行编写的,但是是错误的
对于Java应该采取equals来进行比较

1
2
3
4
5
6
7
8
9
10
11
public class Test {

public static void main(String[] args) {
String name1 = "zbc";
String name2 = "zbc";
if(name1.equals(name2)) {
System.out.println("相等");
}
}

}

如果字符串是不同的,可以用compare来确定根据字母表顺序排列哪个字符串在前面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test {

public static void main(String[] args) {
String name1 = "zbc1";
String name2 = "zbc2";
int diff = name1.compareTo(name2);
System.out.println(diff);
if(diff==0) {
System.out.println("Same!!!");
}else if(diff<0) {
System.out.println("name1 comes before name2");
}else if(diff>0) {
System.out.println("name2 comes before name1");
}
}

}

方法compareTo会返回两个字符串中第一个不同的字符的差。如果两个字符串相等,则差为0;
Add:前面的代码diff值为-1,因为它们第四位分别是1与2,对应的编码值相差1

字符串格式

1、字符串格式设置

涉及到方法String.format,它与String.printf相同:一个格式说明符和一系列的值,主要差别在于后者将结果显示到屏幕上,前者则创建一个新的字符串但什么都不显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Test {

public static void main(String[] args) {
System.out.println(timeString(13, 50));
}
public static String timeString(int hour,int minute) {
String ampm;
if(hour<12) {
ampm = "AM";
if(hour==0) {
hour = 12; //午夜
}
}else {
ampm = "PM";
hour -= 12;
}
return String.format("%02d:%02d %s", hour, minute, ampm);
}
}

print、printf以及println区别
首先print与printf没什么太大的区别,也就是一个会换行,一个不会换行,而printf主要是继承了C语言的一些特性,它常用于格式转换

Math.random:

首先Math.random()是随机生成一个大于等于 0.0 且小于 1.0 (前开后闭)的伪随机 double 值,为方便叙述将其表示为:Math.random:[0.0,1.0)

下面以整数(int)为例子:

通常,如果我们需要获取从[x,y)范围内的伪随机数,有下面这样的公式:

1
Math.random()*(y-x)+x

如果我们需要闭区间的呢,也就是需要获取从[x,y]范围内的伪随机整数,其实也很简单,只需要

1
(int)Math.random()*(y-x+1)+x

为了方便理解,我们取x=10,y=35;为例子
首先

Math.random:[0.0,1.0)

Math.random()(35-10):[0.0,25.0)

Math.random()(35-10+1):[0.0,26.0)

所以

Math.random()(35-10+1)+10:[10.0,36.0)

由于强转为int会丢失精度,也就是舍去小数部分,因此得到

(int)Math.random()(35-10+1)+10:[10,35](值为整数)

 若需要[x,y)范围的伪随机数

1
Math.random()*(y-x)+x

若需要[x,y]范围的伪随机整数

1
(int)Math.random()*(y-x+1)+x

数组反转:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test{

public static void main(String[] args) {
int[] arr = new int[] {1,2,3,4,5};
//数组的反转
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;
}
//数组的遍历
for(int x:arr) {
System.out.print(x+" ");
}
}
}

第二种,不过要建立两个数组,方便理解一点

1
2
3
4
5
for(int i =0,j=arr.length-1;i<j;i++,j--){
int temp = arr[i];
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = temp;
}

数组查找(顺序查找)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test {

public static void main(String[] args) {
String[] arr = new String[] {"aa","bb","cc","dd"};
String dest = "bb";
boolean isFlag = true;
for(int i=0;i<arr.length;i++) {
if(dest.equals(arr[i])) {
System.out.println("找到了,位置在:"+i);
isFlag = false;
break;
}
}
if(isFlag) {
System.out.println("抱歉,没有找到");
}
}
}

数组异常

数组的越界

1
2
3
4
int[] arr = new int[4];
for(int i=0;i<arr.length;i++){
statement.......
}

这个例子是正确的,但如果把里面的条件改为i<=arr.length,便会导致越界;
当然越界也可能是左边界越界