1、数组常用排序算法:冒泡排序,选择排序
冒泡排序:
相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处(当然也可以根据要求把最小值放最后),第二次比较后,最大值放在了倒数第二的位置,一致到第二个元素确定了,整个数组的顺序也就确定了。
冒泡排序的外层循环是需要确定位置的数的个数,换句话说,也就是有几个数需要确定位置,它的值是数组元素数少1,如果元素为5个的话,则需要确定四个数的位置,第五个数就已经定下来了,整个数组的顺序就被确定了,这里取最大值还是最小值完全看业务逻辑,都能完成。
选择排序:
从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处
外层循环控制的是总共需要确定位置的数的次数,比如有五个数,那么只需要确定四个数的位置即可,从小到大排序。
外层循环第一次,确定的是第一个位置的数:
第一次拿第一个元素和第二个元素比,如果比它小,则交换;
第二次拿第一个元素和第三个元素比,如果比它小,则交换;
...
直到第一个数和最后一个数比完,得出的结果就是第一个位置上的数是所有数中的最小值
外层循环第二次,确定的是第二个位置上的数;
第一次拿第二个位置上的数和第三个位置上的数比,比它小,则交换;
第二次拿第二个位置上的数和第四个位置上的数比,比它小,则交换;
...
直到第二个数和最后一个比完,得出的结果就是第二个位置上的数是剩余数中的最小值
外层循环N-1次,得出的结果就是最小值在前。选择排序有可能造成多次交换的现象。
总结:
两种排序最大的不同是里层循环的开始值和结束值:
冒泡排序:内层循环的开始值都是从0开始,结束值是变化的
选择排序:内层循环的开始值是变化的,结束值是固定的,都是最大索引值。
2、数组二分法查找算法
前提:已经有序的数组(升序或者降序都可以,只不过在判断中要根据逻辑做更改)
查找:基本查找:数组元素无序(从头到尾)
二分查找(折半查找):数组元素有序
分析:
A:定义最大索引,最小索引
B:计算出中中间索引
C:拿中间索引的值和要查找的值进行比较
相等:就返回当前的中间索引
不相等:
大 左边找
小 右边找
D:重新计算出中间索引
大 左边找
max = mid -1
小 右边找
min = mid +1
E:回到B
3、Arrays工具类的常用方法
系统提供的针对数组进行操作的工具类。
静态方法:
public static String toString(int[ ] a):将数组转换成字符串
public static void sort(int[ ] a):对一个int数组进行升序排序ascending
public static int binarySearch(int[ ] a,int key):在数组中进行二分查找
4、基本数据类型的包装概念,Integer包装类的常见方法
基本类型包装类概述:
基本数据类型的包装类,就是把基本数据类型的值再进行一次包装,封装成一个类,其中包含一些静态和非静态方法。
其好处在于可以在类中定义更多的功能方法操作该数据。
常用的操作之一:用于基本类型与字符串之间的转换。
字符串转int
字符串转double
...
byte---------Byte
short--------Short
int------------Integer
long----------Long
float----------Float
double-------Double
char-----------Character
boolean--------Boolean
Integer,Character名称上有些变化,其余类名都是把基本数据类型的类型首字母大写
Integer类概述及其构造方法
Integer类概述
Integer类在对象中包装了一个基本类型int的值
该类提供了多个方法,能在int类型和String类型之间互相转换,还提供了处理int类型时非常有用的其他一些常量和方法
构造方法
public Integer(int value):通过一个int值构造一个Integer对象
publicInteger(String s:通过一个字符串构造一个Integer对象
Integer类成员方法
int类型和String类型的相互转换
public int intValue:返回当前对象包装的基本数据类型的int值
public static int parseInt(String s):将一个字符串转换成int值
public static String toString(int i):将一个int值转换成字符串
public static Integer valueOf(int i):用一个int值构建一个Integer对象
public static Integer valueOf( String s):用一个字符串构建一个Integer对象
后两种相当于调用了Integer类的构造方法,效果上是一样的
5、引用数据类型变量强制转换
引用变量的强制类型转换需要注意的事项:
引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换。
如果试图将一个父类实例变量转换成子类类型,则这个对象必须实际上是子类的实例才行(
即编译时为父类类型,而运行时为子类类型)否则将在运行时引发ClassCastExveption异常。
6、StringBuilde类的常见方法——查API文档
由于String对象是不可变的,所以,如下的语句将产生五个字符串常量:
String s1 = "hello";
s1 = s1 + "world";
s1 = s1 + "java";
除了三个字符串常量外,还将额外产生两个字符串常量"helloworld","helloworldjava"
为了避免产生过多的额外临时变量,可以使用StringBuffer或者是StringBuilder,前者是线程安全的,在使用方法上,两者都相同
StringBuffer 和StringBuilder有两个属性,length和capacity,前者表示的是当前对象中包含的字符序列的长度,可以通过length()和setLength(int len)方法来访问或者设置字符串序列的长度。后者表示的是容量,通常容量都比length要大一些。程序中无需关心capacity的值,会随着字符串长度的变化而变化
7、String类常见用法——查API文档
String类代表的是一串字符,例如,“abc”就是一个String类的实例,String的值是固定的,永恒的,即一个字符串一旦被创建了,包含在这个对象的字符序列就是不可更改的,直到这个对象被销毁。
StringBuffer这个类则代表了一个字符序列可变的字符串,当一个StringBuffer对象被创建后,可以通过其提供的append(),insert(),reverse(),setLength()等方法等方法改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终的字符串,就可以通过调用它的toString()方法将其转换成一个String对象。
String类构造方法:
String(char[] value)
通过一个字符数组创建一个字符串对象
char[] data = {'a','b','c'};
String str = new String(data);
String(char[] value,int offset,int count)
将指定的字符数组从offset开始,长度为count的字符元素连成字符串
String(String original)
根据一个字符串常量来创建一个String对象,也就是说,新创建的String对象是该参数字符串的副本
char ch = "abc".charAt(2); //返回指定索引位置的单个字符
boolean isEqu = "abcd".equals("ABCD");//false
boolean isEqual = "abcd".equalsIgnoreCase("ABCD");//true
String类常用方法:
截取子串:
String s2 = "abcd".substring(2,3);//c? cd?
substring返回的是从开始索引到结束索引-1 的位置之间的字符串,返回的字符串的长度是:endIndex - startIndex,例子中截取的子串的长度就是1
int compareTo(String anotherString)
比较两个字符串的大小,如果两个字符串的字符序列完全相等,则返回0;不相等时,从两个字符串的第0个字符开始比较,返回第一个不相等的字符差(即两个字符的编码的差),当一个较长的字符串的前面的部分恰巧是一个短的字符串,则返回它们的长度差
String s1 = "helloabcd";
String s2 = "hello";
String s3 = "hellod";
System.out.println("s1.compareTo(s2) "+s1.compareTo(s2));//4
System.out.println("s1.compareTo(s3) "+s1.compareTo(s3));//-3
System.out.println((int)'a');//97
System.out.println((int)'d');//100
static String copyValueOf(char[] data)
将字符数组连成字符串,与String(char[] content)构造方法作用相同
boolean endsWith(String suffix)
判断是否以一个字符串结尾
char[] c = {'h','e','h','e'};
String s1 = String.copyValueOf(c);
System.out.println("s1 :"+s1);
boolean b1 = s1.endsWith("ha");
boolean b2 = s1.endsWith("he");
System.out.println(b1);
System.out.println(b2);
int indexOf(int ch)
返回字符ch在字符串第一次出现的位置,查看API发现并没有形参为字符的方法,那传入一个字符是否合法?也合法
int length()
返回当前字符串对象的长度
boolean startsWith(String prefix)
返回当前字符串是否以某个字符串开头
boolean equals(Object obj)
为什么形参是一个Object类型的呢?查看继承关系
查看源码:了解equals()方法的实现原理