初始 Java 语言

Java SE -- Java Platform, Standard Edition 是 Java 平台的基础
  • Java SE 以前称为 J2SE, 可以编写桌面应用和基于 web 的应用程序

  • JDK > JRE > JVM

  • Javac.exe -- 编译器, 主要用于将高级 Java 源代码翻译成字节码文件

  • Java.exe -- 解释器, 主要用于启动 JVM 对字节码文件进行解释并执行

  • 不同的操作系统提供了 JVM 规范的实现, 达成跨平台的目的

  • JVM 解释 Java 字节码文件为具体平台能够执行的机器指令

Java EE -- Java Platform, Enterprise Edition
  • J2EE 是 1999 年到 2003 年 Java EE 的抽象规范的版本名称

  • Java EE 构建在 Java SE 基础之上, 用于构建企业级应用

  • Java EE 是一个抽象的规范, 具体实现称为应用服务器

  • EJB 遵循 Java EE 的规范, 所以 EJB 属于 Java EE

Java ME -- Java Platform, Micro Edition 已经被 Android 平台淘汰了
Java 语言的注释
  • // 单行注释

  • /* 多行注释 */

  • /** 多行或文档注释, 支持提取的注释 */


变量和数据类型

变量
  • Java 是强类型语言, 变量在使用前必须声明来指明其数据类型

  • 变量在使用之前必须初始化

  • 变量不能重复声明

  • 尽量随用随声明, 尽量减少重复的代码

标识符命名
  • 由数字, 字母, 下划线以及$等等组成, 不能数字开头

  • 不能使用 Java 语言的关键字

  • 区分大小写, 长度没有限制但不宜过长

  • 支持中文, 但不推荐使用

  • 标识符可以给 类/变量/属性/方法/包 起名字

数据类型
  • 基本类型: byte, short, int, long, float, double, boolean, char

  • 引用类型: 数组, 类, 接口, 枚举, 标注

进制转换
  • 负十进制转换为二进制: 1.十进制绝对值转化为二进制; 2.按位取反; 3.再加一

  • 负二进制转换为十进制: 1.先减一; 2.按位取反; 3.转为十进制并加负号

单个字节
  • 非负数所能表示的整数范围: 0000 0000 ~ 0111 1111 => 0 ~ 127

  • 负数所能表示的整数范围: 1000 0000 ~ 1111 1111 => -128 ~ -1

  • 单个字节表示的整数范围: -128 ~ 127

整数类型
  • byte, short, int, long, 默认int 类型

  • byte 类型在内存占 1 个字节, 表示范围 -2^7 ~ 2^7-1

  • short 类型在内存占 2 个字节, 表示范围 -2^15 ~ 2^15-1

  • int 类型在内存占 4 个字节, 表示范围 -2^31 ~ 2^31-1

  • long 类型在内存占 8 个字节, 表示范围 -2^63 ~ 2^63-1

  • 需要表达比 int 更大的量, 在直接量后面加上 lL

浮点类型
  • float, double, 默认 double

  • float 类型在内存占 4 个字节, 单精度浮点数, 可以表示 7 位有效数字

  • double 类型在内存占 8 个字节, 双精度浮点数, 可以表示 15 位有效数字

  • 需要表达比 double 精度小的量, 在直接量后面加上 f 或者 F

  • 浮点类型基本运算可能会有误差, 若需要精确计算, 使用 java.math.BigDecimal

布尔类型
  • boolean, 只有 truefalse,  赋别的值会报错

  • 布尔类型在内存空间所占大小没有明确规定, 可以认为是一个字节

字符类型
  • 描述单个字符的数据类型 char,  如: 'a', '人'

  • 占 2 个字节并且没有符号位, 表示范围 0 ~ 65535

  • 开发中更多的使用由多个字符串起来的字符串, 使用 String 类型加以描述

    • 需要掌握的 ASCII: '\n'-10 SPACE-32 '0'-48 'A'-65 'a'-97

  • Java 字符类型采用 Unicode 字符集编码, 为定长字符集, 所有字符都是 16 位

    • 需要掌握的转义字符: {'\0', '\t', '\n', '\r', '\"', '\'', '\\'}

