https://blog.csdn.net/weixin_43495390/article/details/86533482
1.JAVA中的几种基本类型,各占用多少字节?
Q:Java支持的数据类型有哪些?什么是自动拆装箱?
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集合类框架的基本接口有哪些?
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:Iterator和ListIterator的区别是什么?
Q:Java中的HashMap的工作原理是什么?
Q:HashMap和Hashtable有什么区别?
Q:java虚拟机(JVM)
https://www.cnblogs.com/jueyoq/p/7857033.html
https://www.zhihu.com/question/264786567
https://blog.csdn.net/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被称作是“平台无关的编程语言”?
5.讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序。
此题考察的是类加载器实例化时进行的操作步骤(加载–>连接->初始化)。
父类静态变量、
父类静态代码块、
子类静态变量、
子类静态代码块、
父类非静态变量(父类实例成员变量)、
父类构造函数、
子类非静态变量(子类实例成员变量)、
子类构造函数。
测试demo
深入理解Java类实例化时jvm执行顺序
https://blog.csdn.net/u014042066/article/details/77574956
输出
Q(重点)
解:
Q:Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
java中的默认构造函数
java中如果在一个类中没有写明任何构造函数的,那么会存在一个无参的构造函数,如下:
以上代码等同于下面:
但如果写明了一个有参的构造函数,那么无参的构造函数就不复存在了
Q:Java中的方法覆盖(Overriding)和方法重载(Overload)是什么意思?
7.有没有有顺序的 Map 实现类, 如果有, 他们是怎么保证有序的。
TreeMap和LinkedHashMap是有序的(TreeMap默认升序,LinkedHashMap则记录了插入顺序)
TreeMap是基于比较器Comparator来实现有序的。
LinkedHashmap是基于链表来实现数据插入有序的。
默认情况下,LinkedHashMap是按照插入顺序的,我们举个例子
输出
键是按照:"c","d","a"的顺序插入的,修改d不会修改顺序,输出为:
Q:Map的实现类中,哪些是有序的,哪些是无序的,如何保证其有序性
Map 的实现类有 HashMap、LinkedHashMap、TreeMap
HashMap是有无序的
LinkedHashMap 和 TreeMap 是有序的。LinkedHashMap 记录了添加数据的顺序;TreeMap 默认是升序
LinkedHashMap 底层存储结构是哈希表+链表,链表记录了添加数据的顺序
TreeMap 底层存储结构是二叉树,二叉树的中序遍历保证了数据的有序性
下面这篇文章说了HashMap、LinkedHashMap和TreeMap之间的区别
https://www.cnblogs.com/coder-lzh/p/10819627.html
8.抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。
1、抽象类和接口都不能直接实例化(即不能使用new关键字来实例化对象)。如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类(如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则就是抽象类)
6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
7、抽象类里可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承(一个类只能继承一个类)。
重点:从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
Q:Java支持多继承么?
java只支持单继承,这是由于安全性的考虑,如果子类继承的多个父类里面有相同的方法或者属性,子类将不知道具体要继承哪个,而接口可以多实现,是因为接口只定义方法,而没有具体的逻辑实现,多实现也要重新实现方法。
15.final 的用途
类、方法、变量
final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
18.请结合 OO 设计理念,谈谈访问修饰符public、private、protected、default 在应用设计中的作用。
类中的数据成员和成员函数据具有的访问权限包括: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 的区别,CheckedException,RuntimeException 的区别)
https://blog.csdn.net/java_cxrs/article/details/91661623
Error:是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。
Exception::程序本身可以捕获并且可以处理的异常。
运行时异常(不受检异常):RuntimeException类极其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常,比如用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。
非运行时异常(受检异常):Exception中除RuntimeException极其子类之外的异常。编译器会检查此类异常,如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。
29. JDK 和 JRE 有什么区别?
JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。
Q:JDK和JRE的区别是什么?
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搞定,他会把字节码再翻译成所在机器认识的机器码~~~
Q:==和equals的区别
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.说明
读取对象的顺序与写入时的顺序要一致。
对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。
Q31:static
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/
Q:进程和线程的区别是什么?
对于这种题目,专业术语不好理解,采用形象一点的比喻更好,比如(取自知乎):
开个QQ,开了一个进程;开了迅雷,开了一个进程。
在QQ的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。
所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成QQ
的运行,那么这“多个工作”分别有一个线程。
所以一个进程管着多个线程。
通俗的讲:“进程是爹妈,管着众多的线程儿子”...
Q:概括的解释下线程的几种可用状态。
Q:创建线程有几种不同的方式?你喜欢哪一种?为什么?
Q:什么是死锁(deadlock)?
Q:Comparable和Comparator接口是干什么的?列出它们的区别。
Q:Java中Exception和Error有什么区别?
Q:throw和throws有什么区别?
五、编程习惯:
在写程序时,对可能会出现异常的部分通常要用try{…}catch{…}去捕捉它并对它进行处理;
用try{…}catch{…}捕捉了异常之后一定要对在catch{…}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();
如果是捕捉IO输入输出流中的异常,一定要在try{…}catch{…}后加finally{…}把输入输出流关闭;
如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。