【第一阶段面试题】变量与方法 集合 流 重写与重载 对象相等判断 值传递 java包 反射 常用API Date相关

文章目录

一、变量与方法

1.成员变量与局部变量的区别有哪些

  • 变量:在程序执行的过程中,在某个范围内其值可以发生改变的量。从本质上讲,变量其实是内存中的一小块区域
  • 成员变量:方法外部,类内部定义的变量
  • 局部变量:类的方法中的变量。
  • 成员变量和局部变量的区别

作用域

  • 成员变量:针对整个类有效。
  • 局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)

存储位置

  • 成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。
  • 局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结束后,就自动释放。

生命周期

  • 成员变量:随着对象的创建而存在,随着对象的消失而消失
  • 局部变量:当方法调用完,或者语句结束后,就自动释放。

初始值

  • 成员变量:有默认初始值。
  • 局部变量:没有默认初始值,使用前必须赋值。

2.在java中定义一个不做事且没有参数的构造方法的作用

Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”
因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

3.在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是什么?

帮助子类做初始化工作

4.一个类的构造方法的作用是什么?若一个类没有声明构造方法,改程序能够正确执行吗?

主要作用是完成对类对象的初始化工作。可以执行。
因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

5.构造方法有哪些特性

  • 名字与类名相同
  • 没有返回值,但是不可以用void声明构造函数
  • 生成类的对象时自动执行,无需调用

6.静态变量和实例变量区别

  • 静态变量: 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。
  • 实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。

7. 静态方法和实例方法有何不同?

  • 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
  • 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制

8.在一个静态方法内调用一个非静态成员为什么是非法的?

由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态的变量,也不可以访问非静态变量成员

9.什么是方法的返回值?返回值的作用是什么?

方法的返回值就是指我们获取到某个方法体中的代码执行后产生的结果。
返回值的作用:接收出结果,使他可以用于其他的操作

二、集合

1. Java 容器都有哪些?

Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:
Collection
List
ArrayList
LinkedList
Vector
Stack
Set
HashSet
TreeSet
LinkedHashSet
Map
HashMap
TreeMap
LinkedHashMap
ConcurrentHashMap
Hashtable

2. Collection 和 Collections 有什么区别?

Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。
Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法: Collections. sort(list)。

3. List、Set、Map 之间的区别是什么?

List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。
三者之间的区别,如下表:
List集合的特点就是存取有序,可以存储重复的元素,可以用下标进行元素的操作
底层是使用数组实现,所以查询速度快,增删速度慢
Set集合中的对象不按特定的方式排序,只是简单的将对象加入到集合中,但是Set集合不能包括重复对象
Set接口继承了Collection接口,因此也包含Collection接口的所有方法
Map集合没有继承Collection接口,其提供的是键到值的映射。Map不能包含相同的键,每个键只能映射一个值。键还决定了储存对象在映射中的储存位置。
HashMap集合特点:单一,无序

4. HashMap 和 Hashtable 有什么区别?

存储:
HashMap 运行 key 和 value 为 null,而 Hashtable 不允许。
线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
推荐使用:
在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。

5. 如何决定使用 HashMap 还是 TreeMap?

对于在 Map 中:
插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,
但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。

6. 说一下 HashMap 的实现原理?

HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

7. 说一下 HashSet 的实现原理?

HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

8. ArrayList 和 LinkedList 的区别是什么?

数据结构实现:
ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
随机访问效率:
ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
增加和删除效率:
在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。
综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

9. 如何实现数组和 List 之间的转换?

数组转 List:使用 Arrays. asList(array) 进行转换。
List 转数组:使用 List 自带的 toArray() 方法。
代码示例:

// list to array
List list = new ArrayList();
list. add(“王磊”);
list. add(“的博客”);
list. toArray();
// array to list
String[] array = new String[]{“王磊”,“的博客”};
Arrays. asList(array);

三、流

1. Java 中 IO 流分为几种?

按功能来分:
输入流(input)、输出流(output)
按类型来分:
字节流和字符流。
字节流和字符流的区别是:
字节流按 8 位传输以字节为单位输入输出数据
字符流按 16 位传输以字符为单位输入输出数据。

2. BIO、NIO、AIO 有什么区别?

BIO:
Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:
New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:
Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

3. Files 的常用方法都有哪些?

Files. exists():检测文件路径是否存在。
Files. createFile():创建文件。
Files. createDirectory():创建文件夹。
Files. delete():删除一个文件或目录。
Files. copy():复制文件。
Files. move():移动文件。
Files. size():查看文件个数。
Files. read():读取文件。
Files. write():写入文件。

四、重写与重载

1.构造器(constructor)是否可以被重写(override)

构造器不能被继承,所以不能被重写,但是可以重载

2.重载(Overload)与重写(Override)的区别。重载的方法能否根据返回类型区分

  • 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
  • 重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
  • 重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。

五、对象相等判断

1.==和equals的区别是什么

  • ==:它的作用是判断两个对象是否相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
  • equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
  • 情况1:类没有覆盖equals()方法法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
  • 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
  • 说明
  • String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址, 而String的equals方法比较的是对象的值。
  • 当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。

