Java笔记

java中==和equals和hashCode的区别

  • ==比较的是内存地址。例:两个字符串对象,尽管内容一模一样,但内存地址是不同的,当你拿==做比较时,得到的结果必然是false。
  • equals比较的是对象内容。例:要是想判断内容是否一样的话,就得用equals方法。

基本数据类型各占多少字节数

基本数据类型

字节数

数值型

整数类型

byte

1字节

short

2字节

int

4字节

long

8字节

浮点类型

float

4字节

double

8字节

字符型

char

2字节

布尔型

boolean

至少1字节

 

int和integer区别

  • int则是java的一种基本数据类型Integer是int的包装类;
  • Integer变量必须实例化后才能使用,而int变量不需要;
  • Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。
  • int默认值是0,integer默认值是null。

包装类作用及基本数据类型的包装类

  • Java中基本数据类型没有方法和属性,而包装类就是让基本数据类型拥有方法和属性,实现对象化交互。
  • 数值包装类继承Number,字符包装类、布尔包装类继承Object

基本数据类型

包装类

byte

Byte

short

Short

int

Integer

long

Long

float

Float

double

Double

char

Character

boolean

Boolean

 

String、StringBuffer以及StringBuilder区别

  • String是一个字符串常量,其值是不可变的对象,也就是说在我们每次对String进行更改的时候就会生成一个新的String对象,指针就会指向新的String对象,从而效率就会低下,也浪费了内存。
  • StringBuffer是一个可变类,并且线程是安全的一个字符串操作类。任何对他指向字符串操作都不会生成一个新的对象,还自带缓冲区,当前字符串大小没有超过缓冲容量时,不会自动分配,超过后会自动增加容量。适合多线程场合使用。
  • StringBuilder也是一个可变类,是一个线程不安全的字符串操作类。StringBuilder相比StringBuffer是没有对方法加锁同步的,所以StringBuilder性能比StringBuffer高、安全性比StringBuffer差,适合单线程场合使用。

&&和 || 区别

  • &&称为:短路“与”;&称为:按位“与”
  • || 称为:短路“或”;| 称为:按位“或”
  • “与”就是并且的意思,多个判断条件时都得满足
  • “与”和“或”都是逻辑运算符,顾名思义,“短路”在判断的过程中,一旦当前项为假,就短路了,后面的条件不再进行判断。“按位”则相反,一直会把所有的条件都判断完

重载和重写的区别

  • 重载(Override)同一个类中,可以定义多个名字相同的方法,参数、返回值可以不同。
  • 重写(Override)子类继承父类,同时也继承了父类的方法,当父类的方法不能满足子类需要时,子类可以重写父类的方法。重写时方法名、参数以及返回值类型都必须跟父类一致。构造方法不能重写。

Java多态的理解

  • 多态是同一个行为具有多个不同表现形式或形态的能力。
  • 多态就是同一个接口,使用不同的实例而执行不同操作
  • 重写和重载也是多态的一种表现形式
  • 多态作为Java的三大特征之一,其目的都是提现Java语言的灵活性、简化性、可拓展性等。

JVM、JRE、JDK是什么?

  • JVM(Java Virtual Machine)是Java虚拟机,
  • JRE(Java Runtime Environment)是Java运行环境,
  • JDK(Java Development Kit)是Java开发工具包。
  • JVM + 基本类库 = JRE。
  • JRE + 编译工具 = JDK。
  • 所以三者的关系是:JDK > JRE > JVM

Java跨平台原理

  • JAVA之所以能跨平台,得益于JAVA虚拟机,在任何操作系统下,都有相应版本的虚拟机,我们把编译好的class文件,放在任何一台虚拟机上,都可以正常运行。这样我们就利用虚拟机屏蔽了操作系统的不同,即达到了一次编写处处运行的效果。

