Java基础知识(面试)

1.Java的八大数据类型

整型:short,byte,int,long
包装类:Short,Byte,Integer,Long
字符:char
包装类:Character
浮点:float,double
包装类:Float,Double
布尔型:boolean
包装类:Boolean

2.bean工厂和工厂bean的区别

BeanFactory

BeanFactory是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器实现提供了最基本的规范,例如DefaultListableBeanFactory,XmlBeanFactory, ApplicationContext 等具体的容器都是实现了BeanFactory,再在其基础之上附加了其他的功能。BeanFactory是个Factory,也就是 IOC 容器或对象工厂,所有的 Bean 都是由 BeanFactory( 也就是 IOC 容器 ) 来进行管理。
FactoryBean
是一个能生产或者修饰生成对象的工厂Bean(本质上也是一个bean),可以在BeanFactory(IOC容器)中被管理,所以它并不是一个简单的Bean。当使用容器中factory bean的时候,该容器不会返回factory bean本身,而是返回其生成的对象。要想获取FactoryBean的实现类本身,得在getBean(String BeanName)中的BeanName之前加上&,写成getBean(String &BeanName)。

3.生命周期

  1. 创建阶段(Created):创建Java对象
    1. 为对象分配内存空间。
    2. 构造对象。
    3. 从超类到子类对static成员进程初始化,类的static成员的初始化在ClassLoader加载该类时进行。
    4. 超类成员变量按顺序初始化化,递归调用超类的构造函数。
    5. 子类成员变量按顺序初始化,一旦对象被创建,子类的构造函数就调用该对象并为一些变量赋值。完成以上这些后对象的状态就切换到了应用阶段InUse。
  2. 应用阶段(InUse):对象至少被一个强引用持有,除非显示的使用软引用、弱引用、虚引用。
  3. 不可见阶段(Invisible):不可见阶段的对象在虚拟机的对象根引用集合中再也找不到直接或者间接的强引用,最常见的就是线程或者函数中的临时变量。
  4. 不可达阶段(Unreachable):指对象不再被任何强引用持有,GC发现该对象已经不可达。
  5. 收集阶段(Collected):GC发现对象处于不可达阶段并且GC已经对该对象的内存空间重新分配做好准备,对象进程收集阶段。如果,该对象的finalize()函数被重写,则执行该函数。
  6. 终结阶段(Finalized):对象的finalize()函数执行完成后,对象仍处于不可达状态,该对象进程终结阶段。
  7. 对象内存空间重新分配阶段(Deallocaled):GC对该对象占用的内存空间进行回收或者再分配,该对象彻底消失。

4.常用注解

@SpringBootApplication:启动类注解
@Repository;
@Service;
@RestController;
@component 其他不属于以上三类的类,但是会同样注入spring容器以被获取使用。
@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings - 指示编译器去忽略注解中声明的警告。
@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
@Documented - 标记这些注解是否包含在用户文档中。
@Target - 标记这个注解应该是哪种 Java 成员。
@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

5.hash map底层原理以及hash冲突

Hash map 底层采用的是链表+数组+红黑树

首先有一个每个元素都是链表的数组,当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这就是hash冲突,这时就添加到同一hash值的元素的后面,他们在数组的同一位置,但是形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率。

红黑树(Red Black Tree)是一种自平衡的二叉搜索树(Self-balancing Binary Search Tree)。以前也叫做平衡二叉 B 树(Symmetric Binary B-tree)。二叉搜索树,它的特点是任何一个结点的值都大于其左子树的所有结点的值,任何一个结点的值都小于其右子树的所有结点的值。

6.Java 集合有哪些

1、List列表:有序的,可重复的;
2、Queue队列:有序,可重复的;
3、Set集合:不可重复;
4、Map映射:无序,键唯一,值不唯一
单列集合和双列集合
单列集合(集合HashSet):
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)

双列集合(例如HashMap):
1.Map集合是双列集合,是以键值对的形式存储数据的,关于键值对可以简单的理解为数学学的映射关系
2.Map集合中key值不能重复的,同时,key所对应的值至多为一个

7.future task的使用

通过调用异步任务new FutureTask()来实现异步获取数据或者其他操作,最后主流程使用future.get()来同步阻塞获取异步得到的结果,最后实现多个异步线程完成相应任务,然后在主线程中实现全部流程。

8. final的使用

定义:Java中,final 表示最终,也可以称为完结器,表示对象是最终形态的,不可改变的意思。
用途:final 应用于类、方法和变量时意义是不同的,但本质是一样的,都表示不可改变。