基本数据类型之间的转换
  • 自动类型转换

    • 从小到大类型的转换byte->short,char->int->long->float->double

  • 强制类型转换

    • 从大到小类型的转换target_type variable_name = (target_type) source_varable_name


运算符

算术运算符
  • + - * / %

    • 若希望保留小数部分

    • 使用强制类型转换将其中一个操作数转换为 double

    • 使用1.0乘以其中一个操作数

  • 异常

5/0 -> 算数异常;

5/0.0 -> Infinity;

0/0.0 -> NaN, Not a Number;
字符串连接符
  • 只要 + 两边的操作数有一个是字符串类型, 则该 + 变为字符串连接符

a=1, b=1, c=1;
a+b+c->3;
a+b+c+""->3;
a+b+""+c->21;
a+""+b+c->111;
""+a+b+c->111;
""+(a+b+c)->3;
关系/比较运算符
  • > < >= <= == !=

    • 推荐格式: 常量 == 变量

自增减运算符
  • ++ --

    • 只能用于变量, 常数不可以

  • a++: 先让 a 的数值作为整个表达式的最终结果, 然后让 a 自增

  • ++a: 先让 a 自增, 然后让 a 的新值作为整个表达式的最终结果

  • a++ + ++a; -> x+y where x=a, y=a+1+1 -> 2a+2

逻辑运算符
  • && || !

  • 短路特性: 前面的不成立, 后面的判断会跳过执行

(false) && (++a == 5); -> (++a == 5) will not be executed
(true) || (++b == 5); -> (++b == 5) will not be executed
条件/三目运算符
  • variable = Expression1 ? Expression2 : Expression3;

赋值运算符
  • = += -= *= /=

    • a=b=1 -> b=1, a=b; a+=3 -> a=a+3; a-=3 -> a=a-3;

  • 复合赋值运算符与简单赋值运算符有区别

byte b = 1;
b = b + 3         -> error: incompatible type;
b = b + (byte)3   -> 报错, 编译器优化导致最终还是 int;
b = (byte)(b + 3) -> 4;
b += 3           -> b = (byte)(b + 3) -> 4;
移位运算符 -- 了解即可
  • "<<" 左移运算符, 将数据的二进制位向左移动, 右边使用 0 补充

byte b1 = 13, byte b2 = (byte)(b1 << 1) -> 26;
13 << 1 -> 0000 1101 << 1 -> 0001 1010 -> 26;
-13 << 1 -> 1111 0011 << 1 -> 1110 0110‬ -> -26;
  • ">>" 右移运算符, 将数据的二进制位向右移动, 左边使用符号位补充

-13 >> 1 -> 1111 0011 >> 1 -> 1111 1001 -> -7;
  • ">>>" 逻辑右移运算符, 将数据的二进制位向右移动, 右边使用 0 补充

-13 >>> 1 -> 0111 ... 1111 1001 -> 2147483641‬ // 默认32位
位运算符 -- 了解即可
  • & 表示按位'与'运算符, 按照二进制位进行与运算, 同 1 为 1, 一 0 为 011 & 13 -> 0000 1011 & 0000 1101 -> 0000 1001 -> 9

  • | 表示按位'或'运算符, 按照二进制位进行或运算, 同 0 为 0, 一 1 为 111 | 13 -> 0000 1011 | 0000 1101 -> 0000 1111 -> 15

  • ^ 表示按位"异或"运算符, 按照二进制位进行异或运算, 同为 0, 不同为 111 ^ 13 -> 0000 1011 ^ 0000 1101 -> 0000 0110 -> 6-11 ^ -13 -> 1111 0101 ^ 1111 0011 -> 0000 0110 -> 6

  • ~ 表示按位"取反"运算符, 按照二进制位进行取反运算, 1 为 0, 0 为 1~ 11 -> ~ 0000 1011 -> 1111 0100 -> -12

运算符的优先级
  • "括号"的优先级最高, "等号"优先级最低

  • 只有"等号"的结合性 (Associativity) 是从右到左, 其他都是从左到右


流程控制语句

