首页真相

Java基础1

Java基础1

本文核心词:Java基础

1_Java基础

1.jdk jre jvm

2.环境变量

3.基本类型/引用类型

4.自动拆箱/装箱

5.==和equals()方法:

6.三元运算符

7.递归

8.for循环

9.遍历

10.数组

11.continue

12.break

13.return

14.while

15.do while

16.switch

17.进制

18.注释符

19.

1.jdk jre jvm

JVM:Java Virtual Machine 是Java的虚拟机,是JRE的一部分。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。

所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。

JRE:Java runtime environment 是运行基于Java语言编写的程序所不可缺少的运行环境,用于解释执行Java的字节码文件。

JDK:Java Development Kit 是Java的标准开发工具包(普通用户只需要安装 JRE来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序)。它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环境JRE,

以及常用的Java基础类库等,是整个JAVA的核心。

2.环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等

3.基本类型/引用类型

一、基本数据类型

java中一共分为8种基本数据类型:byte、short、int、long、float、double、char、boolean,其中byte、short、int、long是整型。float、double是浮点型,char是字符型,boolean是布尔型。

二、引用类型

java为每种基本类型都提供了对应的封装类型,分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean。引用类型是一种对象类型,它的值是指向内存空间的引用,就是地址。

4 个字节(32 位)或者 8 个字节(64 位)

4.自动装箱、自动拆箱

Java从jdk1.5开始引入自动装箱和拆箱,使得基本数据类型与引用类型之间相互转换变得简单。

自动装箱: java自动将原始类型转化为引用类型的过程,自动装箱时编译器会调用valueOf方法,将原始类型转化为对象类型。

自动拆箱: java自动将引用类型转化为原始类型的过程,自动拆箱时编译器会调用intValue(),doubleValue()这类的方法将对象转换成原始类型值。

自动装箱主要发生在两种情况:一种是赋值时,一种是方法调用时。

a.赋值

Integer a = 3; //自动装箱

int b = a; //自动拆箱

b.方法调用

public Integer query(Integer a){

return a;

}

query(3); //自动装箱

int result = query(3); //自动拆箱

·.自动装箱、拆箱带来的问题

1.程序的性能

由于装箱会隐式地创建对象创建,因此千万不要在一个循环中进行自动装箱的操作,下面就是一个循环中进行自动装箱的例子,会额外创建多余的对象,增加GC的压力,影响程序的性能:

Integer sum = 0;

for(int i=0; i1000; i++){

sum+=i;

}

·.空指针异常

注意拆箱过程中可能产生的空指针异常,一个简单的例子:

Object obj = null;

int i = (Integer)obj;

3.对象相等比较时

先来看一个常见的例子:

Integer a = 120;

int b= 120;

Integer c = 120;

Integer d = new Integer(120);

System.out.println(a == b); //true t1

System.out.println(a == c); //true t2

System.out.println(a == d); //false t3

Integer e = 128;

Integer f = 128;

System.out.println(e == f); //false t4

返回结果是不是出乎大家的意料,解释一下每种结果的原因:

我们先反编译一下生成字节码:

Integer a = Integer.valueOf(120);

int b = 120;

Integer c = Integer.valueOf(120);

Integer d = new Integer(120);

System.out.println(a.intValue() == b);

System.out.println(a == c);

System.out.println(a == d);

Integer e = Integer.valueOf(127);

Integer f = Integer.valueOf(127);

System.out.println(e == f);

Integer e1 = Integer.valueOf(128);

Integer f1 = Integer.valueOf(128);

System.out.println(e1 == f1);

可以看到变量a、c在初始化的时候编译器调用了valueOf进行自动装箱,在a==b时对变量a调用了intValue()方法进行了自动拆箱操作,这就很好解释t1~t4的结果了。

t1产生的原因是编译器编译时会调用intValue()自动的将a进行了拆箱,结果肯定是true;

t2跟t4的结果比较难理解:这是因为初始化时,编译器会调用装箱类的valueOf()方法,查看jdk的源码:

public static Integer valueOf(int i) {

assert IntegerCache.high = 127;

if (i = IntegerCache.lowi = IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

发现jdk对-128~127之间的值做了缓存,对于-128~127之间的值会取缓存中的引用,通过缓存经常请求的值而显著提高空间和时间性能。

这就能解释t2结果返回true,而t4由于128不在缓存区间内,编译器调用valueOf方法会重新创建新的对象,两个不同的对象返回false。

t3结果无论如何都不会相等的,因为new Integer(120)构造器会创建新的对象。

Byte、Short、Integer、Long、Char这几个装箱类的valueOf()方法都会做缓存,而Float、Double则不会,原因也很简单,因为byte、Short、integer、long、char在某个范围内的整数个数是有限的,

但是float、double这两个浮点数却不是。

5.==和equals()方法:

对于引用类型使用==比较符比较的是其引用地址,使用equals大都是比较的其内容,具体还要看重写的equals方法的逻辑;

对基本类型使用==比较符比较的是字面量值是否相等;

1)基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true。

2)两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。

3)两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true。

4)基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3)中的比较。

int i=0;

Integer j=new Integer(0);

System.out.println(i==j);

System.out.println(j.equals(j));

double d=0.5;

Double b=new Double(0.5);

System.out.println(d==b);

System.out.println(b.equals(d));

Integer aa=-100;

Integer bb=-100;

System.out.println(aa==bb);

Integer aaa=129;

Integer bbb=129;

System.out.println(aaa==bbb);

6.三元运算符

用来完成简单的选择逻辑,即根据条件判断,从两个选择中选择一种执行。

使用格式:

(条件表达式)?表达式1:表达式2;

运算规则:

a) 判断条件表达式,结果为一个布尔值。

b) true,运算结果为表达式1

c) false,运算结果为表达式2

如:

7,递归

87%的人还看了:空洞骑士人物志 十五 奥罗