Exception和Error区别

  • Exception和Error都继承Throwable类。
  • Error,是系统中的错误,比如系统崩溃、虚拟机错误等,我们只有修改程序配置才能解决。通常Java程序不会捕获和抛出这类异常。
  • Exception分为运行时异常和编译时异常
  • 运行时异常:Java编译器允许程序不对它们做出处理,而在程序执行的过程中抛出的异常。
  • 编译时异常:Java编译器要求程序必须通过try catch捕获或者声明抛出这种异常

Java序列化的理解

  • Java的序列化是指将对象转换成二进制数据流的一种实现。通过将对象的序列化,可以方便的实现对象的传输及保存。
  • 序列化方便传输,速度快,还很安全,可以拿到最原始的Java对象,常用于线程间的对象传输。
  • 序列化方便存储,可以存成文件或数据库都行,下次使用的时候直接反序列化就能拿到对象。
  • 想要实现序列化,直接实现Serializeable接口就好,该接口下什么方法都没有,只是一个标记接口。

么是内部类?

  • 内部类就是定义在另一个类中或方法中的一个类。有四种内部类:
  • 成员内部类,静态内部类,局部(方法)内部类,匿名内部类。

内部类作用

  • 内部类方法可以访问该类定义区域的数据,包括私有有数据。
  • 内部类提供了更好的封装,除了该外围类,其他的类均不能访问。
  • 想要定义一个回调方法时,使用匿名内部类会很方便

接口和抽象类的区别

  • 关键字区别:接口关键字是interface,抽象类关键字是abstract;
  • 接口是通过implements来实现的,而抽象类是extends来继承的;
  • 接口可以多实现,抽象类只能单继承;
  • 接口和抽象类都不能被实例化;
  • 接口成员变量public static final必须复制且不能被更改
  • 抽象类成员变量默认default,可以在子类中进行重新定义或赋值。抽象方法被abstract修饰,并且不带方法体,不能被private、static、synchronized等修饰符修饰。只能用public或protected修饰。

抽象类的意义

  • 更好的将设计与实现分离;
  • 提高开发效率,便于日后维护;
  • 增加代码规范;

final、finally、finalize区别

  • 三个都是Java的关键字
  • final是一个修饰符,用于修饰类、方法和属性。修饰的类不能被继承,修饰的方法不能被重写,修饰的属性不可更改;
  • finally是异常处理语法结构的一个模块,此模块中的内容总是会被执行;
  • finalize是object类的一个方法,垃圾回收器执行的时候调用回收对象的方法。

Java泛型的好处

java语言引入泛型的好处是安全和简单,泛型的好处是在编译的时候检查类型安全,并且所有强制类型转换都是自动的,提高代码的重用率。

string 转换成 integer的方式及原理

  • 调用Integer.parseInt(String s);方法
  • 判断是否为空
  • 判断第一个字符是不是符号
  • 循环遍历每个字符的十进制
  • 通过 *= 和 -= 进行拼接
  • 判断是否为负值
  • 返回结果

extends和super区别

  • <? extends T>限定参数类型的上界:参数类型必须是T或T的子类型。
  • <? super T> 限定参数类型的下界:参数类型必须是T或T的超类型。
  • <? extends T> 只能用于方法返回,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,但是入参类型无法确定,只能接受null的传入。
  • <? super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接收。
  • ? 既不能用于入参也不能用于返参。

this和super的区别

  • this代表对象本身,是指向当前的对象一个指针。
  • this可以区分自身的成员和传递过来的参数重名。this.name = name;
  • this可以引用本类的构造函数。this(name);
  • super是指向自己超类的一个指针,并且是离自己最近的一个父类。
  • super可以引用父类的构造函数super(name);
  • this和super需放在构造方法的第一行。
  • this和super不能出现在同一个构造方法中。
  • this和super指向的都是对象,不能出现在static模块中。