局部变量 -- 作用范围是从声明开始一直到方法体结束
块变量 -- 作用访问是从声明开始一直到当前语句块结束
顺序结构 -- sequential structure
分支结构 -- branch structure
if () {}
if () {} else {}
if () {} else if () {} else {}
switch (Type) {
   // Type 支持的数据类型:
   // byte, short, char, int,
   // jdk 1.5 开始支持枚举类型,
   // jdk 1.7 开始支持 String 类型
   case 0:
   case 1:
       Statement1;
       break;
   case 2:
       statement2;
       break;
   default:
       statement;
       // 放在最后可以省略 break, 否则要加上
       // break;
}
循环结构 -- loop structure
    //适合于明确循环次数的场合, 也可以成为死循环
for (initialization; condition; iteration) {
   body;
}

//do while 循环格式: 最后要加分号
//do while 循环主要用于至少执行一次循环体的场合
do {
   body;
} while (condition);

// while循环适合于明确循环条件, 但不明确循环次数的场合
while (condition) {
   body;
}

continue // 语句, 结束本次循环开始下次循环

break // 关键字, 退出当前语句块, 在循环体中用于退出循环

//如果要退出外层循环, 使用标号
outer: for(...) {
   for(...) {
      break outer;
   }
}


数组

常见异常

ArrayIndexOutOfBoundsException 数组下标越界异常ArithmeticException 算术异常

内存结构之栈区

用于存放程序运行过程中所有的局部变量

内存结构之堆区

用于存储使用 new 关键字创建的数组和对象

一维数组
  • DataType[] array = new DataType[array.length]

  • 数组名的内存空间中存放的是数据在堆区中的内存地址信息

  • 通过下标访问数组每一个元素, 从 0 开始 到 array.length - 1

  • 初始化方式

    • DataType[] array = new DataType[]{value0, value1, value2};

    • DataType[] array = {value0, value1, value2}; // simplified

    • byte, short, char, int, long 为 0;

    • float, double 为 0.0; booleanfalse;

    • 基本类型数组初始值:

    • 可以在数组声明的同时进行初始化:

  • 是相同数据类型的多个元素的容器

    • 本质上是在空间中申请一段连续的存储单元

    • 在 Java 语言中体现为一种引用数据类型

  • 优缺点

    • 可以通过下标快速访问指定位置的元素

    • 要求所有元素的类型相同

    • 要求内存空间连续, 并且长度一旦确定就不能修改

    • 增加和删除效率低

  • 变长数组: 主要指变量可以作为数组的长度, 但绝不是数组的长度可以改变

数据工具类
  • java.util.Arrays 类可以实现对数组中元素的遍历, 查找, 排序等操作

  • 常用方法

    • Arrays.toString(array); //把array数组解析成Sring类型的字符串 

    • Arrays.fill(array, val); //填充a1数组中的每个元素都是val

    • Arrays.equals(array1, array2);//比较两个数组元素是否相等

    • Arrays.sort(array);//对array数组的所有元素进行排序,并且是按从小到大的顺序

    • Arrays.binarySearch(array, val);//通过二分法在已经排好序的array数组中查找指定的元素val,并返回该元素的下标

二维数组
  • DataType[][] array = new DataType[row][col];

  • 本质上由多个一维数组摞在一起的数组

  • 每个元素都是一维数组, 而一维数组中的每个元素才是数据内容

  • 初始化方式

DataType[][] array = {{element0, element1, ...}, ...};
int[][] arr = new int[3][]; // 每一行列数不一样
  arr[0] = new int[3];
  arr[1] = new int[4];
  arr[2] = new int[5];

