子串,顾名思义就是原本字符串其中一部分字符组成的新字符串,那我们可以尝试用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)范围内的伪随机数,有下面这样的公式:
如果我们需要闭区间的呢,也就是需要获取从[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)范围的伪随机数
若需要[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
,便会导致越界; 当然越界也可能是左边界越界