Java基础面试题突击1

news2024/11/28 4:48:44

👩🏻 作者:一只IT攻城狮 ,关注我不迷路
❤️《java面试核心知识》突击系列,持续更新…
💐 面试必知必会学习路线:Java技术栈面试系列+SpringCloud项目实战学习路线
📝再小的收获*365天都会成就不一样的自己,一起学习,一起进步。

文章目录

  • 一、JDK 和 JRE 有什么区别?
  • 二、Java为什么能跨平台?
  • 三、Java基本数据类型
    • 1、Java中数据类型
    • 2、八大基本数据类型
      • 1)数据类型转换
      • 2)类型提升
      • 3)基本数据内存中分配
      • 4)值的初始化
  • 四、java中的异常分类及处理
    • 1、异常分类
    • 2、异常的处理方式
      • 1)遇到问题不进行具体处理,而是继续抛给调用者 (throw,throws)
      • 2)try catch 捕获异常针对性处理方式
    • 3、Throw 和 throws 的区别
      • 1)位置不同
      • 2)功能不同
  • 五、== 和 equals 的区别是什么?
    • 1、String的比较
    • 2、Integer的比较
    • 3、两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
  • 六、创建对象的几种方法
    • 1、new关键字
    • 2、Class 对象的 newInstance()
    • 3、调用 Constructor 对象的 newInstance()
    • 4、Clone
    • 5、反序列化
  • 七、重载和重写
    • 1、重写(Override)
    • 2、重载(Overload)
  • 八、权限修饰符
  • 九、String、String StringBuffffer 和 StringBuilder 的区别是什么?
  • 十、Collection与Collections的区别
    • 1、Collection接口
    • 2、Collections集合类


一、JDK 和 JRE 有什么区别?

JDK:java development kit (java开发工具),JDK 是用于开发 Java 程序的最小环境。
JRE:java runtime environment (java运行时环境),是提供给 Java 程序运行的最小环境。

JRE是java运行时环境而JDK是java开发工具包。运行java程序只需安装JRE。如果需要编写java程序,需要安装JDK。但是JRE可以独立安装。

JDK包含JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。
JRE包含了java虚拟机、java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。
在这里插入图片描述

Tip:mac怎么查看jdk目录呢?
终端输入:/usr/libexec/java_home -V会显示jdk版本和所在目录
command + shift +G前往要去的路径

二、Java为什么能跨平台?

Java是跨平台的原因是因为Java代码是运行在JVM上的,而不是直接运行在操作系统上。

这意味着,Java程序的代码不会直接与操作系统交互,而是通过JVM来间接交互。java是半编译语言,java源程序在经过java编译器编译后成为java字节码文件,再由运行在不同平台上的虚拟机(例如:windows、Linnux)将相同的字节码解释运行,转换成具体平台上的机器指令。从而实现了一次编写,到处运行。

三、Java基本数据类型

1、Java中数据类型

2、八大基本数据类型

  • 整型的byte、short、int、long;
  • 字符型的char;
  • 浮点型的float、double;
  • 布尔型的boolean。
    在这里插入图片描述
    将6种数据类型按取值范围的大小顺序排列一下:
    double > float > long > int > short > byte

1)数据类型转换

取值范围从小转换到大,是可以直接转换的,
在自动类型转化中、int–> float、long–> float、long–> double、float --> double
可能精度损失外,自动转换不会出现任何运行时异常。而从大转成小,则必须使用强制转换。

2)类型提升

在表达式计算过程中会发生类型转换,这些类型转换就是类型提升,类型提升规则如下:
所有 byte/short/char 的表达式都会被提升为 int
除以上类型,其他类型在表达式中,都会被提升为取值范围大的那个类型,例如有一个操作数为double,整个表达式都会被提升为double

3)基本数据内存中分配

基本数据类型它存放于“栈”中而不是存放于“堆”中。

4)值的初始化

当基本数据类型作为类成员变量时,java 会对其进行初始化。且初始化的值分别为

