基本类型包装类Integer
将基本数据类型包装成对象好处在于可以在对象中定义更多的功能方法操作数据
常用操作:用于基本数据类型与字符串之间的转换
特殊的:int--Integer char--Character
Integer类的概述和使用
Integer:该对象中包装类一个基本类型int的值
构造方法new对象已过时,推荐静态方法valueof 通过类名.valueof(数值)来调用
自动装箱和拆箱
自动装箱:基本类型转为对应的包装类
自动拆箱:包装类转为对应的基本类型
例如:Integer i1 = 100;//自动装箱,对应的底层方法intvalue
//引用数据类型Integer i1 = 基本数据类型 int 型数值100,通过底层valueof方法自动进行转换
int i = i1;//自动拆箱
空指针异常:引用类型可以赋值为空,但是null不能调方法,在自动转型时会报错
解决方法:加一个判断语句
例如:Integer i1 = null:
i1+=200;
sout(i1);//会报错,空指针异常
Integer的成员方法
public static
-
int和String的相互转换
方式一:加双引号即可
方式二:public static String valueof(int):返回int参数的字符串表示形式,该方法是String类中的方法
-
String转为int
方式:public static Integer parseInt()方法
-
package com.itheima; public class IntegerDemo { //自动装箱和拆箱 public static void main(String[] args) { int i =100; //int转为String //方式一:直接加双引号 String s1 = i+""; System.out.println(s1+100); //方式二:调用public static String valueof()方法 //格式: int i1 =100; String s2 = String.valueOf(i1); //String转为int型 //调用public static Integer parseInt()方法 int i2= Integer.parseInt("100"); } }
案例练习:将一个字符串中的数据,存入一个int类型数组中,并打印
package com.itheima;
import java.util.Arrays;
public class ShuzuDemo {
public static void main(String[] args) {
String s="91 27 46 38 50";
//根据空格切割,获取字符串数组Srr
String[]srr= s.split(" ");
//创建一个int类型的数组
int[] arr = new int[srr.length];
//遍历数组,并将srr中的数据进行类型转换并存入int数组中
for (int i = 0; i < srr.length; i++) {
//将对应索引的字符数组的元素转为int类型并存入数组arr中
arr[i]= Integer.parseInt(srr[i]);
}
//方式一:遍历int数组,输出元素
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
//方式二:直接以数组形式,输出数组元素
System.out.println(Arrays.toString(arr));
}
}
数组的二分查找步骤
-
定义两个变量,表示要查找的范围.默认min= 0,max= 最大索引
-
循环查找,但是min<= max
-
计算出mid的值
-
判断mid位置的元素是否为要查找的元素,如果是直接返回对应索引
-
如果要查找的值在mid左边,则min值不变,max = mid-1,继续下次循环查找
-
如果要查找的值在mid右边,则max值不变,min = mid-1,继续下次循环查找
-
当min>max时,表示要查找的元素在数组中不存在,返回-1(因为数组索引从0开始,所以一般返回负数)
案例演示:
package com.itheima;
//二分查找
public class MyBinarySearchDemo {
public static void main(String[] args) {
//1.定义一个数组
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int number = 3;
int index = binarySearchForIndex(arr, number);
System.out.println(index);
}
private static int binarySearchForIndex(int[] arr, int number) {
//1.定义查找的范围
int min = 0;
int max = arr.length - 1;
//2. 循环查找min<=max,如果不符合条件,说明数据不存在,返回-1
while (min <= max) {
//3.计算出中间位置
int mid = (max + min) >> 1;//最大值加最小值除以二再向右移一位
//判断mid指向的元素是否为目标元素,是的话直接返回索引
//
if (arr[mid] == number) {
return mid;
}//mid指向的元素<number,在左半边,min不变,max为mid-1
else if (mid < number) {
max = mid - 1;
}//mid指向的元素>number,在右半边,max不变,min为mid+1
else if (mid > number) {
min = mid + 1;
}
}
//没找到返回-1,说明元素不存在
return -1;
}
}
冒泡排序
冒泡排序思路: 如果有n个元素比, 总共需要比n-1次 遍历数组, 前后两个元素比较, 大的放左边(数据交换), 防止索引越界, 需要让长度-1 每一次比较完毕, 下一次的比较会少一个数组参与
批量替换: 选中目标值, Alt + Shift + R
package com.itheima;
import java.util.Arrays;
//冒泡排序
public class GuDuDemo {
public static void main(String[] args) {
//定义一个数组
int[]arr = {4,2,5,3,1};
//外层循环比次数,有n个元素,比较n-1次
for (int i = 0; i < arr.length-1; i++) {
//内层循环交换元素,每比较一次确定一个最小值,故-i
for (int j = 0; j < arr.length-1-i; j++) {
//如果前一个数比后一个数大,则交换元素位置,大的放后面
//下一次循环时因为arr.length-1-i,则访问不到该元素
//最后数组元素升序排列
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}//打印数组元素
System.out.println(Arrays.toString(arr));
}
}
递归
概述:以编程角度来看,递归指的是方法定义中调用方法本身
思路:将复杂问题简单化,使用少量的程序就可以描述出解题过程中所需要的多次的重复计算
两个核心:
核心一:递归出口,如果不指定出口,出现内存溢出报错(栈内存中的方法装不下了)
核心二:递归规则,与原问题相似的,但是规模较小的问题
package com.itheima;
public class DiGuiDemo {
public static void main(String[] args) {
int sum = getSum(100);
System.out.println(sum);
}
private static int getSum(int i) {
if(i==1){
return 1;
}else{
/*
* 1-100的和
* 100+(1~99的和)
* 99+(1~98的和)
* 98+(1~97的和)
* 97+(1~96的和)
* ....以此类推
* 1
* */
//100+getSum(100-1)
//100+1~99的和
return i+getSum(i-1);
}
}
}
案例,递归阶乘
需求: 递归求阶乘
阶乘: 一个整数的阶乘, 是所有小于等于该数的正整数的积, 自然数n的阶乘写作n! 5! = 54321
递归求阶乘: 核心1.递归出口: 1! = 1 核心2.递归规则: n! = n(n-1)! 5!=54!
package com.itheima;
public class JieChengDemo {
public static void main(String[] args) {
int result = getJc(5);
System.out.println(result);
}
private static int getJc(int i) {
//递归出口:1!=1
if(i==1){return 1;}
//递归规则:n!=n*(n-1)!
else{return i*(i-1);}
}
}