2. hashCode 与 equals (重要)

  • 如果两个对象相等,则hashcode一定也是相同的
  • 两个对象相等,对两个对象分别调用equals方法都返回true
  • 两个对象有相同的hashcode值,他们也不一定是相等的

3.对象的相等与指向他们的引用相等,他们有什么不同

对象的相等比较的是内存中存放的内容是否相等,而引用相等比较的是他们指向的内存地址是否相等

六、值传递

1… 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递

值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的变是不会影响到调用者的

2.为什么 Java 中只有值传递

  • 首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按值调用表示方法接收的是调用者提供的值,而按引用调用表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。 它用来描述各种程序设计语言(不只是Java)中方法参数传递方式。
  • Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。

3.值传递和引用传递有什么区别

  • 值传递:指的是在方法调用时,传递的参数是按指的拷贝传递,传递的是值的拷贝,也就是说传递以后就互不相关了
  • 引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的是应用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)

七、java包

1.JDK中常用的包有哪些

  • java.lang:这个是系统的基础类;
  • java.io:这里面是所有输入输出有关的类,比如文件操作等;
  • java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
  • java.net:这里面是与网络有关的类;
  • java.util:这个是系统辅助类,特别是集合类;
  • java.sql:这个是数据库操作的类。

2. import java和javax有什么区别

  • 刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展 API 包来说使用。然而随着时间的推移,javax 逐渐的扩展成为 Java API 的组成部分。但是,将扩展从 javax 包移动到 java包将是太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准API的一部分
  • 实际上java和javax没有区别。这都是一个名字。

八、反射

1.什么是反射机制

  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
  • 静态编译与动态编译

静态编译:在编译时确定类型,绑定对象
动态编译:在运行时确定类型,绑定对象

2.反射机制的优缺点

优点:运行期类型的判断,动态加载类,提高代码的灵活度
缺点:性能瓶颈,反射相当于一系列的解释操作,通知JVM要做的事情,性能比直接的java代码要慢得多

3.反射机制的应用场景

  • 反射是框架设计的灵魂
  • 在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。

4.java获取反射的三种方法

  • 通过new对象实现反射机制
  • 通过路径实现反射机制
  • 通过类名实现反射机制

九、常用的API

1.字符型常量与字符串常量的区别

  • 形式上:字符常量是引号引起的一个字符,字符串常量是双引号引起的若干个字符
  • 含义上:字符常量相当于一个整型值,可以参加表达式运算,字符串常量代表的是一个地址值(该字符串在内存中存放的位置)
  • 占内存大小:字符常量只占一个字节,字符串常量占若干个字节

2.什么是字符串常量池

字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

3.String有哪些特性

  • 不变性:String 是只读字符串,是一个典型的immutable 对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。
  • 常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。
  • final:使用 final 来定义 String 类,表示 String 类不能被继承,提高了系统的安全性。

4.String为什么是不可变的

String类利用了final修饰的char类型数组存储字符

5.是否可以继承String类

String类是final类,不可以被继承

6. String s = new String(“xyz”);创建了几个字符串对象

两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象。

7.数组有没有length()方法?String有没有length()方法

数组没有length()方法,有length属性。String有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的。

8.在使用HashMap的时候,用String做key有什么好处

HashMap内部实现是通过key的hashcode来确定value的存储位置,因为字符串是不可变的,所以当创建字符串时,它的hashcode会被缓存下来,不需要再次计算,所以相对于其他的对象赶快。

9. String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的

  • 可变性
    String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。

  • 线程安全性
    String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

  • 性能
    每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

  • 对于三者使用的总结

如果要操作少量的数据用 = String
单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
多线程操作字符串缓冲区下操作大量数据 = StringBuffer

十、Date相关

1.自动装箱与自动拆箱

装箱:将基本类型用他们对应的引用类型包装起来
拆箱:将包装类型转换为基本数据类型

2.int与integer有什么区别

  • Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使
    得二者可以相互转换。
  • Java 为每个原始类型提供了包装类型:
    原始类型: boolean,char,byte,short,int,long,float,double
    包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

3.Integer a= 127 与 Integer b = 127相等吗

  • 对于对象引用类型:==比较的是对象的内存地址。
  • 对于基本数据类型:==比较的是值。

如果整型字面量的值在-128到127之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的 Integer对象,超过范围 a1==b1的结果是false

public static void main(String[] args) { 
		Integer a = new Integer(3); 
		Integer b = 3; // 将3自动装箱成Integer类型 
		int c = 3; 
		System.out.println(a == b); // false 两个引用没有引用同一对象 
		System.out.println(a == c); // true a自动拆箱成int类型再和c比较 
		System.out.println(b == c); // true 
		Integer a1 = 128; 
		Integer b1 = 128; 
		System.out.println(a1 == b1); // false 
		Integer a2 = 127; 
		Integer b2 = 127; 
		System.out.println(a2 == b2); // true 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值