java(三) -------------运算符、字符串、输入输出、大数值和数组
运算符
java中将带引号" "的内容统一进行拼接
例如:System.out.println(5+2) 结果输出7,但是
System.out.println(5+"2") 结果输出52
当出现"by zero" 的报错时,表示出现了除数为零的情况
但浮点数除以0不回报错,但是会出现单词Infinity 表示无穷大
函数
Math可调方法
eg: Math.sqrt(4) 表示4的开平方,返回double 型数据
开根号公式
eg:根号21
系统内将21变成21.0000000000000000
先找到一个最大平方整数靠近但不大于21
21减去该整数的结果后缀两个0继续计算
要求(4*20+x)*x<500 求x的最大值
以此类推求出结果
Math.pow(5,2) 表示5的平方,同样返回double型数据结果
数值类型转换
小类型转换成大类型可直接转换,不会报错
eg:int a=short b
大类型转换成小类型要通过()强制转换
eg: short a=(int) b;
位运算(都是补码运算)
计算机底层都是位运算,两层作用于一层
& 按位与 同1为1,底层作用图如下:
与运算常用于判断一个数据x的二进制从左往右是0还是1?
| 按为或 同0为0
~ 取反 1变0 0变1
^ 异或 同0异1
异或常用于交换两个变量值
字符串
java中严格区分单引号和双引号,单引号表示字符,双引号表示字符串、
当有一个变量为字符串类型时,含该变量的加法一律视为字符串的拼接
方法:
变量名.replace(要替换的内容,替换成的内容) 表示替换
split() 表示分割
indexOf(要判断的新字符串) 用于判断是否为字符串的一个子串
如果是,返回第一次出现的下标,反之,返回 -1
substring(开始位置,结束位置) 截取字符串(左闭右开,开始为0)
如果只输入一个数字,则默认开始位置,并输出该位置及以后的所有字符
不可变字符串:不能在原来存储字符串的地方直接进行修改
所有的字符串底层都是数组,长度不可二次改变
所以不可变字符串长度的改变是重新申请了新的数组
字符串的定义方式
1.String 变量名 ="字符串内容"
2.String 变量名 = new String ("字符串内容")
两种定义方式的不同导致其存储地址不同
第一种字符串存储在字符串常量池中,当字符串内容相同时,多个变量指向同一个地址,共用该字符串
第二种字符串存储在堆中,无论前面是否有相同字符串都要开辟新的空间,因而内容相同的字符串地址不同
字符串是否相等
== 引用类型判断指向是否相同 基本类型判断值是否相同
equals 判断字符串是否相同
首先判断二者指向是否相同,指向相同则一定相同
指向不同则再依次比较字符串内容是否相同
null串和空串的区别
null串没有任何指向
空串会有指向,且指向内容为表示结束的 '\0' 符号
构建字符串
可变字符串:StringBuffer、StringBuilder
据前文可知,String为不可变字符串,每次拼接创建新的String对象
与String相比,StringBuffer和StringBuilder速度远高于String
StringBuffer:多线程安全 适合多线程 慢
StringBuilder:多线程不安全 适合单线程 快
方法:
获取时间戳:currentTimeMillis() 开始时间:1970.1.1
计算消耗时间:结束时间-开始时间
添加: append()
输入输出
输出: System.out.println
输入: System.in
Scanner xx= new Scanner(System.in) 获取可以扫描控制台的对象xx
通过该对象调方法,如:
xx.nextLine扫描控制台上输入的该行信息
.next 扫描下一个单词
注:单独使用nextLine()没有问题
但是前面有其他方法的时候,nextLine会多吃一次回车,即将换行符当作字符串录入信息
空格也会被归为字符串的一种
解决办法:提前in.nextLine()一次,吃掉空格
打印日期
大数值
java中提供BigInteger和BigDecimal分别计算大数值整型和浮点型
但是这两类不是真正的数,所以使用时需要new
不能直接用加减乘除等运算,需要调用方法
加:add()
减:subtract()
乘:multiply()
除:divide()
取余:mod()
……
数组
for-each循环
变量x会依次代表数组中的每一项
for(int x:arr){}
遍历二维数组时,x会依次代表每一个一维数组
for(int[] x:arr){}
而如果想继续遍历一维数组中的变量可以使用嵌套循环
for(int[] x:arr){
for(int z:x){}
}
数组的定义
1、可直接赋值定义
2、通过new声明并指定数组长度
3、声明的同时赋值,可以不指定长度,系统会按照赋值长度默认
数组的初始化:就是对数组的首次赋值
通过数组的初始化也可以声明匿名数组
数组拷贝(复制)
拷贝分为深拷贝和浅拷贝
浅拷贝:指向相同
深拷贝:自己开辟一块新的内存,把对方的值拷贝一份在自己的空间里
eg:
浅拷贝:int[] arr2=arr1;
深拷贝:int[] arr2=new int[arr1.length];
for(int i=0;i<arr1.length;i++){
arr2[i]=arr1[i];
}
深拷贝的另一种方法:arr=Arrays.copyOf(arr1,arr2.length)
当arr2.length>arr1.length时,过量自动赋值为零;反之,取arr1中前arr2.length个值拷贝
命令行参数
即给主函数传参,如下图:
通过cmd执行这段代码
先加入桌面
通过javac对该段代码进行手动编译
再通过java手动运行
再输入想要传的参数,main方法会接收到相应数据
数组排序
除了数据结构的八大排序以外,可以通过Arrays.sort(arr);进行数组自动排序
且默认从小到大
从大到小排序时,如果是基本类型数组,需要Integer类型对应的包装类,如下:
或者使用reverseOrder()实现倒序,即
Arrays.sort(arr2,Collections.reverseOrder())
字符串数组的排序
内存中字符串的排序按照ASCII码进行比较
先比较每个字符串的第一位 a最先z最后,以此类推
如果一个字符串包含多个信息,可指定通过某一信息进行比较,如:
一字符串数组里每个字符串都包含年龄、身高、姓名等,则可指定根据年龄进行排序
若是按年龄从高到低排序,应变为b.age-a.age