而局部变量 在没有被显示初始化情况下,jdk 同样也会自动赋予他默认值,可不同之处就在于,你无法引用他,因为编译器会在你要引用的位置报错。

四、java中的异常分类及处理

1、异常分类

异常:执行中发生的不正常情况。
Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 ErrorException

Error:JVM系统内部错误、资源耗尽等严重情况。比如Stack OverflowError和 Out Of Memory。
Exception:空指针访问、试图读取不存在的文件、网络连接中断、数组下标越界等。

程序执行过程,是先编译后执行。所以从程序执行的过程可以将异常进一步分为:
编译时异常:执行javac.exe命名时,可能出现的异常
运行时异常:执行java.exe命名时,出现的异常

2、异常的处理方式

1)遇到问题不进行具体处理,而是继续抛给调用者 (throw,throws)

抛出异常有三种形式,一是 throw,一个 throws,还有一种系统自动抛异常。

public static void main(String[] args) { 
String s = "abc"; 
if(s.equals("abc")) { 
throw new NumberFormatException(); 
} else { 
System.out.println(s); 
} 
} 
int div(int a,int b) throws Exception{ 
return a/b;} 

2)try catch 捕获异常针对性处理方式

3、Throw 和 throws 的区别

1)位置不同

throws 用在函数上,后面跟的是异常类,可以跟多个;而 throw 用在函数内,后面跟的 是异常对象。

2)功能不同

throws 用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说 throw 语句独立存在时,下面不要定义其他语句,因为执行不到。

throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出了异常,执行 throw 则一定抛出了某种异常对象。

两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

五、== 和 equals 的区别是什么?

== 对于基本类型:比较的是值是否相同;
对于引用类型:比较的是引用是否相同;

关联知识点:

1、String的比较

String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x== y);  // true
System.out.println(x== z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

原因:String 、Integer 等重写了 Object 的 equals 方法,把引用比较改成了值比较。所以一般情况下 equals 比较的是值是否相等。

2、Integer的比较

Integer a1 = 1;
Integer a2 = 1;
Integer b1 = 128;
Integer b2 = 128;
System.out.println(al== a2); //true
System.out.println(b1== b2); //false

原因:Integer类内部通过静态内部类提供了一个缓存池,范围在-128~127之间,如果超过这个范围 Integer值都是new出来的新对象。

Integer的valueOf方法的具体实现:

public static Integer valueOf(int i) {
 if(i >= -128 && i <= IntegerCache.high)
 return IntegerCache.cache[i + 128];
 else
 return new Integer(i);
 }

其中IntegerCache类的实现为:

private static class IntegerCache {
 static final int high;
 static final Integer cache[];
 static {
 final int low = -128;
 // high value may be configured by property
 int h = 127;
 if (integerCacheHighPropValue != null) {
 // Use Long.decode here to avoid invoking methods that
 // require Integer's autoboxing cache to be initialized
 int i = Long.decode(integerCacheHighPropValue).intValue();
 i = Math.max(i, 127);
 // Maximum array size is Integer.MAX_VALUE
 h = Math.min(i, Integer.MAX_VALUE - -low);
 }
 high = h;
 cache = new Integer[(high - low) + 1];
 int j = low;
 for(int k = 0; k < cache.length; k++)
 cache[k] = new Integer(j++);
 }
 private IntegerCache() {}
 }

从这2段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,
便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

3、两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

不对。我们两个字符串的哈希值很可能一样,但是反过来不一定成立。

String str1 = "通话";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d",  str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));

执行的结果:

str1:1179395 | str2:1179395
false

六、创建对象的几种方法

1、new关键字

使用new关键字创建对象,是最常见也是最简单的创建对象的方式。

2、Class 对象的 newInstance()

使用Class对象的newInstance()方法来创建该 Class 对象对应类的实例,但是这种方法要求该Class对象对应的类有默认的空构造器。

3、调用 Constructor 对象的 newInstance()

先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的newInstance()方法来创建 Class 对象对应类的实例,通过这种方法可以选定构造方法创建实例。

//获取 Person 类的 Class 对象 
Class clazz=Class.forName("reflection.Person"); 
//使用.newInstane 方法创建对象 
Person p=(Person) clazz.newInstance(); 
//获取构造方法并创建对象 
Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class); 
//创建对象并设置属性
Person p1=(Person) c.newInstance("测试","男",10);

