Java基础(面试)

1. Java中的基本数据类型都有什么,每种类型所占的字节数

分成四个大类,共八种:byte 、short 、int 、long、float 、 double、boolean、char

  1. 整型 byte 、short 、int 、long
  2. 浮点型 float 、 double
  3. 字符型 char
  4. 布尔型 boolean

在这里插入图片描述

byte 1

short 2

int 4

long 8

float 4

double 8

boolean 1/4

char 2

注意

1. boolean类型被编译为int类型,等于是说JVM里占用字节和int完全一样,int是4个字节,于是boolean也是4字节

2. boolean数组在Oracle的JVM中,编码为byte数组,每个boolean元素占用8位=1字节

如果boolean是单独使用:boolean占4个字节。

如果boolean是以“boolean数组”的形式使用:boolean占1个字节。

2. final关键字可以修饰什么?用什么作用?

final可修饰类,方法,常量

  1. final修饰方法不能被重写
  2. final修饰类不能被继承
  3. final修饰属性为常量不能被修改

3. Java中基本数据类型对应的包装类是什么?为什么要用到包装类?

byte—Byte

short—Short

int—Integer

long—Long

float—Float

double—Double

boolean—Boolean

char—Character

  1. 包装类类型可以存放null
  2. 特定场合需要包装类,比如集合的泛型
  3. 包装类类型可以调用类中事先定义的方法

4. Java中常见的异常

  1. NullPointerException:空指针异常,当操作一个 null 对象的方法或属性时会抛出这个异常。是一个很头疼的异常,因为它是运行时异常,不需要手动捕获,但运行时碰到这个异常会中断程序。

  2. OutOfMemoryError:内存溢出异常,这不是程序能控制的,当需要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序。

  3. IOException:IO,即:Input、Output,我们在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获。

    比如读写文件是需要抛出异常:

    public int read() throws IOException public void write(int b) throws IOException

  4. FileNotFoundException:找不到文件异常,如果文件不存在就会抛出这种异常。

    如定义输入输出文件流,文件不存在会报错:

    public FileInputStream(File file) throws FileNotFoundException
    public FileOutputStream(File file) throws FileNotFoundException
    FileNotFoundException 其实是 IOException 的子类,同样是受检查异常,需要进行手工捕获。

  5. ClassNotFoundException:类找不到异常,Java开发中经常遇到的一种异常,这是在加载类的时候抛出来的,即在类路径下不能加载指定的类。它是受检查异常,需要进行手工捕获。

    public static <T> Class<T> getExistingClass(ClassLoader classLoader, String className) {

    try { return (Class<T>) Class.forName(className, true, classLoader); } catch (ClassNotFoundException e) { return null; } }

  6. ClassCastException:类转换异常,将一个不是该类的实例转换成这个类就会抛出这个异常。

    如将一个数字强制转换成字符串就会报这个异常:

    Object x = new Integer(0);
    System.out.println((String)x);
    它是运行时异常,不需要手工捕获。

  7. NoSuchMethodException: 没有这个方法异常,一般发生在反射调用方法的时候:

    public Method getMethod(String name, Class<?>… parameterTypes) throws NoSuchMethodException, SecurityException { checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); Method method = getMethod0(name, parameterTypes, true); if (method == null) { throw new NoSuchMethodException(getName() + “.” + name + argumentTypesToString(parameterTypes)); } return method; } 复制代码 它是受检查异常,需要手工捕获。

  8. IndexOutOfBoundsException: 索引越界异常,当操作一个字符串或者数组的时候经常遇到的异常。

    它是运行时异常,不需要手工捕获。

  9. ArithmeticException: 算术异常,发生在数字的算术运算时的异常,如一个数字除以 0 就会报这个错。

    此异常虽然是运行时异常,可以手工捕获抛出自定义的异常,如:

    public static Timestamp from(Instant instant) { try { Timestamp stamp = new Timestamp(instant.getEpochSecond() * MILLIS_PER_SECOND); stamp.nanos = instant.getNano(); return stamp; } catch (ArithmeticException ex) { throw new IllegalArgumentException(ex); } }

  10. SQLException: SQL异常,发生在操作数据库时的异常。

    如下面的获取数据库连接时:

    public Connection getConnection() throws SQLException { if (getUser() == null) { return DriverManager.getConnection(url); } else { return DriverManager.getConnection(url, getUser(), getPassword()); } }

    它是受检查异常,需要进行手工捕获。

