javaSE基础

一、Java基础

1、Java基础部分(基本语法、Java特性等)

2、关键字

3、面向对象

4、集合部分

 

 

二、Java高级知识

1、线程

2、锁

3、JDK

4、反射

5、JVM

 

 

三、JVM分区

1、GC

2、IO和NIO、AIO

 

 

 

 

 

 

一、Java基础

1Java基础部分(基本语法、Java特性等)

 

https://blog.youkuaiyun.com/weixin_43495390/article/details/86533482

1.JAVA中的几种基本类型,各占用多少字节?

 

 

 

 

 

QJava支持的数据类型有哪些?什么是自动拆装箱?

 

 

 

 

QintInetger的区别

https://blog.youkuaiyun.com/qq_17021569/article/details/102895843

 

附:

https://www.cnblogs.com/chuzihang/p/8026427.html

附end

 

 

 

 

Q:十进制的数在内存中是怎么存储的?

解:

补码的形式。

原反补码:

正数的原反补一样

负数的反码是将原码除了符号位的其余位取反,补码是给反码加1.

例:

原码: 1 0110100

反码: 1 1001011

补码: 1 1001100

 

 

 

 

Q:为什么会出现4.0-3.6=0.40000001这种现象?

解:

 

 

 

 

2.String能被继承吗?为什么?

不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。

平常我们定义的String str=”a”;其实和String str=new String(“a”)还是有差异的。

前者默认调用的是String.valueOf来返回String实例对象,至于调用哪个则取决于你的赋值,比如String num=1,调用的是

后者则是调用如下部分:

最后我们的变量都存储在一个char数组中

 

 

 

 

3.String,Stringbuffer,StringBuilder 的区别。

 

 

 

 

 

Q:Java是如何支持正则表达式操作的

解:

 

 

 

 

Qjavaphp的区别

解:

 

 

 

 

Q:在Java中,如何跳出当前的多重嵌套循环

解:

方法一:标号方式 1 1 1 2 1 3 1 4 2 1 2 2 2 3 Breaking Done

方法二:条件控制 1 1 1 2 1 3 1 4 2 1 2 2 2 3 Breaking Done

方法二变形:条件控制 1 1 1 2 1 3 1 4 2 1 2 2 2 3 Breaking Done

方法三:抛出异常 1 1 1 2 1 3 1 4 2 1 2 2 2 3 Breaking

 

 

 

 

Q==equals的区别

 

 

 

 

Q31static

 

 

 

 

Q:"static"关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

 

 

 

 

 

 

Q:是否可以在static环境中访问非static变量?

 

 

 

 

 

Q:执行如下程序代码

char chr = 127;

int sum = 200;

chr += 1;

sum += chr;

后,sum的值是   ; (     )

备注:同时考虑c/c++和Java的情况的话

 

这里涉及了原码,反码,补码问题,见下

https://www.douban.com/note/736285765/

 

 

 

 

 

 

 

 

 

2、关键字

2、介绍一下volatile

解:

 

 

 

 

 

 

 

 

 

 

3、面向对象

QJava中类和对象的区别,如何定义类和对象?

解:

类就好比是一个模具,而对象就是用这个模具刻出来的产品,什么样的模具出来什么样的产品,同样的,什么样的类实例化出来什么样的对象。可以说,类是对具有同样性质的一类对象的抽象说明,比如小明,小红等具体的人是对象,而人这个概念就是他们对应的类,人这个类里面具有人这个概念的一般性质(如姓名、身高、性别等等),而具体的每一个人对每个性质可能有不同的具体值(如小明的姓名属性是小明,小红的姓名属性是小红)。类是抽象出来的概念,对象是这个抽象说明的类的一个具体情况。定义类需要使用class关键字来定义,如class people{};定义对象需要使用这个对象所属的类并用new关键字来实例化,如 new people();(当然,java实例化对象还有更深的反射实例化方法)。

 

 

 

 

Q:JAVA对象实例化过程

 

 

 

 

5.讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序。

此题考察的是类加载器实例化时进行的操作步骤(加载–>连接->初始化)。