4、Clone

无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。

5、反序列化

当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象。在反序列化时,JVM创建对象并不会调用任何构造函数。

七、重载和重写

1、重写(Override)

从字面上看,重写就是重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名, 参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。

public class Father { 
public static void main(String[] args) { 
// TODO Auto-generated method stub 
Son s = new Son(); 
s.sayHello(); 
} 
public void sayHello() { 
System.out.println("Hello"); 
} 
} 
class Son extends Father{
@Override 
public void sayHello() { 
// TODO Auto-generated method stub 
System.out.println("hello by "); 
} 
}

重写总结:
1.发生在父类与子类之间
2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法明更加宽泛的检查型异常

2、重载(Overload)

在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。

public class Father { 
public static void main(String[] args) { 
// TODO Auto-generated method stub 
Father s = new Father(); 
s.sayHello(); 
s.sayHello("wintershii"); 
} 
public void sayHello() { 
System.out.println("Hello"); 
} 
public void sayHello(String name) { 
System.out.println("Hello" + " " + name); 
} 
}

重载总结:
1.重载Overload是一个类中多态性的一种表现
2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准

八、权限修饰符

Java规定的4种权限 (从小到大排列) : private、缺省(default)、protected、 public
Java权限修饰符public、protected、default、private置于类的成员定义前,用来限定对象对该类成员的访问权限。

对于class的权限修饰只可以用public和default(缺省)。
public类可以在任意地方被访问。
default类只可以被同一个包内部的类访问。

4种权限可以用来修饰类及类的内部结构: 属性、方法、构造器、内部类

具体的,4种权限都可以用来修饰类的内部结构,属性、方法、构造器、内部类修饰类的话,只能使用default、 public。

总结封装性:Java提供了4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性

九、String、String StringBuffffer 和 StringBuilder 的区别是什么?

String和StringBuffer和StringBuilder的区别 因为String是不可变的,StringBuffer 和 StringBuilder 它们都是可变的字符串。

String是只读字符串,它并不是基本数据类型,而是一个对象。从底层源码来看是一个fifinal类型的字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生新的String对象。

private final char value[];

StringBuffffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,他们的底层都是可变的字符数组

/** 
* The value is used for character storage. 
*/ 
char[] value; 

所以在进行频繁的字符串操作时,建议使用StringBuffffer和StringBuilder来进行操作。

StringBuffffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全
StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

十、Collection与Collections的区别

1、Collection接口

Collection是集合类的上级接口,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、 Set;

在这里插入图片描述

2、Collections集合类

Collections是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种集合的搜索、排序、线程安全化等操作。此类不能实例化(因为Collections的构造方法被私有化处理了),就像一个工具类,服务于Java的Collection框架, Collections类中的方法都是被static修饰了,可以直接用类名调用。

Collections类常用方法:

  • public static void shuffle(List)。混乱排序
  • public static boolean addAll(Collection c, T… elements)。添加一些元素
  • public static void sort(List list,Comparator<? super T> )。 排序,将集合中元素按照指定规则排序
  • public static <T extends Comparable<? super T>> void sort(List list)。 排序,将集合中元素按照默认规则排序
  • public static int binarySearch(List list, Object key)。查找,使用二分搜索法搜索指定的 List 集合,以获得指定对象在 List 集合中的索引。如果要使该方法可以正常工作,则必须保证 List 中的元素已经处于有序状态。
  • public static void copy(List <? super T> dest,List<? extends T> src) 复制, 用于将指定集合中的所有元素复制到另一个集合中。
  • public static void replaceAll()。替换,替换集合中所有的旧元素为新元素。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物流管理系统对电商的重要性,零代码技术起关键性作用

