java基础 - 学习篇一

305 阅读12分钟

数据类型的分类

image.png

基本数据类型(Primitive Type)

    基本类型共有八种,其中包括六种数值型与两个非数值型。基本数据类型的信息如下:

数据类型大小(单位:bit/位)所属包装类最小范围最大范围
byte8java.lang.Byte-128+127
short2byte = 16java.langShort-32768+32767
int4byte = 32java.lang.Integer-2^31+2^31-1
long8byte = 64java.lang.Long-2^63+2^63-1
float4buye = 32java.lang.Float-3.4 * 10^38+3.4 * 10^38
double8byte = 64java.lang.Double-1.7 * 10^308+1.7 * 10^308
char2byte = 16java.lang.Character065535
boolean所占大小不明确java.lang.Boolean只有"true"和"false"两个取值

(注解:内存的存储最小单位是“bit/位”,1byte/字节 = 8bit/位)

(注意:在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,boolean类型没有给出明确的占用字节数,因为对虚拟机来说根本就不存在 boolean 这个类型,在虚拟机中boolean类型的值:false/true是用0/1来表示的,所以不确定。原因如下:)

  大小为1bit:
    boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。

  大小为1byte:
    虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。

  大小为4byte:
    来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。

  显然第三条是更准确的说法,那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。所以boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。

整数类型:

Java中整数类型一般默认为int型,
整型有四种表示形式:

  • ①二进制(锋二进一)、
  • ②八进制(锋八进一)、
  • ③十进制(也就是我们生活中所表达的类型,锋十进一)、
  • ④十六进制(锋十六进一); (注意:十六进制从第十位开始就不是数字了,而是字母,如:10就为A,11为B,16为10,28为1C)
    (注意:我们一般声明整型时默认的就是十进制,若要声明其他进制形式,需要在值的最前面加上特定的标识)
byte a = 0b100; //声明一个二进制byte型变量a,给定值为4(二进制为100),(二进制以0b标识)
short b = 0100; //声明一个八进制short型变量b,给定值为144(八进制为100),(八进制以0标识)
int c = 0x100; //声明一个十六进制int型变量c,给定值为400(十六进制为100),(十六进制以0x标识)
声明一个byte型变量:
byte a = 1;

声明一个short型变量:
short a = 22;

声明一个int型变量:
int a = 123;

声明一个long型变量: 
(注意:若声明了long类型,且该值在int范围内,则后面可以不加“L”,否则需要在后面加上“L”)
long b = 5555555555555555L;

浮点类型:

Java中浮点类型一般默认为double型

  • float:单精度浮点(小数点后可精确到7位有效数字)
  • double:双精度浮点(小数点后可精确到float的二倍有效数字)
声明一个float型变量:
(注意:声明float型需要在后面加上“f”或“F”)
float c = 3.14f;
float d = 3.14F;
    
声明一个double型的变量:
double e = 3.1415;
(注意:浮点类型存在舍入误差,如果需要不产生误差的小数类型用来精确计算可以使用java.math包下的BigDecimal类)
字符型:

我们知道Java中的字符是基于Unicode码表的,所以字符型是用来表示Unicode编码中的字符的,范围在:“0 - 65535”,也就是说char也可以用数字来表示;
 字符型在赋值的时候与其他类型有点区别,char作为单个字符型,在赋值时要加上单引号。    

声明一个char型变量:
char a = 'A';
布尔型:

boolean型只有两个值,true(正确/真)和false(错误/假);一般用boolean来做判断或者接收判断结果;     

声明一个boolean型变量:
boolean flag = true;
boolean boo = false;

引用数据类型(Reference Type)

具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象。       

// 定义一个类TestDemo:
public class TestDemo{

}
接口 interface

接口可以理解为:定义了一系列规范,在编写程序的时候“必须”遵循接口所规定的所有要求。

// 定义一个接口TestInterface:
public interface TestInterface{

}
 数组 Array []

用于储存多个相同类型数据的集合。       

