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

 

posted @   一只神秘的猫  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示