Java 语言基础 (初识Java语言, 变量和数据类型, 运算符, 流程控制语句, 数组)的更多相关文章

  1. 第一章 python介绍、变量、数据类型、流程控制语句等

    一.python介绍 1.python的诞生 python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum(龟叔)于1989年发明,第一个公开发行版发行于1991年. ...

  2. Swift语言指南(一)--语言基础之常量和变量

    原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...

  3. 变量和数据类型&运算符

    变量和数据类型&运算符 变量 变量的作用:用来存储数据 变量命名的规范:字(字符串)下(_下划线)美($)人(¥) 数 (可以包括数字)骆驼 有意义(可以以字母,下划线,美元符号,人民币符号开 ...

  4. Java语言基础及java核心

    一.Java语言特点 1. 简单 2. 面向对象 3. 分布式 4. 健壮 5. 安全 6. 中性架构跨平台 7. 超强的可移植性 8. 高性能 9. 多线程 二.java的环境变量 JAVA_HOM ...

  5. Java入门 - 语言基础 - 01.Java简介

    原文地址:http://www.work100.net/training/java-intro.html 更多教程:光束云 - 免费课程 Java简介 序号 文内章节 视频 1 概述 2 主要特性 3 ...

  6. C语言基础:两个变量交换值的方法

    学习任何语言基础时,两个数值得交换是必须掌握的,下面是3种不同的方式(c语言) 方法一:利用数学的计算技巧 #include <stdio.h> int main() { , b = ; ...

  7. 【Java并发基础】Java内存模型解决有序性和可见性

    前言 解决并发编程中的可见性和有序性问题最直接的方法就是禁用CPU缓存和编译器的优化.但是,禁用这两者又会影响程序性能.于是我们要做的是按需禁用CPU缓存和编译器的优化. 如何按需禁用CPU缓存和编译 ...

  8. 【Java并发基础】Java线程的生命周期

    前言 线程是操作系统中的一个概念,支持多线程的语言都是对OS中的线程进行了封装.要学好线程,就要搞清除它的生命周期,也就是生命周期各个节点的状态转换机制.不同的开发语言对操作系统中的线程进行了不同的封 ...

  9. Java 第一章 初识Java

    第一章笔记 什么是计算机程序:算机为完成某些功能生产的一系列有序指令集合 Java技术包括: java SE:标准版 java EE:企业版 Java ME:移动版 开发Java程序步骤:1.编写 2 ...

随机推荐

  1. 解决: "E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ..."

    解决: "E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?& ...

  2. Android四大组件简介:Android 基础知识,开发教程

    Android 四大组件: Activity.Service.Broadcast Receiver.Content Provider. http://developer.android.com/int ...

  3. How To Install Linux & Nginx & MySQL & PHP (LEMP) stack on Raspberry Pi 3,Raspberry Pi 3,LEMP,Nginx,PHP, LEMP (not LNMP)

    1.   How To Install Linux & Nginx & MySQL & PHP (LEMP) stack on Raspberry Pi 3         R ...

  4. 如何将多个 Apple 设备中保存在 iCloud 里面密码同步

    如何将多个 Apple 设备中保存在 iCloud 里面密码同步 iCloud 钥匙串 密码同步 数据迁移 iOS iCloud 钥匙串会记住一些信息,因此您就无需记忆这些信息. 它会在您批准的任何设 ...

  5. css text gradient color, css fonts gradient color

    css text gradient color, css fonts gradient color css 字体渐变色 demo https://codepen.io/xgqfrms/pen/OJya ...

  6. NGK公链大事件盘点——回顾过去,展望未来!

    NGK公链构想广阔,愿景宏大,2020年10月NGK正式上线,同时NGK全球发布会正式启动,建立区块链生态体系. 早在这之前,NGK就经过了紧锣密鼓的数年缜密搭建. 2018年6月NGK底层系统技术原 ...

  7. MySQL的简单使用方法备忘

    这只是一篇我的个人备忘录,写的是我常用的命令.具体可以参考"菜鸟教程" https://www.runoob.com/mysql/mysql-tutorial.html 登录(用户 ...

  8. Python算法_三种斐波那契数列算法

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列&qu ...

  9. Java Reference核心原理分析

    本文转载自Java Reference核心原理分析 导语 带着问题,看源码针对性会更强一点.印象会更深刻.并且效果也会更好.所以我先卖个关子,提两个问题(没准下次跳槽时就被问到). 我们可以用Byte ...

  10. 记一个关于std::unordered_map并发访问的BUG

    前言 刷题刷得头疼,水篇blog.这个BUG是我大约一个月前,在做15445实现lock_manager的时候遇到的一个很恶劣但很愚蠢的BUG,排查 + 摸鱼大概花了我三天的时间,根本原因是我在使用s ...