Java寒假作业——问答题
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
Java寒假作业
一、问答题1-25题
1 JDK与JRE的区别是什么它们各自有什么作用
JDK: java development kit JAVA开发工具
JRE: java runtime environment 运行时环境
JDK里面是包含JRE的所以JRE与JDK是从属关系。
如果你需要运行java程序只需安装JRE就可以了。如果你需要编写java程序需要安装JDK。JDK是Java的开发工具它不仅提供了Java程序运行所需的JRE还提供了一系列的编译运行等工具如javacjavajavaw等。JRE只是Java程序的运行环境它最核心的内容就是JVMJava虚拟机及核心类库。
JDK主要包含三部分
第一部分就是Java运行时环境JVM。
第二部分就是Java的基础类库这个类库的数量还是非常可观的。
第三部分就是Java的开发工具它们都是辅助你更好的使用Java的利器。
2 环境变量PATH的作用是什么
PATH环境变量。作用是指定命令搜索路径在命令行下面执行命令如javac编译java程序时它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin目录增加到现有的PATH变量中bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待设置好PATH变量后就可以在任何目录下执行javac/java等工具了。
3 环境变量CLASSPATH的作用是什么
CLASSPATH环境变量。作用是指定类搜索路径要使用已经编写好的类前提当然是能够找到它们了JVM就是通过CLASSPTH来寻找类的。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中当然当前目录“.”也必须加入到该变量中。
4 什么是JVM其工作原理是什么样的
JVM是Java Virtual Machine(Java虚拟机的缩写JVM是一种用于计算设备的规范它是一个虚构出来的计算机是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语句的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行至少需要编译成不同的目标代码。而引入Java语言虚拟机后Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息使用Java语言编译程序只需要生成在Java虚拟机上运行的目标代码字节码。就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时把字节码解析成具体平台上的机器指令执行。这就是Java的能够“一次编译到处运行"的原因。常用的虚拟机有VMWare,Virtual Box,Java Virtual Machine
Java源文件在通过编译器后被编译成相应的 .Class 文件字节码文件.Class 文件又被JVM中的解释器编译成机器码在不同的操作系统Windows、Linux、Mac上运行。每种操作系统的解释器是不同的但基于解释器实现的虚拟机是相同的这也是Java能够跨平台的原因。
5 如何理解Java中的装箱和拆箱
Java为每种基本数据类型都提供了对应的包装器类型
装箱
在Java SE5之前如果要生成一个数值为10的Integer对象必须这样进行
Integer i = new Integer(10);
而在从Java SE5开始就提供了自动装箱的特性如果要生成一个数值为10的Integer对象只需要这样就可以了
Integer i = 10;
这个过程中会自动根据数值创建对应的 Integer对象这就是装箱。
拆箱
跟装箱对应就是自动将包装器类型转换为基本数据类型
Integer i = 10; //装箱 int n = i; //拆箱
简单一点说Java中的装箱和拆箱指的是基本数据类型和包装类型的自动相互的转换。
装箱: 基本数据类型>包装类型 拆箱: 包装类型>基本数据类型
6 Java中equals方法和==的区别是什么
基本数据类型也称原始数据类型 byte,short,char,int,long,float,double,boolean。他们之间的比较应用双等号==,比较的是他们的值。
引用数据类型当他们用==进行比较的时候比较的是他们在内存中的存放地址确切的说是堆内存地址。
注对于第二种类型除非是同一个new出来的对象他们的比较后的结果为true否则比较后结果为false。因为每new一次都会重新开辟堆内存空间。
7 类和对象有什么区别
类是一种抽象而对象是类的实现。
Java的类通过class关键字进行定义它代表了一种抽象的集合。在它的里面可以定义各种属性和方法它们代表了每个类实例的特定的数据和动作。Java虚拟机对类只加载一次对它的静态成员也只加载一次。
对象指的是某一个特定抽象的实例它属于某一种类型也就是对象是通过类来创建的。它必须从属于某一个类通过new关键字进行创建它代表一个特定类型的实例对象可以被多次创建。
8 Java中成员变量的特点有哪些
在java中成员变量是指在类内方法外定义的变量;而局部变量是指在方法中定义的变量作用范围是其所在的方法
局部变量和成员变量的对比
1局部变量没有默认值成员变量有默认值
2局部变量是当其所在的函数被调用时在栈中开辟内存成员变量是当对象创建时在堆中开辟内存
3局部变量是当其作用域结束了就释放在栈中的内存成员变量是当其所属的对象被垃圾回收时才释放内存
4局部变量的作用域是从其定义的位置开始到其所在的大括号结束。成员变量的作用域是整个类
9 Java中静态变量的特点有哪些
类的静态成员是通过static关键字修饰的成员主要包括: 静态成员变量、静态方法和静态代码它们具有以下一些特点:
1、在类加载的时候就进行创建和初始化或执行代码
2、它们对于一个类来说都只有一份。
3、类的所有实例都可以访问到它们。
静态代码块先执行。
5、Java派生类中的构造方法如何为父类传递参数
在Java中使用super ()的形式来为父类的构造方法提供参数通过参数的数目和类型来决定调用哪一个构造方法。如果调用的是父类的默认的无参数构造方法则可以不必显式地使用super0。super0的使用必须放在子类构造方法的第一行否则编译时会有语法错误。
10 Java中子类的构造函数如何为父类传递参数
一是先实例化出对象再通过setter赋值
二是在实例化的时候就赋值即通过构造器参数的形式传参。
11 this与super的区别
this是自身的一个对象代表对象本身可以理解为: 指向对象本身的一个指针。
super可以理解为是指向自己超(父)类对象的一个指针而这个超类指的是离自己最近的一个父类。
二者的区别
1.属性的区别:
this访问本类中的属性如果本类没有此属性则从父类中继续查找。super访问父类中的属性。
2.方法的区别:
this访问本类中的方法如果本类没有此方法则从父类中继续查找。super访问父类中的方法.
3.构造的区别:
this调用本类构造必须放在构造方法的首行。super调用父类构造必须放在子类构造方法首行。
4.其他区别:
this表示当前对象。super不能表示当前对象
A、this.变量和super.变量
this.变量 调用的当前对象的变量
super.变量 直接调用的是父类中的变量
B、this(参数)和super(参数)方法
this(参数) 调用 (转发)的是当前类中的构造器
super(参数)用于确认要使用父类中的哪一个构造器
12 接口和抽象类的区别
包含抽象 (abstract) 方法的类就是抽象类。抽象类不能够实例化。Abstract class 接口所有的方法都是抽象的它可以包含静态的变量这些变量的值不能修改。interface 抽象类是一种功能不全的类接口只是一个抽象方法声明和静态不能被修改的数据的集合两者都不能被实例化。从某种意义上说接口是一种特殊形式的抽象类在Java语言中抽象类表示一种继承关系一个类吸能继承一个抽象类而一个类却可以实现多个接口。
1抽象类
抽象类是特殊的类只是不能被实例化除此以外具有类的其他特性重要的是抽象类可以包括抽象方法这是普通类所不能的。抽象方法只能声明于抽象类中且不包含任何实现派生类必须覆盖它们。另外抽象类可以派生自一个抽象类可以覆盖基类的抽象方法也可以不覆盖如果不覆盖则其派生类必须覆盖它们。
2接口
接口是引用类型的类似于类,和抽象类的相似之处有三点
1、不能实例化
2、包含未实现的方法声明
3、派生类必须实现未实现的方法抽象类是抽象方法接口则是所有成员不仅是方法包括其他成员
另外接口有如下特性
接口除了可以包含方法之外还可以包含属性、索引器、事件而且这些成员都被定义为公有的。除此之外不能包含任何其他的成员例如常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口但只能直接继承一个类包括抽象类。
3抽象类和接口的区别
1.类是对对象的抽象可以把抽象类理解为把类当作对象抽象成的类叫做抽象类.而接口只是一个行为的规范或规定微软的自定义接口总是后带able字段证明其是表述一类类“我能做。。。”.抽象类更多的是定义在一系列紧密相关的类间而接口大多数是关系疏松但都实现某一功能的类中.
2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
3.一个类一次可以实现若干个接口,但是只能扩展一个父类
4.接口可以用于支持回调,而继承并不具备这个特点.
5.抽象类不能被密封。
6.抽象类实现的具体方法默认为虚的但实现接口的类中的接口方法却默认为非虚的当然您也可以声明为虚的.
7.接口与非抽象类类似抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是允许抽象类将接口方法映射到抽象方法上。
8.抽象类实现了oop中的一个原则把可变的与不可变的分离。抽象类和接口就是定义为不可变的而把可变的作为子类去实现。
9.好的接口定义应该是具有专一功能性的而不是多功能的否则造成接口污染。如果一个类只是实现了这个接口的中一个功能而不得不去实现接口中的其他方法就叫接口污染。
10.尽量避免使用继承来实现组建功能而是使用黑箱复用即对象组合。因为继承的层次增多造成最直接的后果就是当你调用这个类群中某一类就必须把他们全部加载到栈中后果可想而知.结合堆栈原理理解。同时有心的朋友可以留意到微软在构建一个类时很多时候用到了对象组合的方法。比如asp.net中Page类有Server Request等属性但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性这个是非常基本的一个设计原则。
11.如果抽象类实现接口则可以把接口中方法映射到抽象类中作为抽象方法而不必实现而在抽象类的子类中实现接口中方法.
原文链接https://blog.csdn.net/u012842630/article/details/121665234
13 字符串字面量是否自动生成一个String对象
能字符串类具有一定的特殊性JVM在执行双引号操作符的时候会自动创建一个String对象并返回这个对象的引用
14 字符串对象池的作用是什么
Java虚拟机在启动的时候会实例化9个对象池这9个对象池分别且来存储8种基本类型的包装类对象和String对象主要是为了效率问题。
对象池的存在是为了避免频繁的创建和销毁对象而影响系统性能。当JVM在运行用双引号引起来的一个字符串的代码时会到String的对象池中去检查是否有一个字符序列相同的对象。如果有就取现成的对象如果没有则在对象池中创建一个对象并返回。
15 StringBuffer和StringBuilder的区别以及存在的作用
Java的字符串String对象有一个特性: 不变性它只能被创建不能改变其中的值.在Java程序中如果有大量拼接字符串的需要的话应该使用StringBuffer和StringBuilder类它们可以避免不必要的String对象的产生以提高程序的性能。它们的作用类似只不过StringBuilder线程是安全的。
StringBuffer sb=new StringBuffer();
Sb.append(a);//用append方法追加字符串
16 简述数组的内存原理
数组是存放在连续内存空间上的相同类型数据的集合。所以数组可以方便的通过下表索引的方式获取到下表下对应的数据。
数组下标都是从0开始的。
数组内存空间的地址是连续的
17 迭代器是什么
迭代器iterator有时又称游标cursor是程序设计的软件设计模式可在容器container例如链表或阵列上遍访的接口设计人员无需关心容器的内容。
1.功能
迭代器使开发人员能够在类或结构中支持foreach迭代而不必整个实现IEnumerable或者IEnumerator接口。只需提供一个迭代器即可遍历类中的数据结构。当编译器检测到迭代器时将自动生成IEnumerable接口或者IEnumerator接口的CurrentMoveNext和Dispose方法。
2.特点
1迭代器是可以返回相同类型值的有序序列的一段代码。
2迭代器可用作方法、运算符或get访问器的代码体。
3迭代器代码使用yieldreturn语句依次返回每个元素yield break将终止迭代。
4可以在类中实现多个迭代器每个迭代器都必须像任何类成员一样有惟一的名称并且可以在foreach语句中被客户端,代码调用如下所示foreach(int x in SimpleClass.Iterator2){}。
5迭代器的返回类型必须为IEnumerable和IEnumerator中的任意一种。
18 比较器是什么
在java中经常涉及到对象数组的比较的情况常见的有两种方法来处理
继承comparable接口并实现compareTo方法
规则是
如果当前对象this大于形参对象obj则返回正整数/负整数
如果当前对象this小于形参对象obj则返回负整数/正整数
如果当前对象this等于形参对象obj则返回零/其他因素的比较器
定义一个单独的对象比较器继承自Comparator接口实现compare方法
19 Vector、ArrayList和LinkedList的区别
1.基本区别三个类都实现了List接口都是有序集合数据是允许重复的ArrayList 和Vector都是基于数组实现存储的集合中的元素的位置都是有顺序即连续的LinkedList是基于双向链表实现存储的集合中的元素的位置是不连续的
2.性能区别Vector和ArrayList底层实现原理一致但是Vector是线程安全的因此性能比ArrayList差很多LinkedList相比于集合Vector和ArrayList在插入,修改删除等操作上速度较快但是随机访问的性能较差
3.安全区别Vector是使用了synchronized同步锁是线程安全的ArrayList和LinkedList都是线程不安全的
4.原理区别ArrayList与Vector都有初始的容量大小当存储的元素的个数超过了容量时就需要增加存储空间Vector默认增长为原来两倍而ArrayList的增长为原来的1.5倍ArrayList与Vector都可以设置初始空间大小Vector还可以设置增长的空间大小而ArrayList没有提供设置增长空间的方法
原文链接https://blog.csdn.net/shumeigang/article/details/112980128
20 HashMap、HashTable和TreeMap的区别
1实现方面
HashMap是继承自AbstractMap类而HashTable是继承自Dictionary类。它们都同时实现了map、Cloneable可复制、Serializable可序列化这三个接口。存储的内容是基于key-value的键值对映射不能有重复的key而且一个key只能映射一个value。HashSet底层就是基于HashMap实现的。
2为空方面
Hashtable的key、value都不能为nullHashMap的key、value可以为null不过只能有一个key为null但可以有多个null的valueTreeMap键、值都不能为null。
3排序方面
Hashtable、HashMap具有无序特性。TreeMap是利用红黑树实现的树中的每个节点的值都会大于或等于它的左子树中的所有节点的值并且小于或等于它的右子树中的所有节点的值实现了SortMap接口能够对保存的记录根据键进行排序。所以一般需求排序的情况下首选TreeMap默认按键的升序排序深度优先搜索也可以自定义实现Comparator接口实现排序方式。
HashTable是一个线程安全的类它使用synchronized来锁住整张Hash表来实现线程安全即每次锁住整张表让线程独占相当于所有线程进行读写时都去竞争一把锁导致效率非常低下。
Hashtable现在很少出现了大家更多的会使用ConcurrentHashMap引导面试官提问ConcurrentHashMap。
原文链接https://blog.csdn.net/jjclove/article/details/124378805
21 什么样的数据集合可以使用foreach循环
数组
Collection类
任何实现了Iterable接口的自定义类
22 字节流与字符流的区别
1)两者的组成不同
字符流只能是字符这一种类型但是字节流中可以是字符可以是二进制文件可以是音频可以是各种各样的类型只要符合字节形式存储的都可以接字节流而字符流只能接字符。
1、字节流的组成字节流是由字节组成的。
2、字符流的组成字符流是由字符组成的。
2)两者的处理不同
字符流处理的单元为2个字节的Unicode字符分别操作字符、字符数组或字符串而字节流处理单元为1个字节操作字节和字节数组。
1、字节流的处理主要用在处理二进制数据它是按字节来处理的但实际中很多的数据是文本。
2、字符流的处理按虚拟机的encode来处理也就是要进行字符集的转化。
23 字节流的处理方式有哪些
字节流处理的是计算机最基本的单位byte它可以处理任何数据格式的数据。主要的操作对象就是byte数组通过read()和write()方法把byte数组中的数据写入或读出。
24 字符流的处理方式有哪些
字符流是由字节流包装而来它的输入和输出流类型包括StringReader和StringWriter、BufferedReader和BufferedWriter。字符流API的基本使用思路有以下步骤
1获取输入或输出流对象。可以从File得到也可以从网络或其他地方得到。
2根据特定的字符格式创建InputStreanReader或InputStreamWriter对象。
3使用read()或readLine()方法得到数据。或使用write()或print()方法进行字符输出。
4最后关闭reader或writer。
25 什么是序列化
序列化本质上就是把对象内存中的数据按照一定的规则变成一系列的字节数据然后再把这些字节数据写入到流中。而反序列化的过程相反限度去字节数据然后再重新组装成Java对象。
所有需要进行序列化的类都必须实现Serializeable接口必要时还需要提供静态的常量serialVersionUID。