父类静态变量、

父类静态代码块、

子类静态变量、

子类静态代码块、

父类非静态变量(父类实例成员变量)、

父类构造函数、

子类非静态变量(子类实例成员变量)、

子类构造函数。

 

测试demo

深入理解Java类实例化时jvm执行顺序

https://blog.youkuaiyun.com/u014042066/article/details/77574956

输出

 

 

 

 

Q(重点)

 

解:

 

 

 

 

 

 

 

QJava中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?

 

java中的默认构造函数

java中如果在一个类中没有写明任何构造函数的,那么会存在一个无参的构造函数,如下:

以上代码等同于下面:

但如果写明了一个有参的构造函数,那么无参的构造函数就不复存在了

 

 

 

 

Q:构造方法

解:

java的构造方法

构造方法作用: 是定义在java类中的一个用来初始化对象的方法,用new+构造方法,创建一个新的对象,并可以给对象中的实例进行赋值。

语法规则:

1.方法名必须与类名相同

2.无返回值类型,也不能用void修饰(有任何返回值类型的方法都不是构造方法)

3.可以指定参数,也可以不指定参数;分为有参构造方法和无参构造方法

 

 

 

 

QJava中的方法覆盖(Overriding)和方法重载(Overload)是什么意思?

 

 

 

 

8.(重点)抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。

1、抽象类和接口都不能直接实例化(即不能使用new关键字来实例化对象)。如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类要被子类继承,接口要被类实现。

3、接口中只能做方法申明,抽象类中可以做方法申明,也可以做方法实现

