JAVA(java,数据类型,位运算)
JAVA(java,数据类型,位运算,)
java:半解释半编译
解释:浏览器可以直接运行JS,不需要编译
编译:java,scala,hello
java是程序员写的,以10进制java文件写的,计算机只认识二进制。
java历史:sun公司发明了java
java:C和C++
计算机:软件加硬件
内存:物理内存,虚拟内存
操作系统:
- 打开指令操作台,win+r,输入cmd
- 输入盘符,进入E盘 e:
- 回到上一层: cd..
- 进入指定目录: cd a
- dir指令查看当前目录下文件夹信息: dir
- 创建一个空文件: copy nul a.txt
- 向文件内写入内容: echo 1234>a.txt
- 复制文件: copy a.txt b.txt
- 删除文件:del a.txt 不走回收站
存储单位:
- 一个bit=一位
- 1byte=8bit
- 1kb=1024b
- 1mb=1024k
- 1gb=1024m
- 1tb=1024g
- 1pb=1024b
二进制的加减法计算:
- 10010011
- 10101001
- 对应相加
- 100111100
- 00000001
- 10000001
- 用补码计算
Java三个版本:
- JavaSE:桌面应用程序
- JavaEE:企业级应用,主要学习
- JavaME:手机端
Java特点:
- 面向对象
- 跨平台:操作系统,Java写的软件可以在任意操作系统运行
- 解释执行,计算机执行的.class,解释执行.class
- 多线程,多个任务同时进行
- 分布式
- 健壮性:强数据类型的语言,异常处理,垃圾回收机制
- 安全性:插件设置一个去防范机制
Java环境搭建
- JAVA_HOME:jdk路径(C:\P\java\jdk-11.0.15)
- 找到原来的Path,把bin目录复制进去(或%JAVA_HOME \ bin%)
JAVA常用指令:
- java
- javac
- javap
- java -version
- java -jar
创建一个java文件
1 2 3 4 5 6 | public class Hello{ public static void main(String[] args) { System.out.println( "Hello" ); } } |
通过cmd指令找到java文件,需要编译,使用javac hello.java,生成了一个hello.class,是计算机去解释执行的文件,说明hello.class是一个二进制文件,hello.class叫字节码文件
执行hello.java,java hello
类:Java开发中最小的单位
命名规则(标识符):字母数字下划线$,其中不能以数字开头,关键字不能命名
关键字:官方的解释,有独一无二的作用,都是小写的,50个左右,2个保留字
java注释:
- //单行注释
- /*多行注释*/
- /**
- *文档注释
- */
三种注释都可以调试代码
主方法(main):是程序的入口
Java数据类型:
- 基本数据类型(四类八种)
- 引用数据类型
基本数据类型:
整型:
byte:字节型 -128~127 一个字节=8位
short:短整型 -2^15~2^15-1 二个字节=16位
int:-2^31~2^31-1 四个字节=32位
long:长整型-2^63~2^63-1 八个字节=64位(使用长整型需要在值得后面加L或l)
浮点型
float:单精度浮点型 四个字节=32位 (使用长整型需要在值得后面加F或f)
double:双精度浮点型 八个字节=64位
字符型
char:字符型 二个字节=16位 0~255(字符型需要加单引号,引号中只能放一个)
布尔型
boolean,true,false 一个字节=8位
变量的命名:字母数字下划线$,其中不能以数字开头,关键字不能命名
小数默认double,整数默认int
Interger 缓存源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static {
// high value may be configured by property
int h = 127;
}
}
Character 缓存源码
public static Character valueOf(char c) {
if (c <= 127) { // must cache
return CharacterCache.cache[(int)c];
}
return new Character(c);
}
private static class CharacterCache {
private CharacterCache(){}
static final Character cache[] = new Character[127 + 1];
static {
for (int i = 0; i < cache.length; i++)
cache[i] = new Character((char)i);
}
}
Boolean 缓存源码
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
精度:
整形:4种整型,精度和位数挂钩,位数越大,精度越高
浮点型:double精度比float要高
低精度与高精度运算,得到的是高精度
浮点数精度丢失
float a = 2.0f - 1.9f;
float b = 1.8f - 1.7f;
System.out.println(a);// 0.100000024
System.out.println(b);// 0.099999905
System.out.println(a == b);// false
简述十进制下的 0.2 转成二进制小数
// 0.2 转换为二进制数的过程为,不断乘以 2,直到不存在小数为止,
// 在这个计算过程中,得到的整数部分从上到下排列就是二进制的结果。
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0(发生循环)
...
如何解决浮点数精度丢失问题
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b);
BigDecimal y = b.subtract(c);
System.out.println(x); /* 0.1 */
System.out.println(y); /* 0.1 */
System.out.println(Objects.equals(x, y)); /* true */
超出 long 整型的数据如何表示
long l = Long.MAX_VALUE;
System.out.println(l + 1); // -9223372036854775808
System.out.println(l + 1 == Long.MIN_VALUE); // true
BigInteger
内部使用 int[]
数组来存储任意大小的整形数据。
相对于常规整数类型的运算来说,BigInteger
运算的效率会相对较低。
基本类型转换:
1.自动类型转换:低精度->高精度
2.强制类型转换:高精度->低精度
赋值运算符:
- +
- =
- -=
- *=
- /=
- %=
- a+=1 -> a=a+1
比较运算符:
- <
- >
- >=
- <=
- ==
- !=
逻辑运算符:
与 :&& & 只有所有条件都为true,整体才为true,否则为false,一假则假,短路效应
a&1 = 0 偶数
a&1 = 1 奇数
或 :一真则真,短路效应
非 :取反 ~
异或:^
void swap(int x , int y)
{
x ^= y;
y ^= x;
x ^= y;
}
>> << >>>(无符号右移)
位运算运用:
- 绝对值:
1 2 3 4 5 6 | int abs( int x ) { int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y } |
- 取模运算转化成位运算 (在不产生溢出的情况下)
a % (2^n) 等价于 a & (2^n - 1)
- 乘法运算转化成位运算 (在不产生溢出的情况下)
a * (2^n) 等价于 a<< n
- 除法运算转化成位运算 (在不产生溢出的情况下)
a / (2^n) 等价于 a>> n
例: 12/8 == 12>>3
- a % 2 等价于 a & 1 ( a & log2(2))
a % 4 等价于 a & 2 ( a & log2(4))
.....
a % 32 等价于 a & 5
- if (x == a) x= b;
else x= a;
等价于 x= a ^ b ^ x;
- x 的 相反数 表示为 (~x+1)
- 绝对值
1 2 3 4 5 6 | int AbsInt( int n) { int i = n >> 31 ; // if n >= 0, i = 0; else i = 0xffffffff = -1 n = n ^ i; // if i = 0, n = n; else i = 0xffffffff, n = ~n return n - i; // if i = 0, n - i = n; else i = -1, n - i = n + 1 } |
- 浮点数的绝对值
1 2 3 4 5 6 7 8 9 10 11 | float AbsFloat( float flt) { *(size_t*)&flt = (*(size_t*)&flt & 0x7fffffff ); return flt; } double AbsDouble( double dbl) { *((size_t*)&dbl + 1 ) = (*((size_t*)&dbl + 1 ) & 0x7fffffff ); return dbl; } |
三目运算符:a>b?1:2
char的特殊性:
映射表ASCII码,每一个字符在计算机都是以ASCII码保存
char是16位,可以自动转成int,long,float,double