Java_抻透

基础模块

1、Java虚拟机(JVM)

Java虚拟机是一个可以执行Java字节码的虚拟机进程。JVM可以安装在任意平台,Java语言被编译成非寻常的二进制码,只要JVM实现了跨平台,那么Java语言就可以跨平台。

2、JDK、JRE、JVM关系

在这里插入图片描述
JDK:Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE;
JRE:Java运行环境,提供了运行Java应用程序所必须的软件环境,包含JVM和丰富的系统类库。
JVM:Java虚拟机,提供了字节码文件.calss的运行支持。

3、栈内存和堆内存的区别

1)定义:

  • 栈内存:是内存中的一块存储区域,存储的是局部变量,如果局部变量离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。
  • 堆内存:是内存中的一块存储区域,存储的是数组和实体(凡是new建立的都在堆中),实体封装多个属性,如果一个属性消失,这个实体也没有消失,还可以用,所以堆不会被随时释放。会定期被垃圾回收机制回收。
  • 2)区别:

  • 存储对象不同,栈存储的是局部变量,堆存放的是实体
  • 内存释放方式不一样,栈内存局部变量消失后,内存回收。堆内存实体没有了,内存暂不回收
  • 内存回收机制不一样,栈内存是生命周期结束会释放,堆内存存放的实体会被垃圾回收机制不定时回收。
  • 4、Java内存和虚拟机

    Java编译器将.java文件转成.class文件,也就是字节码文件,然后将方法导入。在程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的相关信息和数据,这部分就是java内存,而内存的管理也就是对这部内存的分配及回收等。
    内存管理包括:程序计数器,堆内存,栈内存,方法区。

    1)程序计数器(PC寄存器):保存的是当前执行指令的地址(也可以说是下一条指令所在的存储单元的地址),当CPU需要执行指令时,就依据指令存储地址找到指令并执行,此时程序计数器+1,或者指针指向下一个指令的地址,如此执行完所有的程序。程序计数器是线程私有的,对于非本地方法,程序计数器存储的是指令地址,对于本地方法,程序计数器存储的是空值。且程序计数器中存储的数据所占空间大小不会随着程序执行而发生变化,所以不会产生溢出。

    2)Java栈存放栈帧(包括局部变量表,操作数栈,常量池的引用,方法返回地址,额外附加信息)

  • 局部变量表:存储一些方法中的局部变量(方法中声明的非静态变量及函数形参);如果是常量,则直接存储,如果是引用,则存储引用地址;局部变量表大小在编译器就可以确定,因此在程序执行期间大小不变。
  • 操作数栈:方法执行前,操作数栈是空的,执行中,各种*字节码指令*向操作栈中写入和提取内容。
  • 常量池的引用:方法运行过程中,用到*类的常量*
  • 方法返回地址:返回调用该方法的位置。
  • 每个线程都有一个Java栈。
    当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压入栈,当方法执行完毕之后,便会将栈帧出栈。这个区域有两个异常情况:

  • 线程请求深度大于虚拟机所允许的深度,抛出StackOverflowError异常。
  • 虚拟机在动态扩展时无法申请到足够的内存空间,抛出OutOfMemoryError异常。
  • 3)本地方法栈:和Java栈类似,为本地方法服务。
    4)堆存放对象本身及数组(数组引用在Java栈中),堆栈在物理上不一定连续,在逻辑上连续;且堆被线程共享。如果堆内存不够且不能扩展时,会抛出OutOfMemoryError异常。
    5)方法区存放类的信息(名称,方法信息,字段信息)、静态变量、常量、编译后的代码;方法区被线程共享

    5、Java内存溢出测试

    在这里插入图片描述

    6、hashmap和hashtable的区别

    两者都是是一个散列表,存储的内容是键值对映射;
    两者的底层存储原理都是哈希表(数组+链表);

    继承的父类线程安全性是否提供contains方法key和value是否允许null值内部实现hash值
    hashmap继承自AbstractMap类非同步,不安全允许使用了 Iterator重新计算hash值
    hashtable承自Dictionary类同步的,可以多线程访问,安全不允许使用了 Iterator和Enumeration的方式直接使用对象的hashCode

    7、抽象类和接口

    1)抽象类:若子类拥有共同特性,可以把这个特性放到一个抽象类中,子类继承此抽象类。可以理解为对整体的抽象,比如抽象类:飞机,鸟。

  • 抽象类不能实例化,不能用来创建对象,但是有构造函数;
  • 抽象类可以包含抽象成员和其他成员,抽象类成员修饰符不能是private;
  • 子类继承父类后,必须把父类中所有抽象成员重写(非抽象成员不必重写),除非子类也是抽象类;
  • 抽象方法不能定义主体。
  • 2)接口:当多个类都具有某一个功能,就可以把该功能设置为接口,使用接口主要是为了实现多态。可以理解为某一共同功能,比如接口:飞。

  • 接口中只能包含方法,且不能有任何实现;
  • 接口中的成员不能有任何访问修饰符;
  • 接口不能被实例化,但是可以多继承;
  • 实现接口的类,必须实现接口所有的成员。
  • 3)区别

    参数默认方法实现实现构造器与正常Java类的区别访问修饰符main方法多继承速度添加新方法
    抽象类可以有默认方法实现子类使用extends关键字来继承抽象类,如果子类不是抽象类,它需要提供抽象类中所有声明的方法的实现。有构造器除了不能实例化抽象类之外,和普通Java类没有任何区别public,protected和default修饰符有main方法,可以实现抽象方法可以继承一个类和实现多个接口较快如果往抽象类中添加新的方法,可以给它提供默认的实现,因此不需要改变现在的代码
    接口接口完全抽象,不存在方法实现子类使用关键字implements来实现接口,它需要提供接口中所有声明的方法的实现无构造器接口是完全不同的类型public无main方法,不能实现只可以继承一个或多个其他接口比较慢如果往接口中添加方法,那么必须改变实现该接口的类

    8、继承、实现、依赖、关联、聚合、组合的联系和区别

    1)继承:类(子类,子接口)继承另外一个类(父类,父接口)功能,并且还可以扩展自己的功能;关键字:extends
    2)实现:一个类实现接口(可以是多个)的功能;关键字:implements;
    3)依赖:两者间比较临时的关系,比如:坐火车去外地,我+火车关系。
    4)关联:两者之间比较长久的关系,比如:朋友关系。
    5)聚合:部分与整体的关系,但是整体和部分可分,比如:鸟群+鸟。
    6)组合:部分与整体的关系,是一种强聚合,比如:鸟+翅膀。

    9、浅拷贝和深拷贝

    1)浅拷贝只是对指针的拷贝,拷贝后指针指向同一个内存空间。
    2)深拷贝不但对指针进行拷贝,还对指针指向的内容进行拷贝。拷贝后的指针是指向两个不同地址的指针。

    10、Java四大特性

    1)封装:面向对象的核心思想,将对象的属性和行为封装起来;
    2)继承:类与类之间的关系;
    3)多态:不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式;
    4)抽象:把客观事物用代码抽象出来(包括数据抽象和行为抽象)

    11、String、StringBuffer、StringBuilder

    1)这三者都是操作字符串。不同的是String直接创建字符串常量,不能改变,存放在方法区(常量),而后来两者创建的是字符串变量,是可改变的对象,存放于堆区
    2)StringBuffer:线程安全,慢速;
    3)StringBuilder:线程不安全,快速;(因为我们常在单线程下操作,因此常选用这位同志
    4)三者选用:
    少量数据:String
    单线程、大量数据 :StringBuilder
    多线程、大量数据:StringBuffer

    面试模块

    1、Java基本数据类型

    8位-Byte
    16位-short、char
    32位-int,float
    64位-double,long
    boolean

    2、反射

    1)Java反射就是在运行过程中,对于任意一个类,都能够知道这个类所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,且能够改变它的属性。
    2)作用:可以更灵活地编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还可以实现动态代理;但是反射使用不当会造成较高的资源消耗

    3、Java实现多线程的两种方法

    1)继承Thread类

  • 自定义类MyThread继承Thread类
  • MyThread类里面重写run()方法
  • 在测试类MyThreadTest中创建MyThread类的对象
  • 启动线程
  • 2)实现Runnable接口

  • 自定义类MyRunnable实现Runnable接口
  • MyRunnable类里面重写run()方法
  • 在测试类MyRunnableTest中创建MyRunnable类的对象
  • 在测试类MyRunnableTest中再创建Thread类的对象,并把3步骤的对象作为构造参数进行传递
  • 启动线程
  • run()方法和start()方法的区别?
    答:run()方法直接调用仅仅是普通方法。start()方法是先启动线程,再由jvm去调用run()方法。
    有了方式1,为什么还来一个方式2呢?
    答:若自定义类MyThread类已经有一个父类了,那么它就不可以再去继承Thread类了。(java不支持多继承)。
    若自定义类MyRunnable类已经实现了一个接口了,那么它还可以再去实现Runnable接口。(java支持多实现)。
    即可以避免由于Java单继承带来的局限性。

    4、程序开发中的同步和异步的概念

    同步和异步局限于线程:
    1)同步:指的是协同步调,相互配合,按先后顺序执行;就是发出一个功能调用时,没有得到返回结果前一直等待,不会继续往下执行。(类似讨论问题
    2)异步:发出功能调用时,不管得没得到结果都继续往下执行。(类似吵架

    5、类的序列化和反序列化

    防止对象在程序终止后被垃圾收集器销毁,可以通过序列化将数据转换为字节流,从而在不重新创建对象的情况下调用该类。

    6、内存泄漏的原因

    1)内存泄漏:无用的对象占用的空间无法被回收;
    2)原因:长生命周期的对象持有短生命周期对象的引用;
    3)具体场景:静态集合类、监听器、各种连接、内部类和外部模块引用、单例模式。

    7、Bean创建对象的2种方法

    1)JavaBean是一个遵循特定写法的Java类,通常具有如下特点:
    具有无参构造函数;
    属性必须私有化;
    私有化的属性必须通过public类型的方法暴露给其他程序,并且方法的命名也必须遵守一定的命名规范。
    2)实现方法
    使用类的无参数构造创建(主要使用
    使用静态工厂创建
    使用实例工厂创建

    8、springMVC

    1)定义:springMVC是一种web层mvc框架,用于代替servlet(处理、响应请求,获取表单参数,表单校验)
    2)作用:简化编程,相对于servlet,获取表单参数、响应请求变得简单了。
    3)工作原理:
    在这里插入图片描述
    1)客户端(浏览器)发送请求,直接请求到DispatcherServlet。
    2)DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。
    3)解析到对应的Handler后,开始由HandlerAdapter适配器处理。
    4)HandlerAdapter会根据Handler来调用真正的处理器来处理请求,并处理相应的业务逻辑。
    5)处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View。
    6)ViewResolver会根据逻辑View查找实际的View。
    7)DispaterServlet把返回的Model传给View。
    8)通过View返回给请求者(浏览器)

    9、Socket编程

    socket编程是网络中常用的编程,通过在网络中创建socket关键字来实现网络间通信。Java环境下,Socket编程主要指基于TCP/IP协议的网络编程;一个Socket由一个IP地址和一个端口号唯一确定。

    10、集合类型

    1)Java容器分类
    在这里插入图片描述
    2)ArrayList的底层是数组,LinkedList的底层是双向链表;
    访问速度:ArrayList>LinkedList
    增删速度:ArrayList<LinkedList(常规情况
    附:LinkedList的主要消耗在遍历上,ArrayList的主要消耗在移动和复制。如果增删在尾部或者中部,则ArrayList快。

    3)List和Map的区别
    共同点:都是Java常用的容器,都是接口。

    类型名存储结构元素是否可以重复是否有序
    List存储单列的集合可以有序
    Map存储<key,value>键值对的集合不可以无序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值