java基础知识-起步与数据类型
Java基础
java介绍
java特点
半解释半编译
1.编译型:编译型语言如C、C++,代码是直接编译成机器码执行,但是不同的平台(x86、ARM等)CPU的指令集不同,因此,需要编译出每一种平台的对应机器码。
2.解释型:解释型语言如Python、Ruby没有这个问题,可以由解释器直接加载源码然后运行,代价是运行效率太低。
java半编译半解释:而Java是将代码编译成一种“字节码”,它类似于抽象的CPU指令,然后,针对不同平台编写虚拟机,不同平台的虚拟机负责加载字节码并执行,这样就实现了“一次编写,到处运行”的效果。
java的三个版本
- Java SE:Standard Edition,标准版,包含标准的JVM和标准库,开发桌面应用
- Java EE:Enterprise Edition在Java SE的基础上加上了大量的API和库,以便方便开发Web应用、数据库、消息服务
- Java ME:Micro Edition:面向手机应用,几乎凉了
三者关系
jdk、jre、jvm三者关系
- JRE就是运行Java字节码的虚拟机。
- 但是,如果只有Java源码,要编译成Java字节码,就需要JDK,因为JDK除了包含JRE,还提供了编译器、调试器等开发工具。
JSR、JCP
- JSR规范:Java Specification Request
- JCP组织:Java Community Process
java优势
- Java是基于JVM虚拟机的跨平台语言,一次编写,到处运行;
- Java程序易于编写,而且有内置垃圾收集,不必考虑内存管理;
- Java虚拟机拥有工业级的稳定性和高度优化的性能,且经过了长时期的考验;
- Java拥有最广泛的开源社区支持,各种高质量组件随时可用。
Java语言常年霸占着三大市场:
- 互联网和企业应用,这是Java EE的长期优势和市场地位;
- 大数据平台,主要有Hadoop、Spark、Flink等,他们都是Java或Scala(一种运行于JVM的编程语言)开发的;
- Android移动平台。
Java代码是怎么跑起来的
Java源码本质上是一个文本文件,我们需要先用javac
把Hello.java
编译成字节码文件Hello.class
,然后,用java
命令执行这个字节码文件
- 一个Java源码只能定义一个
public
类型的class,并且class名称和文件名要完全一致; - 使用
javac
可以将.java
源码编译成.class
字节码; - 使用
java
可以运行一个已编译的Java程序,参数是类名。
基本数据类型
java的基本数据类型一共八种:
整型
注意:在Java中,整型的范围与运行Java代码的机器无关。这就解决了软件从-一个平台移植到另.
一个平台, 或者在同-一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。
浮点类型
- double表示这种类型的数值精度是float类型的两倍
- float类型的数值有一个后缀F (例如,3.402F)。 没有后缀F的浮点数值(如3.402) 默认为
double类型。 - 所有的浮点数值计算都遵循IEEE 754规范。下面是用于表示溢出和出错情况的三个特殊的
浮点数值:- 正无穷大
- 负无穷大
- NaN (不是-一个数字)
- 一个正整数除以0的结果为正无穷大。计算0/0或者负数的平方根结果为NaN。
- 对应Double.POSITIVE INFINITY、 Double.NEGATIVE_ INFINITY、Double.NaN
char类型
char类型用于表示单个字符。通常用来表示字符常量。
boolean类型
boolean (布尔)类型有两个值: false和true, 用来判定逻辑条件。整型值和布尔值之间不
能进行相互转换。
数据类型之间的转换
在图中有6个实心箭头,表示无信息丢失的转换;有3个虛箭头,表示可能有精度损失的转换。
强制类型转换
可能损失精度情况下使用强制类型转化
double x = 9.997; .
int nx = (int) x;
//这样,变量nx的值为9。强制类型转换通过截断小数部分将浮点值转换为整型。
四舍五入推荐使用round函数
double x = 9.997;
int nx = (int) Math. round(x);//round返回long类型所以要强转
常量
在Java中,利用关键字final声明常量.关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上,常量名使用大写。
final double PI=3.1415926;
类常量:在Java中,经常希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类
常量。可以使用关键字static final设置-一个类常量。
class Main{
public static final PI=3.1415926;
}
变量
声明一个变量之后,必须用赋值语句对变量进行显式初始化,千万不要使用未被初始化的
变量。例如,Java编译器认为下面语句序列是错误的:
int vacationDays;
System.out.print1n(vacationDays); // ERROR--variable not initialized
运算符
加减乘除
- +、-、*、/加减乘除
- 除0会得到NaN结果
自增自减运算符
int m=7;
int n=7;
int a=2*++m;//a=16,m=8
int b=2*m++;//b=14,m=8
//原因;
//m++的返回值还是原来是数本身7,但是m++这个过程使得m变为8了
//++m的返回值是8,而m++这个过程使得它变成了8
注释:尽量少使用这种方法,防止bug
关系运算符和Boolean运算符
- 使用两个等号= =检测是否相等
- 使用!=检测是否不相等
- 另外,经常使用的运算符还有< (小于)、> (大于),<= (小于等于)和>= (大于等于)。
- 逻辑运算&&、||、!
- 三元操作 x<y?x:y
位运算符
1.& ("与"). | ("或"). ^ ("异或")、-("非")
int m=8;
int n=12;
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toBinaryString(n));
System.out.println(Integer.toBinaryString(m&n));
System.out.println(Integer.toBinaryString(m|n));
System.out.println(Integer.toBinaryString(-m));
System.out.println(Integer.toBinaryString(-n));
System.out.println(Integer.toBinaryString(m^n));
2.“>>”和“<<”运算符将二进制位进行右移或左移操作。当需要建立位模式屏蔽某些位时,使用这两个运算符十分方便:
int m=8;
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toBinaryString(m>>1));
System.out.println(Integer.toBinaryString(m<<1));
3.>>>运算符将用0填充高位; >> 运算符用符号位填充高位。没有< << <运算符。
int m=-8;
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toBinaryString(m>>1));
System.out.println(Integer.toBinaryString(m>>>1));
括号与运算优先级
如果不使用圆括号,就按照给出的运算符优先级次序进行计算。同一个级别的运算符按照从左到右的次序进行计算(除 了表中给出的右结合运算符外。)
枚举类型
自定义枚举类型。枚举类型包括有限个命名的值。
enum Size { SMALL, MEDIUM, LARGE, EXTRA_ .LARGE };
Size s = Size.MEDIUM;//可以声明自己定义的类型,Size类型只能存储枚举值或者null
字符串类型
特点
- 字符串类型不在8种基础类型中,它是一个对象
- 字符串默认值是null
- 字符串是不可变的
- 字符串判断是否内容相等要用equals方法不能直接用,否则出问题,因为比较的是引用
- 如果经常要进行拼接操作,建议使用StringBuilder(线程不安全,效率相对高),StringBuffer(线程安全,效率相对低)
- String 被声明为 final,因此它不可被继承
- String 内部使用 char 数组存储数据
字符串类型常用方法
1.求长度
s.length()//求字符串长度
//注意如果s是个数组求长度是s.length
2.拼接
Strng s1="Hello";
String s2=" World!"
s1+s2//Hello World
3.数字转字符串
int a=10;
String b="";
String c=a+b;//"10"
4.取出字符
String s="xiaoming";
char a=s.charAt(0);//'x'
5.判断字符串是否相等
s.equa1s(t)//不忽略大小比较
"e1o".equalsInoreCase("helo")//忽略大小比较
6.其他
包装类型
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
Integer x = 2; // 装箱 调用了 Integer.valueOf(2)
int y = x; // 拆箱 调用了 X.intValue()
参考
*《java核心技术卷》