什么是物流管理系统 物流管理系统是一种软件系统&#xff0c;用于管理和协调货物的移动。它涵盖了物流计划、物流执行、物流跟踪和数据分析等方面&#xff0c;可以帮助企业优化供应链&#xff0c;提高运营效率和客户满意度。它包括了仓储管理、配送管理、运输管理、订单管理、…

编织数据结构的艺术:双向带头循环链表的华丽实现

上一篇博客&#xff0c;我们了解并实现了单向不带头不循环链表&#xff0c;而本篇博客会讲解链表中的王者&#xff1a;双向带头循环链表。 概述 双向带头循环链表的特点是&#xff1a; 每个结点内部&#xff0c;既有指向上一个结点的前驱指针prev&#xff0c;也有指向下一个…

《C++入门攻略》(小白向)

函数 函数、输入、传参 在程序中使用函数时&#xff0c;你必须先声明它然后再定义声明的目的是告诉编译器你即将要定义的函数的名字是什么&#xff0c;返回值的类型是什么以及参数是什么而定义则是告诉编译器这个函数的功能是什么。假如我们不声明&#xff0c;那么该函数就不能…

vue快速上手教程与简单安装

目录 vue简介 vue实例 通过 CDN 使用 Vue NPM 方法 介绍 下载 使用 vue简介 Vue.js 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 vue实例…

ping包过程之arp(地址解析协议)

0,怎么引出arp地址解析协议的呢&#xff1f; 在硬件层次上进行的数据帧交换必须有正确的接口地址&#xff08;既是MAC地址&#xff09;。但是&#xff0c; T C P / I P有自己的地址&#xff1a; 32 bit的I P地址。知道主机的 I P地址并不能让内核发送一帧数据给主机。内核&…

二十、Zipkin持久化链路跟踪

目录 Zipkin持久化 使用mysql数据库持久化 1、创建zipkin数据库 2、启动zipkin使用以下脚本 3、访问接口&#xff08;配置了sleuth链路跟踪&#xff09; 使用ElasticSearch持久化 zipkin启动脚本 Zipkin持久化 Zipkin server默认会将追踪数据信息保存在内存中&#xff0…

NoSQL之Redis配置与数据库常用命令

目录 一、关系型数据库与非关系型数据库概述1.1 关系型数据库1.2 非关系型数据库 二、关系型数据库与非关系型数据库的区别2.1 数据的存储方式不一样2.2 扩展的方式不同2.3 对事务性的支持不同 三、非关系型数据库产生背景四、Redis简介4.1 Redis的单线程模式4.2 Redis优点4.3 …

B2B 客户支持,如何做好?

多年来&#xff0c;基于尖端技术的现代和个性化客户体验一直主导着企业对消费者&#xff08;B2C&#xff09;领域。然而&#xff0c;在企业对企业&#xff08;B2B&#xff09;行业中&#xff0c;出色的客户体验变得比以往任何时候都更加重要。许多组织正在开发类似于B2C市场中个…

无延迟直播/超低延迟直播快速接入的示例

简要说明 接入无延迟直播/超低延迟直播播放前&#xff0c;需确保直播间频道是无延迟频道&#xff0c;SDK中使用无延迟与常规播放无异&#xff0c;只需加入若干配置就可以快速接入。 什么是无延迟/超低延迟直播&#xff0c;可参见我的这篇文章&#xff1a; 无延时直播/超低延时…

Java 基础进阶篇(十四)—— File类常用方法

File 类的对象代表操作系统的文件&#xff08;文件、文件夹&#xff09;&#xff0c;File 类在 java.io.File 包下。 File 类提供了诸如&#xff1a;创建文件对象代表文件&#xff0c;获取文件信息&#xff08;大小、修改时间&#xff09;、删除文件、创建文件&#xff08;文件…

【软件测试与质量保证】期末复习2(HITWH)(软件测试部分)