// 定义一个int型的数组:给定值“0,1,2”
int[] array = {0,1,2};
字符串 String ""
  • Java中也有字符串类型,而且与C/C++一样都是String,只不过在Java中String(字符串类型)是作为一个类来实现的,也就是说,Java中String类型是属于引用类型的,属于类。
  • 不过String类型在使用时并没那么麻烦,String在声明赋值时与char不同,因为是字符串,所以要带双引号。    
// 声明一个String型变量:
String str = "Hello";
总结

可以这样理解:只要不是基本数据类型的八种,以外的都是属于引用数据类型的。

常用的进制

日常生活中都是 十进制; 计算机使用的语言是二进制的,
有哪些: 二进制、八进制、十进制、16进制:

正式进制转换为二进制的方法

十进制45 转换为 二进制的结果是:
// 任何数*的0次方*都等于1
=> 28次方 ---------------------------  20次方
=> 2^8 + 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1
=> 128 64 32 16 8 4 2 1
/**
*找比45小的相近权重32, 再相减得13, 再次找比13小的相近权重8,
*再相减得5, 再次找比5小的相近权重4, 再相减得1, 再次找比1小的相近权重1, 再相减得0,就完了
*/

// 有权重的就为1,没有的为0
=> 128   64   32   16   8    4    2    1
=>  0    0    1    0    1    1    0    1
得到的值是010 1101

正二进制转为十进制的方式

二进制 0010 1101 转为十进制的结果是: 45
=> 0*2^7 + 0*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 0*2^1 + 0*2^0
=> 27次方 -------------------------------------------  20次方

=> 对应二进制的 0010 1101
=> 0        0       1       0      1        1       0       1
=> 0        0       32      0      8        4       0       1
=>  32 + 8 + 4 + 1 = 45

面试题

1. Java语言的主要版本有? [多选题]

A、Java SE
B、Java ME
C、Java HE
D、Java EE

正确答案是:ABD

具体解析如下:

  • Java SE(Java Platform, Standard Edition)称之为“Java 平台标> 准版”。
  • Java EE(Java Platform,Enterprise Edition)称之为“Java 平台企业版”。
  • Java ME (Java Platform,Micro Edition)称之为 Java 平台微型版。

2. 下面关于标识符命名法则正确的是 [多选题]

A、标识符名称可以由数字、字母、下划线以及美元符号任意组合。
B、标识符名称区分大小写,长度有限制。
C、标识符名称中不可以使用数字开头。
D、标识符名称可以支持中文,只是通常不使用。

正确答案是:CD

具体解析如下:

  • 标识符名称中数字不允许开头,主要是为了与特殊直接量进行区分。
  • 标识符名称的长度没有限制,但是不宜过长,否则给使用带来了灾难。

3. 属于Java语言中基本数据类型的类型有 [多选题]

A、int
B、Long
C、String
D、double

正确答案是:AD

具体解析如下:

  • Long 是基本数据类型 long 类型的包装类,所以注意区分大小写哦。
  • String 是 Java 官方提供的核心类,属于引用数据类型的一种。

4. 关于类型转换下列说法正确的是 [多选题]

A、自动类型转换就是指从小类型到大类型的转换。
B、自动类型转换就是指从大类型到小类型的转换。
C、强制类型转换就是指从大类型到小类型的转换。
D、强制类型转换就是指从小类型到大类型的转换。

正确答案是:AC

具体解析如下:

  • 从小类型到大类型的转换可以存放的下,因此叫做自动类型转换。
  • 从大类型到小类型的转换不可以存放的下,因此需要强制类型转换。

5. 下列运算符中属于关系运算符的有 [多选题]

A、>>
B、>
C、=
D、!=

正确答案是:BD

具体解析如下:

  • ( > ) 表示是否大于运算符
  • ( >= ) 表示是否大于等于运算符
  • ( < ) 表示是否小于运算符
  • ( <= ) 表示是否小于等于运算符
  • ( == ) 表示是否等于运算符
  • ( != ) 表示是否不等于运算符