4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类(如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则就是抽象类

注:

5.1 第二点. 接口中,在jdk1.8之后可以用staticdefault去修饰方法并且实现,此时实现接口的子类可以调用default修饰的方法,接口名调用被static修饰的静态方法(default只能用于接口或者switch case上);而抽象类可以实现部分方法。  jdk1.8之前好像接口中的方法只能被public abstract修饰

//没验证

注end

6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。

7、抽象类里可以没有抽象方法

8、如果一个类里有抽象方法,那么这个类只能是抽象类

9、抽象方法要被实现,所以不能是静态的,也不能是私有的。

10、接口可继承接口,并可多继承接口,但类只能单根继承(一个类只能继承一个类)。

 

 

重点:从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范

 

 

 

 

QJava支持多继承么?

java只支持单继承,这是由于安全性的考虑,如果子类继承的多个父类里面有相同的方法或者属性,子类将不知道具体要继承哪个,而接口可以多实现,是因为接口只定义方法,而没有具体的逻辑实现,多实现也要重新实现方法。

 

 

 

 

Q:java多态

Java实现多态有三个必要条件:继承、重写、向上转型。

A.必须有子类和父类,具有继承或实现(继承)

B.子类必须重写父类的方法(重写)

C.父类的引用变量指向子类的对象(向上转型) eg:Animal A = new Cat();        A.eat()

 

 

 

 

Q:java面向对象的特性

解:封装、继承、多态、抽象

封装:

1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。

2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。

3.封装的基本要求是:把所有的属性私有化,对每个属性提供getter和setter方法,如果有一个带参的构造函数的话,那一定要写一个不带参的构造函数。在开发的时候经常要对已经编写的类进行测试,所以在有的时候还有重写toString方法,但这不是必须的。

 

 

 

 

 

15.final 的用途

类、方法、变量

final 修饰的类叫最终类,该类不能被继承。

final 修饰的方法不能被重写。

final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

 

 

 

 

18.请结合 OO 设计理念,谈谈访问修饰符publicprivateprotecteddefault 在应用设计中的作用。

类中的数据成员和成员函数据具有的访问权限包括:public、private、protect、default(包访问权限)

作用域                当前类        同一package        子孙类        其他package

public           √            √                          √          √

protected         √              √                      √          ×

default             √          √                     ×           ×

private             √          ×                     ×           ×

 

public                所有类可见

protected               本包和所有子类都可见(本包中的子类非子类均可访问,不同包中的子类可以访问,不是子类不能访问)

default              本包可见(即默认的形式)(本包中的子类非子类均可访问,不同包中的类及子类均不能访问)

priavte              本类可见

 

public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。

private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。

protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。

default:即不加任何访问修饰符,通常称为"默认访问模式"。该模式下,只允许在同一个包中进行访问

 

 

 

 

Q.Java异常解析(error exception 的区别,CheckedExceptionRuntimeException 的区别)

https://blog.youkuaiyun.com/java_cxrs/article/details/91661623

 

Error:是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。

Exception::程序本身可以捕获并且可以处理的异常。

运行时异常(不受检异常):RuntimeException类极其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常,比如用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。

非运行时异常(受检异常):Exception中除RuntimeException极其子类之外的异常。编译器会检查此类异常,如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。

 

 

Q:Java中Exception和Error有什么区别?

 

 

 

 

Q:throw和throws有什么区别?

    五、编程习惯:

在写程序时,对可能会出现异常的部分通常要用try{…}catch{…}去捕捉它并对它进行处理;

用try{…}catch{…}捕捉了异常之后一定要对在catch{…}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();

如果是捕捉IO输入输出流中的异常,一定要在try{…}catch{…}后加finally{…}把输入输出流关闭;

如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。

 

 

 

 

 

 

 

4、集合部分

Q:Java集合类框架的基本接口有哪些?

 

 

 

 

 

 

Q:如何权衡是使用无序的数组还是有序的数组?

 

 

 

 

Q:数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList

 

 

Array 即数组,声明方式可以如下:

定义一个 Array 时,必须指定数组的数据类型及数组长度,即数组中存放的元素个数固定并且类型相同。

 

ArrayList 是动态数组,长度动态可变,会自动扩容。不使用泛型的时候,可以添加不同类型元素。

 

 

 

 

4.ArrayList LinkedList 有什么区别。

共性:ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同。

区别:List接口的实现方式不同

ArrayList实现了List接口,以数组的方式来实现的,因此对于快速的随机取得对象的需求,使用ArrayList实现执行效率上会比较好。

LinkedList是采用链表的方式来实现List接口的,因此在进行insert和remove动作时效率要比ArrayList高。适合用来实现Stack(堆栈)与Queue(队列)。

 

 

 

 

 

Q:什么是迭代器(Iterator)

 

 

 

 

 

 

Q:IteratorListIterator的区别是什么?

 

 

 

 

 

 

 

Q:快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

 

注:

快速失败出现的场景

注end

 

 

 

 

 

QQuery接口中list()方法与iterate()方法的区别

解:

list方法返回的是结果集的list集合,iterate返回的是iterator迭代器。

list方法查询所有记录只发送一条sql语句,select * from 表名

iterate方法查询所有记录的话,先查询到满足条件的所有记录id,并不立即查询所有结果,当我们有用到某个记录的话,他才查询。如果显示所有记录的话需要n+1条sql语句。第一条查id,接下去根据id,一条一条查询,所以是n+1条。

list方法缓存中有记录了,他还是会发生sql语句到数据库中查询。

iterate方法缓存中有记录了,他只发送一条查符合条件的id的sql语句。

先看看list方法。

结果

 

 iterate()方法

结果

 

解2:

 

 

 

 

 

QJava中的HashMap的工作原理是什么?

 

 

插曲0

插曲0end

 

插曲0.1

https://blog.youkuaiyun.com/tuke_tuke/article/details/51588156

java中hashmap底层源码实现原理分析

插曲0.1end

 

插曲0.2

put方法

看似要比 1.7 的复杂,我们一步步拆解:

1 判断当前桶是否为空,空的就需要初始化(resize 中会判断是否进行初始化)。

2 根据当前 key 的 hashcode 定位到具体的桶中并判断是否为空,为空表明没有 Hash 冲突就直接 在当前位置创建一个新桶即可。

3 如果当前桶有值( Hash 冲突),那么就要比较当前桶中的 key、key 的 hashcode 与写入的 key 是否相等,相等就赋值给 e,在第 8 步的时候会统一进行赋值及返回。

4 如果当前桶为红黑树,那就要按照红黑树的方式写入数据。

5 如果是个链表,就需要将当前的 key、value 封装成一个新节点写入到当前桶的后面(形成链表)。

6 接着判断当前链表的大小是否大于预设的阈值,大于时就要转换为红黑树。

7 如果在遍历过程中找到 key 相同时直接退出遍历。

8 如果 e != null 就相当于存在相同的 key,那就需要将值覆盖。

9 最后判断是否需要进行扩容。

插曲0.2end

 

插曲1

插曲1end

 

插曲2

 

插曲2end

 

 

 

 

Q:hashCode()和equals()方法的重要性体现在什么地方?

 

 

 

 

 

QHashMap存自定义对象为什么要重写 hashcode equals 方法?

Q2:如果hashMapKey是一个自定义的类,怎么办?

解:

 

 

 

 

QHashMapHashtable有什么区别?

 

 

 

 

 

 

QConcurrentHashMap的认识

 

 

 

 

Q:ConcurrentHashMapjdk1.7jdk1.8中的不同

https://blog.youkuaiyun.com/qq_41884976/article/details/89532816

注:写的不错

 

注:此处涉及了CAS算法

前言

CAS,即 Compare And Swap(比较与交换),是一种无锁算法,基于硬件原语实现,能够在不使用锁的情况下实现多线程之间的变量同步。jdk中的java.util.concurrent.atomic包中的原子类就是通过CAS来实现了乐观锁。

CAS算法过程

算法涉及到三个操作数:

需要读写的内存位置V

需要进行比较的预期值A

需要写入的新值U

CAS算法解析:

CAS具体执行时,当且仅当预期值A符合内存地址V中存储的值时,就用新值U替换掉旧值,并写入到内存地址V中。否则不做更新。

CAS算法的运行原理如下如所示:

注end

 

 

 

 

 

7.有没有有顺序的 Map 实现类, 如果有, 他们是怎么保证有序的。

TreeMapLinkedHashMap是有序的(TreeMap默认升序,LinkedHashMap则记录了插入顺序)

TreeMap是基于比较器Comparator来实现有序的。

LinkedHashmap是基于链表来实现数据插入有序的。

 

 

默认情况下,LinkedHashMap是按照插入顺序的,我们举个例子

输出

键是按照:"c","d","a"的顺序插入的,修改d不会修改顺序,输出为:

 

 

 

 

Q:Comparable和Comparator接口是干什么的?列出它们的区别。

 

 

 

 

QMap的实现类中,哪些是有序的,哪些是无序的,如何保证其有序性

Map 的实现类有 HashMap、LinkedHashMap、TreeMap

HashMap是有无序的

LinkedHashMap 和 TreeMap 是有序的。LinkedHashMap 记录了添加数据的顺序;TreeMap 默认是升序

LinkedHashMap 底层存储结构是哈希表+链表,链表记录了添加数据的顺序

TreeMap 底层存储结构是二叉树,二叉树的中序遍历保证了数据的有序性

下面这篇文章说了HashMapLinkedHashMapTreeMap之间的区别

https://www.cnblogs.com/coder-lzh/p/10819627.html

 

 

 

 

 

 

 

二、Java高级知识

 

1、线程

Q:进程和线程的区别是什么?

 

对于这种题目,专业术语不好理解,采用形象一点的比喻更好,比如(取自知乎):

开个QQ,开了一个进程;开了迅雷,开了一个进程。

在QQ的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。

所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成QQ

的运行,那么这“多个工作”分别有一个线程。

所以一个进程管着多个线程。

通俗的讲:“进程是爹妈,管着众多的线程儿子”...

 

 

 

 

 

 

Q:概括的解释下线程的几种可用状态。

 

 

 

 

 

 

Q:创建线程有几种不同的方式?你喜欢哪一种?为什么?

 

 

 

 

 

Q:多线程同步的5种方法

https://www.cnblogs.com/xiaoxi/p/7679470.html

 

 

 

 

 

Q:简述一下wait()方法

 

 

 

 

 

Q:线程池的4中创建方法

1

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

 

2

 

 

 

 

 

 

Q:线程池优点

1

a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。

b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。

c. 提供定时执行、定期执行、单线程、并发数控制等功能。

 

2

降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

提高响应速度:当任务到达时,可以不需要等待线程创建就能立即执行。

提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,监控和调优。

 

 

 

 

 

Q:介绍一下生产者消费者模式

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2、锁

Q:什么是死锁(deadlock)

 

 

 

 

 

QSynchronizedlock的区别

 

 

 

 

 

 

 

 

 

 

3JDK

29. JDK 和 JRE 有什么区别?

JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。

JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

 

 

 

QJDKJRE的区别是什么?

JRE: Java Runtime Environment

JDK:Java Development Kit

JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。

JRE根据不同操作系统(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本

再说说java的跨平台吧:

  java源程序先经过javac编译器编译成二进制的.class字节码文件(java的跨平台指的就是.class字节码文件的跨平台,.class字节码文件是与平台无关的),.class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,所以java所谓的跨平台就是在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行

 

最后解释下机器码和字节码的区别:

 一,机器码,完全依附硬件而存在~并且不同硬件由于内嵌指令集不同,即使相同的0 1代码

意思也可能是不同的~换句话说,根本不存在跨平台性~比如~不同型号的CPU,你给他个指令10001101,他们可能会解析为不同的结果~

二,我们知道JAVA是跨平台的,为什么呢?因为他有一个jvm,不论那种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~~~~至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~~~

 

 

 

 

 

4、反射

 

 

5JVM

Q:java虚拟机(JVM

https://www.cnblogs.com/jueyoq/p/7857033.html

 

 

https://www.zhihu.com/question/264786567

 

 

https://blog.youkuaiyun.com/qq_41212104/article/details/80723644

JVM究竟是什么?

JVM,Java Virtual Machine,中文就是Java虚拟机了, 和名字一样就是个虚拟机器,来模拟通用的计算机,有着一套虚拟的完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。 JVM是一种规定好的标准规范, 定义了.class文件在其内部运行的相关标准和规范。一般来讲,所有的JVM都是基于栈结构的运行方式。那么不符合这种要求的,不算是JVM, 如Android中所使用的Dalvik 虚拟机就不能称作是JAVA 虚拟机, 因为它是基于寄存器(最新的Android系统据说已经放弃了Dalvik VM, 而是使用ART)。

JVM相关实现的产品有很多, 通常最有名最常用的就是现在Oracle公司所有的HotSpot 虚拟机。

 

Java语言与 JVM之间的关系

Java程式可以跨平台,这是你在许多书或文件早就看过的描述,但是跨平台是怎麽一回事?在这之前,你得先了解跨平台是怎麽一回事。

其实对于电脑而言,它只认识一种语言,也就是0101序列所组合而成的指令。当你使用的是C/C++等之类的高阶语言编写代码时,其实这些语言,都是比较贴近人类语言的语法,不过大部门都是英语语义,对我们来说还是不够亲切,这都是很多小白入门学习的障碍了。这是为了方便人类阅读及编写,计算机也看不懂C/C++这类语言。

你要有个「翻译员」将你写的C/C++代码,翻译为电脑看得懂的0101序列指令,这个翻译员就是所谓的「编译器」(Compiler):

问题在于,每个平台所认识的0101序列并不一样。在Windows上也许某个指令是0101,在Linux下也许是1010,因此不同的平台必须使用不同的编译器来编译你的代码,而在Windows平台上编译好的程序,也不能直接拿到Linux等其它平台上执行,而必须经过重新编译的动作,让编译器将你的程式编译为该平台可以执行的指令。

由于每个平台的特性不同,可引用的函数程序库(Library)不同,也许你的代码还得作修改,才可以在另一个平台上编译执行。这很不方便,就是说如果你在Windows设计了一款游戏,想要卖给Linux的使用者,就得再花费一些功夫。这也是为什么大部分游戏或者软件只能在Windows运行了。

 

Java 也是个高阶语言,要让电脑执行你编写的应用程序,也是得借助编译器的翻译。不过,Java编译时,并不直接翻译为相依于某平台的0101指令,而是翻译为中介格式的位元码(byte code)。Java 的原始码文件格式名为*.java,经过编译器翻译过后,会变成*.class的格式文件位元码。如

果想要执行这个位元码档案,目标平台上必须安装有JVM(Java Virtual Machine)。JVM会将位元码翻译为相应平台支持的语言。

 

不同的平台必须安装该平台相对应的JVM。这就好比你讲中文(*.java),Java编译器帮你翻译为英文(*.class)。之后该英文文件,到当地之后,再由当地看得懂英文的人翻译为当地的方言。

所以JVM所担任的职责之一,就是当地的翻译员,将位元码文件翻译为当时作业系统看得懂的0101序列。不过这不是最重要的,基本上如果只是要翻译员的话,直译器(Interpreter )就办得到了。

JVM有个很重要的观念就是:「对于Java程式而言,其实它只认识一种作业系统(或说是一种机器),这个系统叫作JVM,而对于JVM而言,位元码文件就是它的可执行文件!也就是格式为.class的文件。Java代码程序,理想上,并不用理会真正执行于哪个平台之上,它只要知道如何执行于JVM之上就可以了,至于JVM实际上如何与底层平台作沟通,则是JVM自己的事!」这个观念非常的重要,对于以后能够搞清楚所PATH变量与CLASSPATH变量的概念,也有一定的帮助。

 

我们.class叫做字节码文件

 

 

 

 

Q:什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

 

 

 

三、JVM分区

1GC

 

 

 

 

 

 

 

 

 

2IONIOAIO

Q30:什么是java序列化,如何实现java序列化

简要解释:

  序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。

  序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

 

详细解释:

      当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

  只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

 

1.概念

  序列化:把Java对象转换为字节序列的过程。

  反序列化:把字节序列恢复为Java对象的过程。

 

2.用途

  对象的序列化主要有两种用途:

  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

  2) 在网络上传送对象的字节序列。

 

 

3.对象序列化

序列化API

  java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。只有实现了Serializable和Externalizable接口的类的对象才能被序列化。

  java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

 

代码示例

 

 

4.说明

  读取对象的顺序与写入时的顺序要一致。

  对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。

 

 

 

 

IO流简介:

 

流的定义:流是指一连串流动的字符,是以先进先出方式发送信息的通道。

按流向分:输出流:OutputStream和Writer为基类

                输入流:InputStream和Reader为基类

 

按处理数据单元划分:字节流:字节输入流:InputStream基类

                                                字节输出流:OutputStream基类

                                  字符流:字符输入流:Reader基类

                                   字节输出流:Writer基类

(字节流是 8 位通用字节流,字符流是16位Unicode字符流)

 

 

 

 

QBufferedInputStreamFileInputStream的区别

BufferedInputStream是带缓冲区的输入流,默认缓冲区大小是8M,能够减少访问磁盘的次数,提高文件读取性能;BufferedOutputStream是带缓冲区的输出流,能够提高文件的写入效率。BufferedInputStream与BufferedOutputStream分别是FilterInputStream类和FilterOutputStream类的子类,实现了装饰设计模式。当传输的文件特别大的时候,BufferInputStream的优点就体现出来了 不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!这就是两者的区别

 

 

 

 

QBufferedReaderInputStreamReader

 

知识点1

BufferedReader

 

 

知识点2

InputStreamReader

 

1)字节流到字符流的桥梁怎么理解?

    1、计算机存储的单位是字节,如尽管txt文本中有中文汉字这样的字符,但是对计算机而言,其是字节形式存在的

    2、字节流读取是单字节读取,但是不同字符集解码成字符需要不同个个数,因此字节流读取会报错

   3、 那么就需要一个流把字节流读取的字节进行缓冲而后在通过字符集解码成字符返回,因而形式上看是字符流

    4、InputStreamReader流就是起这个作用,实现从字节流到字符流的转换

 

知识点3

我们把system.in这个字节流通过转换流(InputStreamReader)转换成字符流,再通过BufferedReader包装成为字符缓冲输入流

真正底层读数据还是这个字节流(system.in)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值