更多复习资料在下方链接获取&#xff1b;包括复习笔记&#xff08;有具体习题&#xff09;、习题答案以及设计题示例 链接&#xff1a;复习资料 复习笔记里的习题不包含答案&#xff0c;具体答案在【云班课答案】文件夹中&#xff0c;顺序都是一一对应的&#xff0c;喜欢刷题可…

进程间通信之管道篇

&#x1f3c6;一、进程间通信目的 1.1什么是通信 进程是具有独立性的&#xff0c;而我们要实现进程间通信的目标&#xff0c;是需要开辟空间和创造方法的。 通信目的&#xff1a; 1、数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 2、资源共享&#xff1a;…

CSAPP 第六章存储器的结构层次

源程序 执行程序 空间代码都要存在外存上&#xff0c;程序运行的时候操作系统要把外存的东西加载到内存里&#xff0c;CPU要从内存一行一行的读、译码和分析 我们来看一个例子&#xff1a; 指令位于内存中的代码段中&#xff0c;必须从内存中读出来进行译码分析之后才能运行 指…

细说java动态代理及使用场景

一、定义 Java代理模式是一种结构型设计模式&#xff0c;它允许通过创建一个代理对象来间接访问另一个对象&#xff0c;从而控制对原始对象的访问。 1.1 作用 1、在访问原始对象时增加额外功能&#xff0c;如访问前或访问后添加一些额外的行为。 2、控制对原始对象的访问。 J…

热水智能控制系统有什么优点?

热水智能控制系统是一种先进的技术&#xff0c;可以极大地提高家庭和商业场所的热水使用效率&#xff0c;降低能源消耗和运营成本。这种系统利用现代化的传感器、控制器和通讯技术&#xff0c;可以智能地监测和控制热水的温度、流量和使用情况&#xff0c;并根据实际需求来调节…

ASEMI代理ADI亚德诺ADM706SARZ-REEL原厂芯片

编辑-Z ADM706SARZ-REEL参数描述&#xff1a; 型号&#xff1a;ADM706SARZ-REEL VCC工作电压范围&#xff1a;1.0-5.5V 电源电流&#xff1a;100μA 重置阈值滞后&#xff1a;20 mV 复位脉冲宽度&#xff1a;200 ms PFI输入阈值&#xff1a;1.25V PFI输入电流&#xff…

Linux 部署 scrapydweb

一、 创建虚拟环境&#xff0c;在虚拟环境下操作 1、安装scrapyd pip install scrapyd2、安装scrapyd-client pip install scrapyd-client3、安装scrapydweb pip install scrapydweb4、安装Logparser pip install Logparser二、新建一个scracyd的配置文件 sudo mkdir /etc/scr…

MySql.Data.dll 因版本问题造成报错的处理

NetCore 链接MySQL 报 Character set ‘utf8mb3‘ is not supported by .Net Framework 异常解决_character set utf8mb3_csdn_aspnet的博客-CSDN博客 查看mysql版本号&#xff0c;两种办法&#xff1a; 第一种在数据库中执行查询&#xff1a;SELECT version; 第二种使用工具…

数据治理和合规性:如何确保大数据应用遵守法规和标准

第一章&#xff1a;引言 在数字时代&#xff0c;大数据的应用日益普遍&#xff0c;对企业和组织的决策、运营和创新产生了深远的影响。然而&#xff0c;随着数据规模的不断增长&#xff0c;以及数据泄露和滥用事件的频繁发生&#xff0c;数据治理和合规性问题愈发突显。企业和…

推荐系统用户长序列建模

目录 一、背景 二、技术方案 2.1 DIN 简介 论文细节 优缺点 2.2 DINE 简介 论文细节 2.3 MIMN 简介 论文细节 2.4 SIM 简介 论文细节 优缺点 2.5 DSIN 简介 论文细节 一、背景 阿里巴巴的精排模型从传统lr&#xff0c;到深度学习&#xff0c;再到对用户长历…