数组和链表的区别
数组是将元素在内存中连续存储的
优点是:
因为数据是在内存中连续存储的,内存地址连续,所以在查询数据的时候效率很高;
缺点是:
在存储之前我们需要申请一块连续的内存空间,并且在编译的时候就需要确定好它的空间的大小。在运行的时候空间的大小是无法随着你的需要进行增加和减少而改变的,当数据量比较大的时候,肯能会出现越界的情况,数据比较小的时候,又有可能浪费掉内存空间。在改变数据的个数的时候,增删改的效率较低。
链表是动态的申请内存空间,不需要像数组那样提前申请好内存的大小,链表只需要在用的时候申请就可以,可以根据需要来动态的申请或者删除内存空间,对于数据的增加和删除以及插入比数组要灵活。还有就是链表中数据在内存中可以在任意的位置,通过应用来关联数据(就是通过存 在元素的指针来联系)
堆和栈有什么区别
1.栈内存存储的是局部变量而堆内存存储的是实体
2.栈内存的更新速度快于堆内存,因为局部变量的生命周期很短
3.栈内存存放的变量的生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。
方法区存放什么东西
1.方法区又叫做静态区,包含所有的class文件和static变量;
2.方法区中包含的都是在整个程序中永远唯一的元素,例如class和static变量。
3.运行的时候常量池都分配在java虚拟机的方法区中。
知道的设计模式有哪些
java中一般有23种设计模式
创建型模式有五种:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。
结构型模式七种:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
行为型模式十一种:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介模式,解释器模式。
说说对于反射的理解
Java中反射首先是能够获取到Java中要反射类的字节码,获取字节码的方式有三种。
1.Class.forName(className)
2.类名.class
3.this.getClass()。
然后将字节码中的方法,变量,构造函数等映射成响应的Method,Filed,Constructor等类,这些类提供了丰富的方法可以让我们使用。
线程和进程的区别
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位。
线程:是进程的一个实体,是cpu调度和分派的基本单位,是比进程更小的可以独立运行的基本单位。
特点:线程的划分尺度小于进程,这使得多线程具有高并发性,进程在运行的时候各自内存单元相互独立,线程之间共享,这使得多线程可以有更好的性能和用户体验,多线程编程对于其他程序不友好,会占据大量的cpu资源。
ArrayList和LinkedList内部实现大致是怎样的,他们的区别和优缺点。
ArrayList:内部使用数组的形式实现了存储,利用数组的下标进行元素的访问,因此对于元素的随机访问速度非常快。因为是数组,所以ArrayList在初始化的时候,初始大小为10,插入新元素的时候,会判断是否需要扩容,扩容的步长是0.5倍的原始容量。
扩容的方式是利用数组的复制,因此有一定的开销。
LinkedList:内部使用双向链表的结构实现存储,LinkedList有一个内部类作为存放元素的单元,里面有三个属性,用来存放元素本身以及前后两个单元的引用,另外LinkedList内部还有一个header属性,用来标识起始位置,LinkedList的第一个单元和最后一个单元都会指向header,因此形成了一个双向的链表结构。
java的多线程之间是怎么实现通信的
线程通信的方式:
1.共享变量
线程通信可以通过发送信号,发送信号的一个简单方式就是在共享对象的变量里面设置信号值。线程A在一个同步块里面设置boolean型的成员变量hasDataToProcess为true,线程B也在同步块里面读取hasDataToProcess这个成员变量。
2.wait/notify机制
以资源为例,为生产者生产一个资源,通知消费者就消耗掉一个资源,生产者继续生产资源,消费者消费资源,以此循环。
synchronized和volatile关键字的作用
一旦一个共享变量(类的成员变量,类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对于其他线程来说是立即可见的。
2)禁止进行指令重排序。
volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不稳定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
1.volatile 仅能使用在变量级别; synchronized 则可以使用在变量、方法、和类级别的
2.volatile 仅能实现变量的修改可见性,并不能保证原子性; synchronized 则可以保证变量的修改可见性和原子性
3.volatile 不会造成线程的阻塞; synchronized 可能会造成线程的阻塞。
4.volatile 标记的变量不会被编译器优化; synchronized 标记的变量可以被编译器优化