1)final 修饰变量,表示变量的值不可改变,此时该变量可被称为常量。
2)final 修饰方法,表示方法不能被子类重写;
重写概念:子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写,又称为方法覆盖。
3)final 用在类的前面表示该类不能有子类,即该类不可以被继承。

9.Java加载类的过程

类加载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件,在java中类装载器把类装入JVM,经过以下步骤:
1、加载:查找和导入Class 文件
2、链接:其中解析步骤是可以选择的:
(a)检查:检查载入的class文件数据的正确性
(b)准备:给类的静态变量分配存储空间
©解析:将符号引用转成直接引用。
3、初始化:对静态变量,静态代码块执行初始化工作

类加载的生命周期:加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照此顺序。

10.set底层原理

底层原理是Hash表实现的,存储元素的顺序不是按照存入的顺序,而是按照哈希值来存取数据(无序),哈希值通过hashcode方法获取。判断两个元素是否相等时,首先比较两个元素的哈希值是否相等,再比较equals方法,如果返回的是true,则两个元素对象相等,视为同一个元素。所以,HashSet添加一个元素时,当哈希值相同,equals为false时,添加的元素在相同的哈希值下顺延,即存一列(放在同一个哈希桶中);当哈希值不同,equals返回true时,也会存入到不同哈希值下并添加成功;都相同时则视为同一元素,添加失败。同时,线程是不安全的。

11.对象的三大特性

  • 封装
    定义:
    将类的某些信息隐藏在类内部(private),不允许外部程序直接访问,而是通过该类提供的公共属性(public)来实现对隐藏信息的操作和访问。
    封装的意义:
    1、保护或防止代码(数据)在无意中被破坏
    2、隐藏方法实现细节
    3、封装可以使对象拥有完整的属性和方法
    原则:
    高内聚:指一个模块(类)内部各个部分之间的关联程度 高
    低耦合:指各个模块(类)之间的关联程度 低

  • 继承
    定义:
    一个类具有另一个类的属性和方法,这个类叫子类(派生类),被继承的另一个类叫父类(基类、超类)
    继承的意义:
    解决功能重复问题

  • 多态
    定义:
    表示当同一个操作作用在不同对象的时候,会出现不同的语义
    常见的表现方式
    重载(Overload)
    同一个类中有多个同名的方法,但这些方法有着不同的参数,因此可以在编译的时候就确定到底调用哪个方法,它是一种编译时多态。重载可以被看作一个类中的方法多态性。
    重写(Override)
    子类可以重写父类的方法,因此同样的方法会在父类与子类中有着不同的表现形式。而且只有在运行时才能确定调用的是哪个方法,所以方法重写实现的多态也被称为运行时多态。

12.抽象类和接口有什么区别?

首先先来说一下抽象类
要想了解抽象类先看一下抽象方法,抽象方法是一个特殊的方法,他只有声明没有具体的实现。抽象方法用abstract关键字修饰。有抽象方法的类就就是抽象类,抽象类也有abstract关键字修饰。
需要注意的是,
1,抽象类的存在就是为了继承,所以用private方法来修饰抽象方法。
2,包含抽象方法的类叫做抽象类,但并不是抽象类里只有抽象方法。
3,子类继承了抽象类必须实现父类的抽象方法,如果没有实现,那么子类也将会是抽象类。
4,抽象类不能用来创建对象。
再来看一下接口:
接口用关键字interface来实现,接口指的是调用别人的方法或者函数。接口可以看出java是一种对行为的抽象。
接口需要注意的是:
1,接口中可以有变量和方法,并且接口中的变量会被隐式的被public static final来修饰(并且只能用public static final来修饰),方法会隐式的被public abstract来修饰,并且只能用来public abstract来修饰。也就是说接口中所有的方法不能有实现方法,也就是说接口中的方法都是抽象方法。
2,如果要写这个接口的实现方法,需要定义一个实现类,并且通过implements来实现接口中的方法。
重点来了,看完上面就可以看出接口和抽象类的区别了。
主要区别:
 1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
  2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
  3)抽象类是一个类,而接口不是类。

13.设计模式

(1)单例模式
单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例。单例模式的优点在于:

  • 系统中只存在一个共用的实例对象,无需频繁创建和销毁对象,节约了系统资源,提高系统的性能
  • 可以严格控制客户怎么样以及何时访问单例对象。

应用实例:
Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值