java基础(后续会更加完善)
2021-08-04 17:54:12 0 举报
AI智能生成
java基础的知识总结,面试必看,后续会更加完善
作者其他创作
大纲/内容
java语音有哪些特点、什么是java
1、简单易学
2、面向对象(封装,继承,多态)
3、平台无关性(java虚拟机实现平台无关性)
4、GC实现垃圾回收
5、异常处理机制
6、支持多线程
7、支持网络编程
面向对象和面向过程的区别
面向过程:面向过程性能比面向对象高。因为类调用时需要实例化,开销比较大。但是面向过程没有面向对象易维护,易复用,易扩展。
面向对象:面向对象易维护、易复用、易扩展,但是性能比面向过程低
java和c++区别
都是面向对象的语言,都支持封装,继承和多态
java不提供指针直接访问内存,程序内存更加安全
java的类是单继承的,C++支持多继承;虽然java的类不可以支持多继承,但是接口可以多继承
java有自动内存管理机制,不需要程序员手动释放无用内存
java有几种基本数据类型
八种:byte、short、int、long、char、float、double、boolean
基本类型和引用列?他们的区别
除了8中基本数据类型,其他都是引用类型,为了面向对象的操作一致性,每种数据类型都有对应的包装类
不同点
赋值方法不同,基本类型直接赋值,引用类型通过new对象,然后把对象赋予相应的变量。
比较方法不同,==号的比较:引用类型比较的是引用地址,基本类型比较的是值。
在数据作为参数传递的时候,基本数据类型是值的传递,而引用数据是引用传递(地址传递)
分别放在JVM的哪里
引用类型的创建过程
==和equals() 区别
==对于基本类型来说是值的比较,对于引用来说是比较的引用;而equals方法默认情况是==比较,只是很多类重写了equals方法,比如String,Integer等把他变成了值比较
hashCode与equals
hashCode介绍
hashCode作用是获取哈希码,也称为散列码;实际上是返回一个int整数。这个哈希码确定了改对象在哈希表中的索引位置。
散列表存储的是key-value键值对,他的优点是可以更具键快速查找出对于的值,这其中利用的散列码
为什么要有hashCode
我们以hashSet如何检查重复为例子:
hashCode和equals()的相关规定
如果俩个对象相等,则hashCode一定也是相等的
俩个对象相等,则调用equals() 返回一定是ture
俩个对象hashCode相等,并不一定相等
equals方法覆盖的话,hashCode也一定要覆盖
hashCode()的默认行为是对堆上的对象产生独特的值。如果没有重写hashCode(),则该俩个对象如论如何都不会相等
为什么要重写hashCode还要重写equals()
重写equals方法是为了按照我们自己的想法来比较俩个对象是否相等。如果不重写hashCode就可能会出现具有相同含义的不同对象的情况。而且只重写hashCode方法不重写equals方法,就不能得到我们想要的结果,应为equals方法其实就是==方法,只是判断俩个对象是不是同一个对象,所以需要都重写
通俗的说就是,hashCode就类似于小区的门牌号,知道们牌号就可以快速定位(像数组的下标),而equals方法就是告诉你需要具体比较的房间。
java序列化中有些字段不想序列化,怎么办
对于不想进行序列化的字段,可以使用transient关键字修饰
transient关键字的作用是:阻止实例化中那些用次关键字修饰的变量序列化;当对象被反序列化时,被transient修饰的变量不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。
ArrayList中存储数据的数组elementData是transient修饰的,因为数组是动态扩展的,并不是所有的内存都需要序列化。通过重写序列化和反序列化的方法,使得只序列化数组中有内容的那部分数据
幂等性
幂等是一个数学与计算机中的一个概念,即f(f(x)) = f(x),简单的来说就是一个操作多次执行的结果与一次执行的结果一致。有些操作系统天生就有幂等性,比如数据库的select语句。很多时候,幂等性是很重要的,比如支付下单场景,由于各种因素,产生数据不一致,是比较麻烦的。
怎么防止前端重复提交
提交按钮后屏蔽提交按钮
前端产生唯一id,后端在数据库设计的时候加上唯一约束,以防数据库插入重复数据
利用session防止表单重复提交
重载与重写的区别
重载
发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同
重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写,发生在子类中,方法名、参数列表必须相同,返回值范围小于等于父类。访问修饰符范围大于等于父类。如果父类方法修饰符为private,则子类就不能重写该方法。也就是方法提供的行为改变,而方法的外貌并没有改变。
java面向对象的三大特性:封装、继承、多态
封装
把描述一个对象的属性和行为代码封装在一个类中属性用变量定义,行为用方法定义,方法可以直接访问同一个对象中的属性
继承
子类继承父类的特征和行为。子类可以有父类的非私有方法和属性。子类也可以对父类进行扩展,也可以重写父类的方法,缺点是提高了代码的耦合性
多态
多态是指程序中定义的引用变量所指向的具体类型和通过改变量发出的方法调用在编程时期并不确定,而是在运行的时候才能确定(比如,向上转型),方法的覆盖和重载提现了多态
final在java中有什么作用
final修饰的类叫最终类,该类不可被继承
final修饰方法不可被重写
final修饰的变量是不可更改的。其不可更改指的是引用不可更改,对于引用值的类型还是可以更改的。
final、finally、finalize有什么区别
final修饰类不可被继承,修饰方法不可被重写,修饰变量不可以改变
finally是try catch 语句中的结束语句块,无论代码是否发生异常,改语句都可以被执行
finalize是object方法中的一个方法,该方法一般是由垃圾回收器来调用,回收垃圾
String StringBuffer StringBuilder的区别是啥
线程安全
stringBuilder是线程不安全的,效率高。String 和 StringBuffer是线程安全的,但是效率低
性能
每次对String类型改变的时候,都会生成一个新的String对象。然后将指正指向String对象,StringBuffer每次都会对自己本身进行操作,StringBuilder性能要比StringBuffer好
数据可变和不可变
String是不可变的,每次都要创建新的对象
StringBuilder和stringbuffer是可变的,他们底层是数组char[] value
String是如何实现不可变的
string不可变的是字符串的值不可变
String为什么设置成不可变
为了实现字符串常量池(只有当字符串是不可变的,字符串常量池才有可能实现)
为了线程安全(字符串自己就是线程安全的)
为了保证同一个对象调用的hashCode() 都产生相同的值,String的不可变有很好的支持
exeption、error、运行时异常与一般异常有何异同/java异常体系
所有的异常都是由Throwable继承而来的
error是错误,对于所有编译时期的错误以及系统错误都是通过Error抛出的
Exception规定的异常是程序本身可以处理的异常
checked exception 可检查异常,这是编码时期常用的,所有checked exception都是需要在代码中处理的。它是一个可以预见的异常,正常情况是可以处理的。比如IoException,或者一些自定义的异常,处理RuntimeException以及子类外,其他的都是可检查异常
Unchecked Exception 不可检查异常,RuntimeException以及子类都是。比如空指针异常,除数不为零等等。这种异常不能事前捕捉
接口和抽象类的区别
接口的方法默认是public,所有接口中方法不能有实现(jdk1.8开始,接口方法可以有默认实现),而抽象类可以有非抽象方法
接口中除了有static,final变量不能有其他变量,而抽象类中不一定
一个接口可以实现多个接口,但只能扩展一个抽象类。接口自己可以通过extends扩展多个接口
接口的默认修饰符是public,抽象类可以有public、protected、default这些修饰符
从设计层面来说,接口是对类的抽象,是一种模板的设计,抽象类是对行为的抽象,是一种行为的规范
Object类有哪些常用的方法
equals方法,hashCode方法,toString()方法,wait和notify系列,getclass方法
0 条评论
下一页