计算机介绍:
计算机包括
硬件
(hardware)
和
软件
(software)
两部分。硬件包括计算机中可以看得见的物理部分。而软件提供看不见的指令。这些指令控制硬件并且使得硬件完成特定的任务。
内存中的信息在断电时会丢失。那我们可以考虑将程序和数据永久的保存在存储设备上。当计算机
确实需要这些数据时,再移入内存,因为从内存中读取比从存储设备读取要快得多。
计算机硬件介绍:内存
比特
(bit)
和字节
(byte)
在讨论内存前,先清楚数据是如何存储在计算机中的。
计算机就是一系列的电路开关。每个开关存在两种状态:关(off)
和开
(on)
。如果电路是开的,它的值是1
。如果电路是关的,它的值是
0
。
一个0
或者一个
1
存储为一个比特
(bit)
,是计算机中最小的存储单位。
计算机中是最基本的存储单元是字节(byte)
。
每个字节由
8
个比特构成。
计算机的存储能力是以字节和多字节来衡量的。如下:
千字节
(kilobyte,KB) = 1024B
兆字节
(megabyte,MB) = 1024KB
千兆字节
(gigabyte,GB) = 1024MB
万亿字节
(terabyte,TB) = 1024GB
实测发现:
内存存取数据的速度比硬盘的存取速度快
10
倍
,在某些环境里,硬盘和内存之
间的速度差距可能会更大。而
CPU
的速度比内存不知还要快多少倍
。当我们把程序从硬盘
放到内存以后,
CPU
就直接在内存运行程序,这样比
CPU
直接在硬盘运行程序就要快很多。
内存解决了一部分CPU
运行过快,而硬盘数据存取太慢的问题。 提高了我们的电脑的运行
速度。内存就如同一条“高速车道”一般,数据由传输速度较慢的硬盘通过这条高速车道
传送至
CPU
进行处理!
但内存是带电存储的(
一旦断电数据就会消失
)
,而且容量有限,所以要长时间储存程序或数
据就需要使用硬盘。
内存在这里起了两个作用:
1.
保存从硬盘读取的数据,提供给
CPU
使用
2.
保存
CPU
的一些临时执行结果,以便
CPU
下次使用或保存到硬
java语言概述:
Java基础知识图解
是
SUN(
S
tanford
U
niversity
N
etwork
,斯坦福大学网络公司
) 1995
年推出的一门高级编程语言。
是一种面向Internet
的编程语言。
Java
一开始富有吸引力是因为
Java
程序可以在Web
浏览器中运行。这些
Java
程序被称为
Java
小程序(
applet
)。
applet
使用现代的图形用户界面与Web
用户进行交互。
applet
内嵌在
HTML
代码中。
随着Java
技术在
web
方面的不断成熟,已经成为
Web
应用程序的首选开发语言。 后台开发:Java
、
PHP
、
Python
、
Go
、
Node.js
Java在各领域的应用:
从
Java
的应用领域来分,
Java
语言的应用方向主要表现在以下几个方面:
•
企业级应用
:主要指复杂的大企业的软件系统、各种类型的网站。
Java
的安全机制以及它的跨平台的优势,使它在分布式系统领域开发中有广泛应用。应用领域包括金融、电信、交通、电子商务等。
•
Android
平台应用
:
Android
应用程序使用
Java
语言编写。
Android
开发水平的高低很大程度上取决于Java
语言核心能力是否扎实。
•
大数据平台开发
:各类框架有
Hadoop
,
spark
,
storm
,
flink
等,就这类技术生态圈来讲,还有各种中间件如flume
,
kafka
,
sqoop
等等 ,这些框架以及工具大多数是用Java
编写而成,但提供诸如
Java
,
scala
,
Python
,
R
等各种语言
API
供编程。
• 移动领域应用:主要表现在消费和嵌入式领域,是指在各种小型设备上的应用,包括手机、PDA
、机顶盒、汽车通信设备等。
Java语言主要特性:
• Java 语言是易学的 。 Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用 Java 。• Java语言是强制面向对象的。 Java语言提供类、接口和继承等原语,为了简单起见, 只支持类之间的单继承,但支持接口之间的多继承 ,并支持类与接口之间的实现机制(关键字为implements)。• Java语言是分布式的。 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库, 包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活) 机制也是开发分布式应用的重要手段。• Java语言是健壮的。 Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是Java 的明智选择。• Java 语言是安全的。 Java 通常被用在网络环境中,为此, Java 提供了一个安全机制以防恶意代码的攻击。如: 安全防范机制(类ClassLoader) ,如分配不同的名字空间以防替代本地的同名类、字节代码检查。• Java 语言是体系结构中立的。 Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为class 的文件),然后可以在实现这个Java平台的任何系统中运行。• Java 语言是解释型的。 如前所述, Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个Java 平台的任何系统的解释器中运行。• Java 是性能略高的。 与那些解释型的高级脚本语言相比, Java 的性能还是较优的。• Java 语言是原生支持多线程的。 在 Java 语言中,线程是一种特殊的对象,它必须由Thread 类或其子(孙)类来创建。
Java语言运行机制及运行过程:
Java语言的特点
特点一:
面向对象
两个基本概念:类、对象
三大特性:封装、继承、多态
特点二:
健壮性
吸收了
C/C++
语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
特点三:
跨平台性
跨平台性:通过
Java
语言编写的应用程序在不同的系统平台上都可以运行。
“
Write
once , Run Anywhere
”
原理:只要在需要运行
java
应用程序的操作系统上,先安装一个
Java虚拟机 (JVM Java
Virtual Machine) 即可。由JVM来负责Java程序在该系统中的运行。
Java两种核心机制
Java 虚拟机 (Java Virtal Machine) 垃圾收集机制 (Garbage Collection)
核心机制
—
垃圾回收
不再使用的内存空间应回收
——
垃圾回收。
在
C/C++
等语言中,由程序员负责回收无用内存。
Java
语言消除了程序员回收无用内存空间的责任:它提供一种系统级线程跟踪存储空间的分配情况。并在JVM
空闲时,检查并释放那些可被释放的存储空间。
垃圾回收在
Java
程序运行过程中自动进行,程序员无法精确控制和干预。
Java语言的环境搭建
简单而言,使用
JDK
的开发工具完成的
java
程序,交给
JRE
去运行。
JDK = JRE + 开发工具集(例如Javac编译工具等)
JRE = JVM + Java SE标准类库
Java基本语法
关键字与保留字
关键字
(keyword)
的定义和特点
定义:
被
Java
语言赋予了特殊含义,用做专门用途的字符串(单词)
特点:
关键字中所有字母都为小写
官方地址:
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
Java
保留字:现有
Java
版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字;goto 、
const
标识符(Identifier)
标识符:
Java
对各种
变量
、
方法
和
类
等要素命名时使用的字符序列称为标识符
技巧:凡是自己可以起名字的地方都叫标识符
。
定义合法标识符规则:
由
26
个英文字母大小写,
0-9
,
_
或
$
组成
数字不可以开头。
不可以使用关键字和保留字,但能包含关键字和保留字。
Java
中严格区分大小写,长度无限制。
标识符不能包含空格。
Java中的名称命名规范:
包名
:多单词组成时所有字母都小写:
xxxyyyzzz
类名、接口名
:多单词组成时,所有单词的首字母大写:
XxxYyyZzz
变量名、方法名
:多单词组成时,第一个单词首字母小写,第二个单词开始每个
单词首字母大写:
xxxYyyZzz
常量名
:所有字母都大写。多单词时每个单词用下划线连接:
XXX_YYY_ZZZ
注意
1
:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
注意
2
:
java
采用
unicode
字符集,因此标识符也可以使用汉字声明,但是不建议使用。
变 量
变量的概念:
内存中的一个存储区域
该区域的数据可以在同一类型范围内不断变化
变量是程序中最基本的存储单元。包含
变量类型、变量名和存储的值
变量的作用:
用于在内存中保存数据
使用变量注意:
Java
中每个变量必须先声明,后使用
使用变量名来访问这块区域的数据
变量的作用域:其定义所在的一对
{ }
内
变量只有在其作用域内才有效
同一个作用域内,不能定义重名的变量
声明变量
语法:<
数据类型
> <
变量名称
>
例如:int var;
变量的赋值
语法:<
变量名称
> = <
值
>
例如:var = 10;
声明和赋值变量
语法: <
数据类型
> <
变量名
> = <
初始化值
>
例如:int var = 10;
变量的分类-按数据类型
对于每一种数据都定义了明确的具体数据类型(强类型语言),在内存中分配了不同大小的内存空间。
整数类型:byte、short、int、long
Java
各整数类型有固定的表数范围和字段长度,不受具体
OS
的影响,以保证java
程序的可移植性。
java
的整型常量默认为
int
型,声明
long
型常量须后加‘
l’
或‘
L’
java
程序中变量通常声明为
int
型,除非不足以表示较大的数,才使用
long
浮点类型:float、double
与整数类型类似,
Java
浮点类型也有固定的表数范围和字段长度,不受具体操作
系统的影响。
浮点型常量有两种表示形式:
十进制数形式:如:
5.12 512.0f .512 (
必须有小数点)
科学计数法形式
:
如:
5.12e2 512E2 100E-2
float:单精度,尾数可以精确到
7
位有效数字。很多情况下,精度很难满足需求。
double:
双精度,精度是
float
的两倍。通常采用此类型。
Java
的浮点型常量默认为
double
型
,
声明
float
型常量,须后加‘
f’
或‘
F’
。
字符类型:char
char
型数据用来表示通常意义上
“
字符
”(2
字节
)
Java
中的所有字符都使用
Unicode
编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。
字符型变量的三种表现形式:
字符常量是用单引号
(
‘ ’
)
括起来的单个字符。例如:
char c1 = 'a'; char c2= '中
'; char c3 = '9';
Java
中还允许使用转义字符‘
\
’来将其后的字符转变为特殊字符型常量例如:char c3 = ‘\n’; // '\n'
表示换行符
直接使用
Unicode
值来表示字符型常量:‘
\uXXXX’
。其中,
XXXX
代表 一个十六进制整数。如:\u000a
表示
\n
。
char
类型是可以进行运算的。因为它都对应有
Unicode
码。
布尔类型:boolean
boolean
类型用来判断逻辑条件,一般用于程序流程控制:
if
条件控制语句;
while
循环控制语句;
do-while
循环控制语句;
for
循环控制语句;
boolean
类型数据只允许取值
true
和
false
,无
null
。
不可以使用
0
或非
0
的整数替代
false
和
true
,这点和
C
语言不同。
Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替:true用1表示,false用0表示。
基本数据类型转换
字符串类型:String
String不是基本数据类型,属于引用数据类型
使用方式与基本数据类型一致。例如:String str = “abcd”;
一个字符串可以串接另一个字符串,也可以直接串接其他类型的数据。
强制类型转换
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符:()
,但可能造成
精度降低或溢出
,
格外要注意。
通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
如:
String a = “43”; int i = Integer.parseInt(a);
boolean
类型不可以转换为其它的数据类型。
进 制
所有数字在计算机底层都以
二进制
形式存在。
对于整数,有四种表示方式:
二进制
(binary)
:
0,1
,满
2
进
1.
以
0b
或
0B
开头。
十进制
(decimal)
:
0-9
,满
10
进
1
。
八进制
(octal)
:
0-7
,满
8
进
1.
以数字
0
开头
表示。
十六进制
(hex)
:
0-9
及
A-F
,满
16
进
1.
以
0x
或
0X
开头
表示。此处的
A-F
不区分大小写。
如:
0x21AF +1= 0X21B0
Java
整数常量默认是
int
类型,当用二进制定义整数时,其第
32
位是符号位;
当是
long
类型时,二进制默认占
64
位,第
64
位是符号位
二进制的整数有如下三种形式:
原码
:直接将一个数值换成二进制数。最高位是符号位
负数的反码
:是对原码按位取反,只是最高位(符号位)确定为
1
。
负数的补码
:其反码加
1
。
计算机以二进制
补码
的形式保存所有的整数。
正数的原码、反码、补码都相同
负数的补码是其反码
+1
为什么要使用原码、反码、补码表示形式呢?
计算机辨别“符号位”显然会让计算机的基础电路设计变得十分复杂
!
于是人们想出了将符号位也参与运算的方法.
我们知道
,
根据运算法则减去一个正数等于加上一个负数,
即
: 1-1 = 1 + (-1) = 0 ,
所以机器可以只有加法而没有减法,
这样计算机运算的设计就更简单了。
运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符
赋值运算符
比较运算符(关系运算符)
逻辑运算符
位运算符
三元运算符
算术运算符
算术运算符的注意问题
如果对负数取模,可以把模数负号忽略不记,如:
5%-2=1
。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。
对于除号“
/”
,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 例如:int x=3510;x=x/1000*1000; x
的结果是?
“
+”
除字符串相加功能外,还能把非字符串转换成字符串
.
例如:System.out.println(“5+5=”+5+5); //打印结果是?
5+5=55 ?
赋值运算符
符号:
=
当“
=
”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
支持连续赋值。
扩展赋值运算符:
+=, -=, *=, /=, %=
比较运算符
逻辑运算符
逻辑运算符用于连接布尔型表达式,在
Java
中不可以写成
3<x<6
,应该写成x>3 & x<6
。
“
&”
和“
&&”
的区别:
单
&
时,左边无论真假,右边都进行运算;
双
&
时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”
和“
||”
的区别同理,
||
表示:当左边为真,右边不参与运算。
异或
( ^ )
与或
( | )
的不同之处是:当左右都为
true
时,结果为
false
。
理解:异或,追求的是“异”
!
位运算符
三元运算符
ASCII 码
在计算机内部,所有数据都使用
二进制
表示。每一个二进制位(
bit
)有
0
和
1
两种状态,因此 8
个二进制位就可以组合出
256
种
状态,这被称为一个字节(
byte
)。一个字节一共可以用来表示 256
种不同的状态,每一个状态对应一个符号,就是
256
个符号,从0000000 到
11111111
。
ASCII
码:上个世纪
60
年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII
码。
ASCII
码一共规定了
128
个
字符的编码,比如空格“SPACE”
是
32
(二进制
00100000
),大写的字母
A
是
65
(二进制
01000001
)。这128个符号(包括
32
个不能打印出来的控制符号),只占用了一个字节的后面
7
位,最前面的1
位统一规定为
0
。
缺点:
不能表示所有字符。
相同的编码表示的字符不一样:比如,
130
在法语编码中代表了
é
,在希伯来语编码中却代表
(
ג
)
了
Unicode 编码
乱码:世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因 此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。
Unicode
:
一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一
无二的编码,使用
Unicode
没有乱码的问题。
Unicode
的缺点:
Unicode
只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储:无法区别 Unicode
和
ASCII
:计算机无法区分三个字节表示一个符号还是分别表示三个符号。另外,我们知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储空间来说是极大的浪费。
UTF-8
UTF-8
是在互联网上使用最广的一种
Unicode
的实现方式。
UTF-8
是一种变长的编码方式。它可以使用
1-6
个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则:
对于单字节的
UTF-8
编码,该字节的最高位为
0
,其余
7
位用来对字符进行编码(等同于ASCII码)。
对于多字节的
UTF-8
编码,如果编码包含
n
个字节,那么第一个字节的前
n
位为
1
,第一个字节的第 n+1
位为
0
,该字节的剩余各位用来对字符进行编码。在第一个字节之后的所有的字节,都是最高两位为"10"
,其余
6
位用来对字符进行编码。
程序流程控制
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
• 其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:
顺序结构
分支结构
循环结构
顺序结构
程序从上到下逐行地执行,中间没有任何判断和跳转。
分支结构
根据条件,选择性地执行某段代码。
有
if…else
和
switch-case
两种分支语句。
循环结构
根据循环条件,重复性的执行某段代码。
有
while
、
do…while
、
for
三种循环语句。
注:
JDK1.5
提供了
foreach
循环,方便的遍历集合、数组元素。
顺序结构
程序流程控制
程序流程控
分支结构:if-else使用说明
条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量
语句块只有一条执行语句时,一对{}
可以省略,但建议保留
if-else语句结构,根据需要可以嵌套使用
当if-else
结构是“多选一”时,最后的
else
是可选的,根据需要可以省略
当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓当多个条件是“包含”关系时,“小上大下 /
子上父下”
switch-case结构
switch
语句有关规则
switch(表达式
)
中表达式的值
必须
是下述几种类型之一:
byte
,
short,
char
,
int
,枚举
(jdk 5.0)
,
String (jdk 7.0)
;
case子句中的值必须是
常量
,不能是变量名或不确定的表达式值;
同一个switch
语句,所有
case
子句中的常量值互不相同;
break语句用来在执行完一个
case
分支后使程序跳出
switch
语句块;如果没有break
,程序会顺序执行到
switch
结尾
default子句是
可任选的
。同时,位置也是灵活的。当没有匹配的
case
时,执行default
switch
和
if
语句的对比
if
和
switch
语句很像,具体什么场景下,应用哪个语句呢?
如果判断的具体数值不多,而且符合
byte
、
short
、
char
、
int
、
String
、枚举等几种类型。虽然两个语句都可以使用,建议使用swtich
语句。因为
效率稍高
。
其他情况:对区间判断,对结果为
boolean
类型判断,使用
if
,
if
的使用范围更广。也就是说,
使用
switch-case
的,都可以改写为
if-else
。反之不成立。
循环结构
循环结构
在某些条件满足的情况下,反复执行特定代码的功能
循环语句分类
for
循环
while
循环
do-while
循环
最简单“无限” 循环格式:
while(true) , for(;;),
无限循环存在的原因是并不
知道循环多少次,需要根据循环体内部某些条件,来控制循环的结束。
嵌套循环
(
多重循环
)
将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while均可以作为
外层循环
或
内层循环
。
实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false
时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
设外层循环次数为m
次,内层为
n
次,则内层循环体实际上需要执行
m*n
次。
break的使用
continue的使用
return的使用
return
:并非专门用于结束循环的,它的功能是结束一个方法。 当一个方法执行到一个return
语句时,这个方法将被结束。
与
break
和
continue
不同的是,
return
直接结束整个方法,不管这个return
处于多少层循环之内
特殊流程控制语句说明
break
只能用于
switch
语句
和
循环语句
中。
continue
只能用于
循环语句
中。
二者功能类似,但
continue
是终止
本次
循环,
break
是终止
本层
循环。
break
、
continue
之后不能有其他的语句,因为程序永远不会执行其后的语句。
标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
很多语言都有
goto
语句,
goto
语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。Java
中的
break
和
continue
是不同于goto
的。