0
点赞
收藏
分享

微信扫一扫

面试题(1)

狐沐说 2022-03-23 阅读 63
java

1.Java基础

1.1 面向对象的特征?

  • 封装:就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或者不该告诉别人的东西隐藏起来,把可以告诉别人的公开,别人只能用我提供的功能实现需求,而不知道是如何实现的.增加安全性. 简单的来说就是合理隐藏,合理暴露
  • 继承:子类继承父类的数据属性和行为,并能根据自己的需求扩展出新的行为,提高了代码的复用性.
  • 多态:指允许不同的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的方式(发送消息就是函数调用).封装和继承几乎都是为多态而准备的,在执行期间引用对象的实际类型,根据其实际的类型调用其相应的方法.
  • 抽象:表示对问题领域进行分析,设计中得出的抽象的概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象.在Java中抽象用abstract关键字来修饰,此类就不能被实例化,从这里可以看出,抽象类(接口)就是为了继承而存在的.

1.2 Java的基本数据类型有哪些?

  • 整型 byte short int long
  • 浮点型 float double
  • 布尔型 boolean
  • 字符型 char

1.3 JDK JRE JVM的区别

在这里插入图片描述

  • JDK(Java Development Kit)是整个Java的核心,是java开发工具包,包括了Java运行环境JRE,Java工具和Java基础类库
  • JRE(Java Runtime Environment)是运行JAVA程序所必须的环境的集合,包含java虚拟机和java程序的一些核心类库
  • JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序.

1.4 重载和重写的区别

  • 重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时.
  • 重写:发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类.抛出的异常范围小于等于父类.访问修饰符范围大于等于父类;如果父类方法访问修饰符为private则子类就不能重写该方法.

1.5 Java中= = 和equals的区别

  • = = 的作用:
    基本类型:比较的就是值是否相同
    引用类型:比较的就是地址值是否相同
  • equals的作用
    引用类型:默认情况下,比较的是地址值, 特:String,Integer,Date这些类库中equals被重写,比较的是内容而不是地址!
  • 面试题:请解释字符串比较之中"= = "和equals()的区别?
    = :比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;equals():比较的是两个字符串的内容,属于内容比较.

1.6 String StringBuffer StringBuilder三者之间的区别

  • String 字符串常量
    String中的String类中使用final关键字修饰字符数组来保存字符串,private final char value[] ,String对象是不可变的,也就可以理解常量,线程安全.
    AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity,append,insert,indexOf等公共方法.
  • StringBuffer 字符串变量(线程安全)
    对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的
  • StringBuilder 字符串变量(非线程安全)
    并没有对方法进行加同步锁,所以是非线程安全的.
  • 小结:
    (1) 如果要操作少量的数据用String
    (2)多线程操作字符串缓冲区下操作大量数据用StringBuffer
    (3)单线程操作字符串缓冲区下操作大量数据用StringBuider

1.7 接口和抽象类的区别是什么?

  • 实现: 抽象类的子类使用extends来继承;接口必须使用implements来实现接口.
  • 构造函数:抽象类可以有构造函数;接口不能有.
  • main方法:抽象类可以有main方法,并且我们能运行它,接口不能有main方法.
  • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类
  • 访问修饰符:接口中的方法默认使用public修饰,抽象类中的方法可以是任意访问修饰符.

1.8 String常用的方法有哪些?

  • indexOf():返回指定字符的索引
  • charAt():返回指定索引处的字符
  • replace():字符串替换
  • trim():去除字符串两端空白
  • split():分割字符串,返回一个分割后的字符串数据
  • getBytes():返回字符串的byte类型数组
  • length():返回字符串长度
  • toLowerCase():将字符串转成小写字母
  • toUpperCase():将字符串转成大写字母
  • substring():截取字符串
  • equals():字符串比较

1.9 什么是单例模式?有几种?

单例模式:某个类的实例在多线程环境下只会被创建一次出来
单例模式有饿汉式单例模式,懒汉式单例模式和双检锁单例模式

  • 饿汉式:线程安全,一开始就初始化