5. String常用的API

方法名说明
public int length​()返回此字符串的长度
public char charAt​(int index)获取某个索引位置处的字符
public char[] toCharArray​():将当前字符串转换成字符数组返回
public String substring(int beginIndex, int endIndex)根据开始和结束索引进行截取,得到新的字符串(包前不包后)
public String substring(int beginIndex)从传入的索引处截取,截取到末尾,得到新的字符串
public String replace(CharSequence target,使用新值,将字符串中的旧值替换,得到新的字符串
public String[] split(String regex)根据传入的规则切割字符串,得到字符串数组返回
public int indexOf(String str)返回此字符串中第一次出现指定子字符串的索引

6. 抽象类的特点?

  1. 没有方法体的方法为抽象方法
  2. 一个类如果有抽象方法,则这个类得是抽象类
  3. 如果一个类是抽象类,不一定有抽象方法
  4. 抽象类是父类可以强制要求其子类实现父类的所有抽象方法,定义了一组规则
  5. 子类未实现父类所有抽象方法则其也是抽象类 (只要子类没有把从父类继承的抽象方法全部实现(注意是全部实现),就必须也变成抽象类。)
  6. 抽象类不能直接通过new实例化

7. 抽象类和接口的区别

抽象类:abstract

  1. 抽象类不能被实例化
  2. 抽象类可以不含有抽象方法,但含有抽象方法的类必须是抽象类
  3. 抽象类的子类必须实现其抽象方法:如果一个类继承了抽象类,那么它必须强制实现抽象父类中所有的抽象方法,否则这个类也必须声明为抽象类

接口:interface

  1. 默认存放的是公开的抽象方法
  2. 属性来说,接口中存放的是静态常量
  3. 接口可以多重实现关键字 implements
  4. 1.8之后,接口中可以添加default和static
  5. 如果实现多个接口,接口中有相同名字default的方法则需要重写

8. 类与类的三种关系

  1. 继承:is a 一个类和另一个类是父子关系
  2. 依赖:use a 一个类是另一个类的方法的参数
  3. 关联:has a 一个类是另一个类的属性

9. CSS选择器都有哪些

id选择器,标签选择器,类选择器

10. 继承的关键字是什么,继承有什么特性?

  1. 继承的关键字 子类 extends 父类

  2. 继承的特性:

    1. 单一的,类之间父类只有一个
    2. 单向的,父类非私有的成员子类可以使用,子类的成员父类不能使用。

11. super关键字用法

  1. 出现在子类构造器中,实现调用父类构造方法,只能出现在第一行上,默认子类调用父类无参构造器。
  2. 出现在成员方法中,调用父类的方法,不用出现在第一行

12. final关键字用法

  1. final修饰方法不能被重写
  2. final修饰类不能被继承
  3. final修饰属性为常量不能被修改

13. 重写和重载的区别

  1. 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载 (Overloading)。

  2. 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写 (Overriding)。

  3. 发生在父子关系上
    (头大身子一样尾巴小:)

    子类访问权限不能比父类更严格,

    返回值类型,方法名,参数列表都与父类一致,

    不能抛出比父类更多的异常

  4. 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

14. 包装类的用途

  1. 包装类类型可以存放null
  2. 特定场合需要包装类,比如集合
  3. 包装类类型可以调用类中事先定义的方法

15. Java中static关键字的作用

  1. 静态成员变量,内存只有一份备份
  2. 静态成员可以直接类名调用
  3. 属性可不可以直接在静态方法中使用

16. Java中封装的作用和意义

  1. 作用: 属性私有化,公开get、set方法;

  2. 意义:

    1. 隐藏具体实现细节
    2. 提高数据安全性,不能随意为属性赋值

17. 构造器的作用和特点

构造方法(构造器)

  1. 特点:

    1. 没有返回类型
    2. 方法名和类名相同
    3. 在一个类中没有任何构造器时,系统默认给一个无参的构造方法;
    4. 当一个类中写了带参构造方法时,则系统默认无参构造器失效,需要无参构造器则显式声明
  2. 作用: 为属性赋值

18. String、StringBuffer、StringBuilder的区别

  1. String和StringBuffer的区别:
    可变性: String对象是不可变的,一旦创建,就无法修改;而StringBuffer和StringBuilder都是可变的,可以进行增删改操作。
    性能: 由于String是不可变的,每次对String进行操作都会创建一个新的String对象,因此在大量操作字符串的场景下,String的性能较低;而StringBuffer和StringBuilder的性能较高,因为它们可以在原有的对象上进行操作,避免了频繁创建新的对象。
  2. StringBuffer和StringBuilder的最大区别是线程安全性。
    StringBuffer是线程安全的,即它的每个方法都被synchronized关键字修饰,可以保证多个线程同时调用StringBuffer的方法时不会出现数据不一致的问题。这是因为在多线程环境下,如果有多个线程同时修改同一个StringBuffer对象,可能会出现数据竞争的问题,导致结果出现错误。而synchronized关键字可以保证每次只有一个线程可以访问该对象的方法,避免了数据竞争的问题。
  3. StringBuilder不是线程安全的,即它的每个方法都没有被synchronized关键字修饰,可以提供更高的性能。但是在多线程环境下,如果有多个线程同时修改同一个StringBuilder对象,可能会出现数据竞争的问题,导致结果出现错误。

因此,如果在单线程环境下进行字符串操作,建议使用StringBuilder,因为它的性能更高。如果在多线程环境下进行字符串操作,建议使用StringBuffer,以保证数据的一致性。

19. this关键字的作用

  1. this:当前对象的引用
  2. this构造方法中调用本类中的其他的构造方法
  3. 如果this调用本类其他构造器,则只能出现在构造方法的第一行上
  4. 在成员方法中,this.方法调用其他方法不必在第一行上

20. 字节读写和字符读写的区别

字节读写中文可能会造成乱码,而字符读写中文则不会

21. 常见集合有哪些,都有什么特点?

  1. List:元素是有序的,可以存放重复元素,可以存放多个null;

  2. ArrayList、LinkedList、Vector的区别:

    1. ArrayList是基于动态数组的数据结构,连续存储,适用于频繁查询和修改数据,线程不安全
    2. LinkedList是基于链表的数据结构,非连续存储,适用于频繁插入、删除数据,线程安全
    3. Vector和ArrayList都属于可变数组,在增长数组时,Vector增长为原数组的一倍,而ArrayList只会增长为原来的一半,节约内存空间,是线程安全

Map:是键值对形式的,无序的,value可以重复,key值如果重复则后value覆盖前value;
Set:元素是无序的,不可存放重复数据;

22. == 和equals的区别

  1. "=="用于比较的是变量或对象在内存中存储的地址,如果地址相同,则返回true,否则返回false。
  2. "equals"用于比较两个对象是否在逻辑上相等。通常情况下,使用equals方法可以更准确地比较两个对象的内容是否相同。

23. 如何理解MySQL的LIMIT关键字,两个参数对应是什么作用

LIMIT关键字是MySQL独有的,第一个参数是起始的索引值(从0开始计算),第二个参数是一次取几条数据

24. 访问servlet的方式

  1. 地址栏直接打印——get
  2. 超链接访问——get
  3. form提交——默认是get但是可选post

25. 关于异常的处理机制

try 监视可能发生异常的语句块

catch处理异常的代码 多重catch粒度越大越往下放, 只会进到catch的某一个分支

finally块 不管是否有异常,异常是否被处理了,都要执行的代码

throw在方法体中手动抛异常

throws
声明该方法可能出现的异常
将方法中的异常抛给调用者,调用者再考虑解决异常还是向上抛

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值