一、数值型数据之间的转换
1.自动类型转换
不同类型的数据进行运算时,需先转换为同一类型,然后进行运算。
转换前的数据类型与转换后的类型兼容,且转换后的数据类型的表示范围比转换前的类型大。
范围由“小”到“大”的优先关系为:byte->short/char->int->long->float->double
2.强制类型转换
如果要将较长的数据转换成较短的数据时(不安全),就要进行强制类型转换。
格式:(欲转换的数据类型)变量名
3.数值型和字符串型数据之间的转换(字符串属于引用数据类型)
字符串转换成数值型数据: String MyNumber = "1234.56";
(1)字符串转整形
(2)字符串转单精度浮点 float MyFloat = Float.parseFloat( MyNumber );
(3)字符串转双精度浮点 double MyFloat = Double.parseDouble( MyNumber );
数值型数据转换为字符串:
在Java中,字符串可用“+”来实现 连接操作,若其中某个操作数不是字符串,该操作在连接之前会
自动将其转换成字符串,所以可以用加号来实现自动的转换。(效率很低,不推荐)
<1> int MyInt =1234;
String MyString = ""+MyInt;(“”中无空格)
<2>String MyString = Integer.toString(MyInt);(效率更高)
4. 由键盘输入的数据,不管是文字还是数字,Java解释为字符串。
5.使用Scanner类(java.util类库)输入对象
一个 import java.util.*;
...
Scanner reader = new Scanner(System.in);
double num;
num = reader.nextDouble();
...
多个
Scanner reader = new Scanner(System.in);
num1 = reader.nextInt();
num2 = reader.nextDouble();
...
6.next***()方法被调用后,则等待用户在命令行输入数据并按回车键(或空格键、Tab键)确认。
next()和nextLine()方法表示等待用户在键盘上输入一行文本,然后返回一个String类型的数据。
next()期待用户输入字符串,为空时等待。nextLine()输入为空时结束。
二、运算符和表达式
1.
2.两个整数相“/”,结果为整数(强制向下取整)
3.不能在浮点数之间作“==”比较(会有精度损失),判断浮点数:差的绝对值在要求精度内即视为相等。
4.对象之间的“==”操作实际上比较的是地址,对象之间的比较应优先使用equals()方法
5.
6.位运算(效率很高但可读性差)
>> 向右位移一位 实质:除以2
<< 向左位移一位 实质:乘以2
& 按位或 同样的位置上都是1则返回1,否则返回0(0&0、0&1、1&0)
| 按位与 同样的位置上有一个及以上1就返回1,否则返回0(0|0)
^ 按位异或 同样的位置上数目不同时返回1,否则返回0(1^1、0^0)
7.扩展赋值运算符
例如 +=、-=、*=、/=
支持自动类型转换,具有右结合性; a -= b+3; (实质:a = a-(b+3)) (+运算符优先级高)
8.条件运算符(三目运算符)具有右结合性;
形式:布尔表达式?表达式1:表达式2 int a=3>4?3:4>5?4:5; (实质:3>4?3:(4>5?4:5))
先判断布尔表达式的值是true还是false,如果是true,则选择表达式1的结果,反之选择表达式2
9.表达式
定义:有运算符和操作数组成的符号序列。
按照运算符的优先级从高到低进行,同级的按结合性进行
10.
11.自增与自减
在变量前:优先级高于算术运算符 ++a/--a(先进行自增运算,再进行表达式运算)
在变量后:优先级低于算术运算符 a++/a-- (先进行表达式运算,再进行自增运算)
例:int a=1,b=2;
Syatem.out.println(++a * b--); //输出4
设 i=12 ,则表达式 i+=i-=i*=i 的值是 -120 (同级按照结合性 从右向左)
i*=i --> 左边 = i*i =144
i -=144 --> 左边 = i-144 = 12-144 = -132
i += (-132) --> i = i + (-132) = 12 -132 = -120
三、实验
1.
double x,y;
int z;
z = (int)(x/y); x/y必须加括号,不然就是只把x转为int,再用int的x去除double的y,会报错
2.
声明双精度常量PI,值为3.14
final double PI=3.14;
3.汉明距离
汉明距离是一个概念,它表示两个(相同长度)字符串对应位置的不同字符的数量,我们以d(x,y)表示x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。
(1) class ***{
public int hanmingDistance(int x,int y){
int c = x ^ y;
String string = Integer.toBinaryString(c); 输入参数是整型,输出是二进制字符串
int cnt = 0; 如果直接是toString(),输出是十进制
for(int i= 0;i<string.length();i++){
if(string.charAt(i) == '1')
cnt++;
}
return cnt;
}
}
(2)
class ***{
public int hanmingDistance(int x ,int y){
int c = x^y;
return Integer.bitCount(c); // bitCount解释在上面,实质就是求出整型变量二进制数目
中1的个数。
}
}
(3)class ***{
public int hanmingDistance(int x,int y){
int c = x ^ y;
int cnt = 0;
while(c != 0){
if(c%2 == 1) 让十进制数/2就能让其本来对应的二进制数目去掉最后一位。
cnt++; O(log2n)
c = c / 2;
}
return cnt;
}
}
(4) class ***{
public int hanmingDistance(int x,int y){
int c = x ^ y;
int cnt = 0;
while(c != 0){
if((c&1) == 1)
cnt++;
c = c >>> 1; O(log2n)
}
return cnt;
}
}
(5) class ***{
public int hanmingDistance(int x,int y){
int c = x ^ y;
int cnt = 0;
while(c != 0){
c = c & (c - 1) ; c =c & (c-1) 让二进制数中最后一位为1的那一位置0
cnt++; } O(M) M表示二进制数中1的个数,例如有3个1就执行3次
return cnt; M < log2n
}
}
4. 编写一个函数,不用临时变量,直接交换 numbers = [a,b]中a与b的值
(1) class ***{
public int[] swapNumbers(int[] numbers) ){
int a = 1; b =2;
a = a + b; 如果a原值很大的话,有溢出的风险(超出a数据类型所能承受的范围)
b = a - b; (这个设置的其实是数组,但此处利用a和b来做方法上的示例)
a = a - b;
}
}
(2) class ***{
public int[] swapNumbers(int[] numbers) ){
int a = 1; b =2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
}