public class Singleton{
	private static Singleton instance = new Singleton();
	private Singleton(){}
	public static Singleton getInstance(){
		return instance;
	}
}
  • 懒汉式:非线程安全,延迟初始化
public class Singleton{
	private static Singleton instance;
	private Singleton(){

	public static Singleton getInstance(){
		if(instance == null){
			instance = new Singleton();
	}
	return instance;
	}
}
  • 双检锁:线程安全,延迟初始化
public class Singleton{
	private volatile static Singleton singleton;
	private Singleton(){}
	public static Singleton getSingleton(){
		if(singleton == null){
			synchronized(Singleton.class){
				if(singleton == null){
					singleton = new Singleton();
		}
		}
		}
		return singleton;
	}
}

1.10 反射

在Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制
获取Class对象的3中方法: 
(1)调用某个对象的getClass()方法
Person p = new Person();
Class clazz = p.getClass();
(2)调用某个类class属性来获取该类对应的Class对象
Class clazz = Person.class;
(3)使用Class类中的forName()静态方法(最安全/性能最好)
Class clazz = Class.forName("类的全路径");(最常用)

1.11 jdk1.8的新特性

  • (1)Lambda表达式
    Lambda允许把函数作为一个方法的参数
new Thread(()->System.out.println("abc")).start();
  • (2) 方法引用
    方法引用允许直接引用已有Java类或对象的方法或构造方法
1. ArrayList<String> list = new ArrayList<>();
2.    list.add("a");
3.    list.add("b");
4.    list.add("c");
5.    list.forEach(System.out::println);System.out::println方法作为静态方法来引用
  • (3) 函数式接口
    有且仅有一个抽象方法的接口叫做函数式接口,函数式接口可以被隐式转换为Lambda表达式.通常函数式接口上会添加@Functionallnterface注解.
  • (4) 接口允许定义默认方法和静态方法
    从JDK8开始,允许接口中存在一个或多个默认非抽象方法和静态方法
  • (5) Stream API
    新添加的Stream API(Java.util.stream) 把真正的函数式编程风格引入到Java中.这种风格将要处理的元素集合看做一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等.
  • (6) 日期/时间类改进
    之前的JDK自带的日期处理类非常不方便,我们处理的时候经常是使用的第三方工具包,比如commons-lang包等.不过JDK8出现之后这个改观了很多,比如日期时间的创建,比较,调整,格式化,时间间隔等
    这些类都在java.time包下,LocalDate/LocalTime/LocalDateTime
  • (7) Optional类
    Optional类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象.
String string = "abc";
Optional<String> optional = Optional.of(string);
boolean present = optiona.isPresent();
String value = optional.get();
System.out.println(present+"/"+value);
  • (8) Java8 Base64实现
    Java 8 内置了Base64编码的编码器和解析器

1.12Java的异常

Throwable是所有的Java程序中错误处理的父类,有两种子类:Error和Exception
  • Error:表示有JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息.
  • Exception:表示可恢复的例外,这是可捕捉到的.
    • (1)运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常),IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理.这些异常一般是有程序逻辑错误引起的,程序应该从逻辑角度尽可能 避免这类异常的发生.运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过.
    • (2)非运行时异常(编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类.从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过,如IOException,SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常
  • 常见的RunTime异常几种如下:
    * NullPointerException - 空指针引用异常
    * ClassCastException - 类型强制转换异常
    * lllegalArgumentException - 传递非法参数异常
    * ArithmeticException - 算数运算异常
    * ArrayStoreException -向数组中存放与声明类型不兼容对象异常
    * IndexOutOfBoundsException -下标越界异常
    * NegativeArraySizeException -创建一个大小为负数的数组错误异常
    * NumberFormatException - 数字格式异常
    * SecurityException - 安全异常
    * UnsupportedOperationException - 不支持的操作异常
举报

相关推荐

0 条评论