6. 布尔类型变量初始化的方式可以是 [多选题]

A、boolean b1 = true;
B、boolean b1 = 1;
C、boolean b1 = ‘真’;
D、boolean b1 = (2 > 3);

正确答案是:AD

具体解析如下:

  • boolean 类型变量的数值只能是:true 和 false。

7. 下列代码的执行结果是? [单选题]

int ia = 5;
System.out.println(ia++ + ++ia);

A、11
B、10
C、12
D、13

正确答案是:C

具体解析如下:

  • ia++这个表达式是后++,因此表达式的结果为 5,但是 ia 变量已经变成了 6。
  • 而++ia 这个表达式是前++,因此先++再作为表达式的结果,所以表达式结果是 7。
  • 两个表达式进行加法运算的最终结果为: 5 + 7 = 12。

8. 关于for循环的下列说法中正确的是 [多选题]

A、for循环的循环体中可以使用大括号包含多条语句。
B、break关键字不能用于for循环的跳出功能。
C、for循环只能用于明确循环次数的场合中。
D、for循环是判断条件成立后执行循环体。

正确答案是:AD

具体解析如下:

  • break 关键字可以跳出 switch-case 分支结构和循环结构。
  • for 循环更适合于明确循环次数的场合,不是只能用于该场合中。

9. switch结构中不支持的数据类型有 [多选题]

A、int。
B、boolean。
C、double。
D、String。

正确答案是:BC

具体解析如下:

  • switch()中支持的数据类型有:byte,short,char 以及 int 类型,从 jdk1.5开始支持枚举类型,从 jdk1.7 开始支持 String 类型。

10. 下列程序输出的结果是[单选题]

int i = 5;
while( i > 0 ) {
   i = i + 1;
   if ( 5 == i ) {
      break;
   }
}

A、while循环执行10次。
B、死循环。
C、循环一次都不执行。
D、循环执行一次。

正确答案是:B

具体解析如下:

  • 进入循环体后先执行了 i=i+1,因此 i 的数值变成了 6,所以 5==i 这个条件没有机会成立。

11. 下列程序的运行结果 [单选题]

int i=3;
switch (i) {
    default: System.out.println("default");
    case 0: System.out.println("zero"); break;
    case 1: System.out.println("one"); break;
    case 2: System.out.println("two"); break;
}

A、default。
B、zero。
C、default zero。
D、two。

正确答案是:C

具体解析如下:

  • 由于 i 的数值不匹配任意的 case 分支,因此执行 default 语句,但是 default 语句后没有break 关键字因此进行了 case 穿透,执行了 case 0 后面的语句,直到 break 跳出该结构。

12. 关于数组的说法中正确的是[多选题]

A、数组中的元素类型可以不同。
B、数组的长度不可以发生改变。
C、数组的指向可以发生改变。
D、数组的内存空间必须连续。

正确答案是:BCD

具体解析如下:

  • 当需要在 Java 程序中记录多个类型相同的数据内容时,则声明一个一维数组即可。一维数组本质上就是在内存空间中申请一段连续的存储单元。数组是相同数据类型的多个元素的容器。

13. 下列能够对数组正确声明或初始化的是[单选题]

A、int[] arr;
B、arr = {10, 20, 30, 40, 50};
C、int[] arr = new int[5];
D、int[] arr = new int[5]{10, 20, 30, 40, 50};

正确答案是:C

具体解析如下:

  • 数据类型[] 数组名称 = new 数据类型[数组的长度];
  • 数据类型[] 数组名称 = {初始值 1, 初始值 2, ...};
  • 选项 D 的[]中不能指定长度。

14. 数组工具类中的方法描述正确的是 [多选题]

A、sort方法可以实现数组中元素的从大到小排序。
B、toString方法可以实现数组中元素的遍历。
C、binarySearch方法可以实现数组中元素的查找。
D、fill方法可以实现对数组中元素的赋值。

正确答案是:BCD

具体解析如下:

  • static void sort(int[] a) 对数组中的元素进行从小到大排序。