JavaSE基础知识点 三(5.16)

24 篇文章 0 订阅
6 篇文章 0 订阅
本文探讨了Java中的堆和栈的区别,IO模型(BIO/NIO/AIO)对比,Queue中poll()和remove()的差异,以及迭代器Iterator的使用。同时涵盖了线程、进程、线程状态、死锁、序列化、动态代理、反射机制、final/finally/finalize、异常处理和Java反射获取方法。
摘要由CSDN通过智能技术生成

1.堆和栈的区别

堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

{堆是指程序运行是申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方。

队列:先进先出,栈:先进后出  

2.Java中的IO

BIO 传统IO,同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

NIO,同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

AIO(NIO2.0) 非同步非阻塞 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,

3.在 Queue 中 poll()和 remove()有什么区别?

poll()和remove()方法都是从队列中取出一个元素
poll()在获取失败的时候会返回空null
remove()方法在获取数据失败的时候抛出异常

4.迭代器 Iterator 是什么?怎么使用?

是什么?

  • Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
  • Iterator接口提供很多对集合元素进行迭代的方法,每一个集合类都包含了可以返回迭代器实例的迭代方法。
  • 迭代器可以在迭代的过程中删除底层集合的元素,但是不可以删除直接调用集合的remove(Object obj)删除,可以通过迭代器的remove()方法删除

怎么使用?

/第一种
Iterator iterator = list.iterator();
        while(iterator.hasNext()){
            String string = iterator.next();
            //do something
        }

//第二种
for(Iterator it = c.iterator(); it.hasNext(); ) {
  Object o = it.next();
   //do something

5.线程和进程的区别?
在这里插入图片描述

  • 进程是执行中的一个应用程序,是程序的一种动态形式,是CPU、内存等资源占用的基本单位,而且进程之间相互独立,通信比较困难,进程在执行的过程中,包含比较固定的入口、执行顺序、出口等
  • 进程表示资源分配的基本概念,又是调度原型的基本单位,是系统中并发执行的单位。
  • 线程是进程内部的一个执行序列,属于某个进程,线程是进程中执行运算的最小单位。一个进程可以有多个线程,线程不能占用CPU、内存等资源。而且线程之间共享一块内存区域,通信比较方便,线程的入口执行顺序这些过程被应用程序所控制。

6.线程有哪些状态

新建状态: 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序 start 这个线程。
就绪状态:当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。
运行状态:当一个新状态的线程被 start 以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务
休眠状态:由于一个线程的时间片用完了,该线程从运行状态进入休眠状态。当时间间隔到期或者等待的时间发生了,该状态的线程切换到运行状态。
终止状态:一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态。

7.什么是死锁?

  • 死锁的定义是:在一个进程组内,每个进程都在等待只有其他进程才能引发的事件,那么该进程组处于死锁状态。
  • 有两个线程(或者更多的线程),每个线程都在等待被其他线程占用的资源。
  • 比如:线程A有1号资源,它还想要2号资源;线程B有2号资源,它还想要1好资源;从而两个线程在互相等待对方的资源,都不给对方让资源,却又都得不到,就会导致这两个线程处于死锁状态。

8.java什么时候需要实现序列化,如何实现?

把一个对象写入数据源或者将对象从数据源读出来,序列化对象要实现serializable接口(标志性接口,方法为空)

9.动态代理是什么?有哪些应用?怎么实现?

当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

动态代理的应用: Spring的AOP、加事务、加权限、加日志

实现:首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回

10.对Java反射的理解

  • 反射就是把java类中的各种成分映射成一个个的Java对象
  • Java中的反射首先要能获取到Java重要反射的类的字节码,通过,Class.forName(类的全名称),类名.class和ths.getClass(),然后把字节码中的方法,变量,构造函数等映射成相应的类,然后就可以调用丰富的方法。
  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

11.Java获取反射的三种方法

1.通过new对象实现反射机制
2.通过路径实现反射机制
3.通过类名实现反射机制

public class Student {
    private int id;
    String name;
    protected boolean sex;
    public float score;
}
public class Get {
    //获取反射机制三种方式
    public static void main(String[] args) throws ClassNotFoundException {
        //方式一(通过建立对象)
        Student stu = new Student();
        Class classobj1 = stu.getClass();
        System.out.println(classobj1.getName());
        //方式二(所在通过路径-相对路径)
        Class classobj2 = Class.forName("fanshe.Student");
        System.out.println(classobj2.getName());
        //方式三(通过类名)
        Class classobj3 = Student.class;
        System.out.println(classobj3.getName());
    }
}

12.final, finally 和 finalize 的区别

  • final用于声明属性,方法和类,表示属性不可变,方法不可被重写,类不可被继承。
  • finally 是异常处理语句结构的一部分,表示总是执行。
  • finalize是 object 类的一个方法,在垃圾收集器执行的时候会调用这个对象回收的方法,工垃圾收集时其他资源的回收,比如关闭文件。

13.Java中的异常

Error和Exception有什么区别?

  • Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

  • Error:是JVM发生问题…程序员是无法修复的…

  • Exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

  • Exception:是异常可以修复的代码…

Java中的异常处理关键字是什么

  • throw:有时我们明确要创建异常对象然后抛出它来停止程序的正常处理。throw关键字用于向运行时抛出异常来处理它
  • throws:我们可以在throws子句中提供多个异常,也可以与main()方法一起使用。
  • try-catch:我们在代码中使用try-catch块进行异常处理。try是块的开始,catch是在try块的末尾处理异常。我们可以使用try有多个catch块,try-catch块也可以嵌套。catch块需要一个应该是Exception类型的参数。
  • finally:finally块是可选的,只能用于try-catch块。由于异常会暂停执行过程,因此我们可能会打开一些不会关闭的资源,因此我们可以使用finally块。finally块总是被执行,无论是否发生异常。

常见异常类

Throwable
├ Error  

│ ├ IOError
│ ├ LinkageError
│ ├ ReflectionError
│ ├ ThreadDeath
│ |- VirtualMachineError

├ Exception  
│ ├ CloneNotSupportedException
│ ├ DataFormatException
│ ├ InterruptedException
│ ├ IOException
│ ├ ReflectiveOperationException
│ ├ RuntimeException  运行期异常
│    ├ ArithmeticException
│    ├ ClassCastException
│    ├ ConcurrentModificationException
│    ├ IllegalArgumentException
│    ├ IndexOutOfBoundsException
│    ├ NoSuchElementException
│    ├ NullPointerException
│ |- SecurityException
│ |- SQLException

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值