进程和线程的区别

  • 进程是程序正在运行的一个实例,是系统分配资源和调度的一个进本单位。
  • 线程是系统运算调度的最小执行单位,被包含在进程中,也被称作轻量级进程。
  • 同一线程共享本进程的地址空间及资源,而进程则之间是独立的地址空间和资源。
  • 进程崩溃后不会影响其他的进程,而线程崩溃后则进程也会随之崩溃。所以进程比线程要健壮些。
  • 进程切换时占用资源大,能效高,所以涉及到频繁切换的时候线程好于进程。
  • 执行的时候每个独立的进程都拥有程序运行的入口,但是线程不能独立运行,必须依赖于进程之中,由程序提供多个线程执行控制。
  • 两者均可并发执行

线程开启的三种方式

  • 继承Thread类
  • 实现Runnable接口
  • 直接创建Thread实例

继承Thread类和实现runnable接口区别

  • 继承是单继承,实现是多实现。
  • 继承的方式比较简单,实现的方式稍微复杂。
  • 继承不能实现多线程共享资源,而实现可以。

sleepwait、yield、join区别

  • sleep 方法是属于 Thread 类中的,sleep 过程中线程不会释放锁,只会阻塞线程,让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,可中断,sleep 给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会。
  • wait 方法是属于 Object 类中的,wait 过程中线程会释放对象锁,只有当其他线程调用 notify 才能唤醒此线程。wait 使用时必须先获取对象锁,即必须在 synchronized 修饰的代码块中使用,那么相应的 notify 方法同样必须在 synchronized 修饰的代码块中使用,如果没有在synchronized 修饰的代码块中使用时运行时会抛出IllegalMonitorStateException的异常
  • yield sleep 一样都是 Thread 类的方法,都是暂停当前正在执行的线程对象,不会释放资源锁,和 sleep 不同的是 yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。还有一点和 sleep 不同的是 yield 方法只能使同优先级或更高优先级的线程有执行的机会
  • 等待调用join方法的线程结束之后,程序再继续执行,一般用于等待异步线程执行完结果之后才能继续运行的场景。例如:主线程创建并启动了子线程,如果子线程中药进行大量耗时运算计算某个数据值,而主线程要取得这个数据值才能运行,这时就要用到 join 方法了

线程的运行状态

  • 新建状态(new)新创建了一个线程对象。
  • 就绪状态(runnable)创建完成后其他线程调用了start()该状态处于可运行池中,等待获取CPU使用权。 
  • 运行状态(running)就绪状态的线程获得了CPU,执行了run()方法。
  • 阻塞状态(blocked)阻塞状态是因为线程的某种原因放弃CPU使用权,wait()、join()、yelid()、sleep()。
  • 死亡状态(dead)java执行完了或因异常退出了run()方法,结束了线程的生命周期。

什么是线程池?线程池的作用。

  • java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池,多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。   
  • 线程池作用就是限制系统中执行线程的数量。根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
  • 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
  • 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

synchronized 和volatile 关键字的区别

  • volatile本质的是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主内存中读取。
  • synchronized是锁定当前变量,只有当前线程可以访问改变量,其他线程被阻塞。
  • volatile只能在变量级别使用,而synchronized可以在变量和方法中使用。
  • volatile仅能实现变量的修改可见性,而synchronized则可以保证变量的修改可见性和原子性.
  • volatile不会造成线程阻塞,而synchronized会造成线程阻塞。
  • 使用volatile而不是synchronized的唯一安全情况是类中只有一个可变域。

synchronized和Lock区别

  • Lock是一个接口,而synchronized是Java的一个关键字
  • synchronized在发生异常的时候会主动释放线程占有的锁,不会导致死锁的发生。Lock在发生异常时如果没有调用unLock()去释放锁时就会造成死锁,所以使用Lock时,得在finally语句块中释放锁。
  • Lock可以让等待的线程中断,而synchronized不可以。
  • 通过Lock可以知道是否获取到锁,而synchronized不可以。
  • Lock可以提高多个线程读操作的效率
  • 在性能上来说,如果资源竞争不激烈,两者性能都是差不多的,如果竞争非常激烈的话,Lock的性能要高于synchronized,所以要视情况选择。

怎么终止线程?

  • 使用exit标志位方法。
  • 使用interrupt()方法
  • 使用stop(不推荐使用,线程不安全,过时方法)。

