排列 二分查找 字符串 方法
- 排列
1 int nums[] = new int[]{72,72,72,72,89,65,58,87,91,53,82,71,93,76,68}; 2 Integer[] integer_nums = new Integer[] {72,72,72,72,89,65,58,87,91,53,82,71,93,76,68}; 3 //sort和parallelSort相比,大型数据的话parallelSort会相对快一些 4 Arrays.sort(nums); 5 System.out.println(Arrays.toString(nums)); 6 //实现降序排列 7 //需要实现Comparator方法 8 Arrays.sort(integer_nums, new Comparator<Integer>(){ 9 public int compare(Integer a , Integer b) { 10 return b - a; 11 } 12 }); 13 System.out.println(Arrays.toString(integer_nums)); 14
- 二分查找
1 //binarySearch返回查找元素的下标 2 //找不到返回的是-1 3 //13 4 int index = Arrays.binarySearch(nums, 91); 5 System.out.println(index); 6 7 //copyOf方法,截取数组中的一部分(前 n 个) 8 //[53, 58, 65, 68, 71] 9 int[] new_nums = Arrays.copyOf(nums, 5); 10 System.out.println(Arrays.toString(new_nums)); 11
- 字符串
JAVA的基本数据类型为什么不包括String?
字符串内部其实就是一个使用final关键字定义的char[]数组,数组长度一旦声明则不可改变,字符串一旦声明则不可改变,改变的引用内存指向。
String属于一个类,不属于一个关键字、准确的说它不是一个数据类型。只是由于它字符串的特殊支持,我们习惯把它叫做字符串类型。
- copyOf
- copyOfRange
- 字符串定义
- 字符串拼接
- 任意类型和字符串拼接的结果都是字符串
- 字符串长度
- indexOf
- lastIndexOf
- charAt
- 异常
- 截取字符串substring
- 返回字符数组toCharArray
- split
- replace
- 字符串比较(有new 就是不相等,因为是新的地址空间)
- 字符串拼接(StringBuffer&&StringBuilder)
- arraycopy
- final 修饰的字符串
- 对字符串的修改都不会改变原串
- 字符数组转字符串
1 //copyOf方法,截取数组中的一部分(前 n 个) 2 //[53, 58, 65, 68, 71] 3 int[] new_nums = Arrays.copyOf(nums, 5); 4 System.out.println(Arrays.toString(new_nums));
1 //copyOfRange方法,返回数组中从a-b的部分 2 //[65, 68, 71, 72, 72] 3 new_nums = Arrays.copyOfRange(nums, 2, 7); 4 System.out.println(Arrays.toString(new_nums)); 5
1 //字符串定义 2 String str = "java so easy"; 3 str = new String("java so easy"); 4 //1.字符串不是基本数据类型 5 //2.String不是关键字 6 //3.String在java.lang包下
1 //字符串拼接 2 String str1 = "Hello"; 3 String str2 = "World"; 4 System.out.println(str1 + str2);//HelloWorld 5
1 //任意类型和字符串拼接的结果都是字符串 2 //+号的优先级一样 3 str = 12 + 23 + "结果";//35结果 4 str = "结果" + 12 + 23;//结果1223 5
1 //字符串长度 2 System.out.println(str.length());//6 3 //注意:是方法,而不是和数组呢些的一样是一个属性 4
1 //indexOf方法查找子串出现位置的下标,如果找不到返回-1 2 str = "1234567894"; 3 System.out.println(str.indexOf("3"));//2 4 System.out.println(str.indexOf("0"));//-1 表示没找到 5 System.out.println(str.indexOf("456"));//3 (找子串) 6
1 //返回最后一次出现的下标 2 index = str.lastIndexOf("4"); 3 System.out.println(index); 4 //9 5
1 //charAt返回下标为n的字符 2 char c = str.charAt(2); 3 System.out.println(c); 4 //3
1 //异常 2 //char c = str.charAt(11); 3 //StringIndexOutOfBoundsException 4 5 //int nu = 12/0; 6 //System.out.println(nu); 7 //ArithmeticException 8
1 //截取字符串 2 str = "123456789"; 3 System.out.println(str.substring(1)); 4 //23456789 5 System.out.println(str.substring(1 , 4)); 6 //234
1 //返回字符数组 2 System.out.println(str.toCharArray()); 3 //123456789
1 //split是切割字符串的,选择的字符会被切掉 2 String[] arr = str.split("6"); 3 System.out.println(Arrays.toString(arr)); 4 //[12345, 789]
1 String str3 = "11111111"; 2 String[] arr3 = str3.split("1"); 3 System.out.println(Arrays.toString(arr3)); 4 //[]
1 //replace把一部分替换成另一个 2 System.out.println(str.replace("123", "0")); 3 //0456789
1 //字符串比较 2 //结论: 有new 就是不相等,因为是新的地址空间 3 4 String str1 = "1234"; 5 String str2 = "1234"; 6 7 String str3 = new String("1234"); 8 String str4 = new String("1234"); 9 10 String str5 = "12" + "34"; 11 String str6 = "1" + "234"; 12 13 String str7 = "12" + new String("34"); 14 String str8 = "1" + new String("234"); 15 16 System.out.println(str1 == str2);//true 17 18 System.out.println(str1 == str3);//false 19 System.out.println(str3 == str4);//false 20 21 System.out.println(str1 == str6);//true 22 System.out.println(str5 == str6);//true 23 24 /**************************************/ 25 System.out.println(str1 == str7);//false 26 System.out.println(str1 == str8);//false 27 System.out.println(str7 == str8);//false 28 29 //比较字符串的值是否一样 30 //equals 31 boolean bool = str1.equals(str3); 32 System.out.println(bool); 33 //true
final修饰的字符串
1 String hw = "hello world"; 2 3 String hello = "hello"; 4 final String finalWorld2 = "hello"; 5 final String finalWorld3 = hello; 6 final String finalWorld4 = "he" + "llo"; 7 8 String hw1 = hello + " world"; 9 String hw2 = finalWorld2 + " world"; 10 String hw3 = finalWorld3 + " world"; 11 String hw4 = finalWorld4 + " world"; 12 13 System.out.println(hw == hw1);//false 14 System.out.println(hw == hw2);//true 15 System.out.println(hw == hw3);//false 16 System.out.println(hw == hw4);//true
为什么是这个结果呢?有关参考:https://blog.csdn.net/linbilin_/article/details/51840089
http://www.mamicode.com/info-detail-2370655.html
1 //字符数组转字符串 2 String s = "abcdefg"; 3 char[] cs = s.toCharArray(); 4 return new String(cs);
equal源码:
1 /** 2 * 这种方法会产生很多的中间变量,例如拼接这个数组 3 * 会产生1234,123456等等中间变量 4 * 当数组中元素有几万个的时候,则会产生好多好多好多中间变量捏 5 * 故因此有了StringBuffer,StringBuilder 6 * */ 7 String[] str_arr = {"12","34","56","78"}; 8 String str = ""; 9 for(int i = 0 ; i < str_arr[i].length() ; i++) { 10 str += str_arr[i]; 11 }
1 //StringBuffer(线程安全 慢)&&StringBuilder 2 //采用append方法追加 3 /** 4 * StringBuffer就是我们用一个Buffer把所有的要追加的字符串存入一个数组中 5 * 当这个数组空间不够的时候就进行扩容 6 * 扩容刚开始Buffer默认长度是16 7 * 扩容就是当发现我们空间不够的时候 8 * 刚开始这个Sb,Sf不太大的时候,乘2就可以很大的扩容 9 * 扩容的源码是int newCapacity = (value.length << 1) + 2; 10 * 如果传入的值是0,左移操作结果还是0,出于安全性考虑给他最后+2 11 * 如果这个还不够的话,那么你需要多大我就给你多大 12 * 最后把这个数组调用toString方法转化成字符串 13 */ 14 str_arr = new String[]{"12","34","56","78"}; 15 StringBuffer stringBuffer = new StringBuffer(); 16 for(int i = 0 ; i < str_arr.length ; i++) { 17 stringBuffer.append(str_arr[i]); 18 } 19 System.out.println(stringBuffer.toString()); 20
- 引用类型的默认值
//所有引用类型的默认值都是null
//char 是\u0000 是一个UniCode码,是一个不可显字符,还是空
//null也是一个值,是一个空间,这个空间里什么都没有
1 //arraycopy(原数组,原数组起始位置,目标数组,目标数组起始位置,复制多大) 2 //数组扩容 3 //不是真正的扩容,是将原数组的内容放到更大的数组中 4 int[] arr= {1,2,3,4,5,6,7,8,9}; 5 int[] new_arr = new int[20]; 6 System.arraycopy(arr, 0, new_arr, 3, arr.length); 7 System.out.println(Arrays.toString(new_arr));
- 方法
1 //方法 2 //声明一个方法,接收一个整数 3 //返回一个长度为该整数的整数类型数组 4 int[] nums = shuzu(Math.random()*20); 5 System.out.println(Arrays.toString(nums));
1 public static int[] shuzu(double number) { 2 3 if(number < 0) 4 return null; 5 int[] nums = new int[(int)number]; 6 return nums; 7 }
作业:
1 //声明一个方法,接受一个数组(整数),返回这个数组中的最大值 2 //声明一个方法,接收两个字符串,返回小串是否是大串的子串 3 //声明一个方法,接受一个字符串,返回这个字符串的所有子串 4 //判断一个正整数是不是回文数 5 public static void main(String[] args) { 6 int[] arr= {1,2,3,4,5,6,7,8,9}; 7 System.out.println(MaxNum(arr)); 8 9 String str1 = "123456789"; 10 String str2 = "234"; 11 System.out.println(StringCompare(str1, str2)); 12 13 System.out.println(Arrays.toString(isSubString(str1))); 14 15 int[] nums = new int[]{1,2,3,3,2,1}; 16 System.out.println(HuiWen(nums)); 17 18 } 19 20 public static int MaxNum(int[] nums) { 21 int max = nums[0]; 22 for(int i = 0 ; i < nums.length ; i++) { 23 max = max > nums[i] ? max : nums[i]; 24 } 25 return max; 26 } 27 28 public static boolean StringCompare(String str1 , String str2) { 29 if(str1.indexOf(str2) == -1) 30 return false; 31 else 32 return true; 33 } 34 35 public static String[] isSubString(String str) { 36 String[] value = str.split(""); 37 String[] strings = new String[(value.length + value.length * value.length) / 2]; 38 int count = 0; 39 for(int i = 1 ; i <= value.length ; i++) {//截取长度为i的子串 40 for(int j = 0 ; j <= value.length - i; j++) {//长度为i的子串共有j = n - i个 41 String tempString = ""; 42 for(int k = j ; k < i + j ; k++) {//找到长度为k的子串 43 tempString += value[k]; 44 } 45 strings[count++] = tempString; 46 } 47 } 48 return strings; 49 } 50 51 public static boolean HuiWen(int[] nums) { 52 if(nums.length == 0) return false; 53 else if(nums.length == 1) return true; 54 else { 55 int half_length = nums.length / 2; 56 for(int i = 0 , j = nums.length - 1 ; i < half_length ; i++ , j--) { 57 if(nums[i] != nums[j]) { 58 return false; 59 } 60 } 61 } 62 return true; 63 } 64 }