List、Set、Map区别

  • Collection接口继承Iterable接口,而List和Set继承Collection接口Map不继承。
  • Map和Collection并列为Java的两大集合
  • List特点:元素有放入顺序,元素可重复 ,支持for循环,也就是通过下标来遍历,也可以用迭代器。有两大继承类ArrayList和LinkedList。
  • Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。两大继承类:HashSet和TreeSet
  • Map是通过键值对的方式来存储数据。两大继承类HashMap和TreeMap。

ArrayList和LinkedList区别

  • ArrayList和LinkedList都是List下的实现类。
  • ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,优点是使用索引在数组中搜索和读取数据是很快,缺点就是增加删除时非常麻烦。
  • LinkedList 是采用双链表形式存储数据,大量的数据时,增加和删除性能高于ArrayList,但是缺点就是查找非常麻烦要丛第一个索引开始。

集合和数组区别

  • 数组的长度是固定的,一旦创建无法进行更改,数组还会进行边界检查,一旦越界会报运行异常;而集合的长度是可变的,可以动态扩展,集合还有许多方法,能满足更多的需求;
  • 数组必须声明容纳的元素类型,集合不用声明;
  • 数组存放的类型只能是一种,object类型数组可以存储不止一种。集合可以存放多种,既可以存放对象,也可以存放包装类;
  • 集合的缺点也是可以存放多种数据类型,因为存放的数据类型都会转换成object类型,在引用集合的时候都需要强制类型转换,因此集合的类型也是不安全的,同时还会增加性能损耗;

HashMap和HashTable区别

  • 继承的父类不同,HashMap是继承AbstractMap,HashTable继承Dictionary。
  • 线程安全不同,HashMap是线程不安全的,HashTable是线程安全的。
  • 遍历方式内部实现不同,HashMap和HashTable都是使用了Iterator,由于历史原因HashTable还是用Eunmeration方式。
  • Hash值不同,HashTable直接使用对象的HashCode,而HashMap会重新计算Hash值。

MVC、MVP、MVVM理解

  • MVC是分别通过model(模型)、view(视图)、controller(控制器)来创建设计的应用程序的一种模式。model层主要负责处理程序中逻辑部分,比如数据库的操作view层:视图效果,布局页面。controller控制器:主要负责程序中和用户交互的部分。从view层获取显示及数据,controller层来控制和用户之间的交互,最后再传递给model层。
  • MVC的优点:1降低耦合性、2提高复用率、3部署快、4可维护性高
  • MVC的缺点:1不适合中小型应用:花大量时间创建此模式再运用于小的程序中就会得不偿失。2简单的界面效率低:简单的页面严格遵循MVC模式的话,会增加结构的复杂性,从而效率就会降低。3view层对model层访问效率低:模型的操作接口不同,视图层需要多次调用才能显示数据。
  • MVP是Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示
  • MVP优点:1模型与视图完全分离,我们可以修改视图而不影响模型。2可以更高效地使用模型,因为所有的交互都发生在Presenter内部。3可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑,因为视图的变化总是比模型的变化频繁。4如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。
  • MVP缺点:由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁。如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。
  • MVC和MVP的区别:MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,还要包括一些业务逻辑。 在MVC模型里,更关注的Model的改变,而同时有多个对Model的不同显示,即View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。
  • MVVM是Model-View-ViewModel的简写。它本质上就是MVC的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。在视图模型中,绑定器在视图和数据绑定器之间进行通信。
  • MVVM优点:低耦合,可重用行:视图逻辑放在视图模型中,让更多的view重用这段逻辑。独立开发,可测性。
  • MVVM和MVP区别:mvvm模式将Presener改名为View Model,基本上与MVP模式完全一致,唯一的区别是,它采用双向绑定(data-binding): View的 变动,自动反映在View Model,这样开发者就不用处理接收事件和View更新的工作,框架已经帮你做好了。

 

 

 

 

 

posted @ 2020-11-02 17:32  渣娃  阅读(203)  评论(0编辑  收藏  举报