目录
在使用HahMap的时候,用String做key有什么好处?
String,StringBuilder,StriingBuffer区别?
java中几种基本数据类型?
浮点型float,double 整型int byte short long 布尔值boollean 字符char
关于继承以下三点:
子类继承父类所有的方法,子类可以有自己的方法,子类可以用自己的方法去实现父类
从静态方法和实例方法开始到重写重载中间的部分。
重写和重载
构造器不能被继承,不能被继承自然不能被重写,但是可以被重载
重载和重写区别:
重载:发生在同一个类中,方法名相同,参数列表不同(自己想一下都能说出来)
重写:发生在父子类中,也就是子类继承父类的基础下,把父类的实现方法覆盖一遍,子类的方法名,参数列表必须相同
补充:重载对访问权限没啥要求,而子类重写方法的访问权限不能小于父类(就是说比如父类是public,则子类就不能是private)
重载对于返回值没有要求,而子类重写方法的返回值必须和父类的返回值相同或者是其子类
==和equls的区别
==数据类型比较的是值,equals引用类型比较的是对象的内存地址
hashcode的作用是获取哈希码,就是散列码
为什么Java中只有值传递?
【面试题精讲】为什么 Java 只有值传递?_java中为什么只有值传递面试题-CSDN博客
1 简单性
2 安全性
3 性能优化
4 值传递的示例
Java 中只有值传递一种参数传递方式,无论是基本数据类型还是引用数据类型。这是因为 Java 中的所有数据类型都可以分为基本数据类型和引用数据类型,而方法调用时只会将变量的值复制一份传递给方法。值传递使得代码更加简洁、安全,并且能够提高程序的执行效率。
值传递
指在调用函数时,将实际参数复制一份传递到函数中
引用传递
指在调用函数时,将实际参数的 地址 直接传递到函数中,那么在函数中对参数进行修改,将影响到实际参数
java中io流分几种?
按流的方向分,输入流和输出流
按操作单元分,字节流和字符流
按流的角色分,节点流和处理流
InputStream/Reader:所有输入流的基类,前者字节输入流,后者字符输入流
OutputStreamBIO/Writer:所有输出流的基类,前者字节输出流,后者字符输出流
BIO,NIO,AIO有什么区别?
BIO:Block IO同步阻塞式IO,就是外卖平常使用的传统IO,特点模式简单使用方便,并发处理能力低
NIO:Non IO同步非阻塞IO,是传统IO的升级,客户端和服务端
java反射机制是什么
在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对象,哦都能够调用它的任意一个方法和属性 就是反射
静态编译:在编译时确定类型,绑定对象
动态编译:在运行时确定类型,绑定对象
String类型不可变,为什么不可变
因为private final char value[];
String类类利用了final修饰的char类型数组存储字符
char前面有final
String 不是八个基本数据类型哦
String 有哪些特性?
不可变性
常量池优化
final :使用final来定义String类,表String类不能被继承,提高了系统安全性
通过反射是可以修改所谓的“不可变”对象
用反射可以访问私有成员,然后反射出String对象的value属性,进而改变通过获得的value引用改变数组
的 结构,md一般不会这么做随便提一下
是否可以继承String类?
不可以,因为是final类,不可变,不能被继承
将字符串反转:使用StringBuffer 或StringBuffer 的reverse()方法
数组没有length方法 有length的属性
在使用HahMap的时候,用String做key有什么好处?
HahMap内部实现是通过key的hashcode来确定value的存储位置,因为字符串是不可变的
线程安全性:String中对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串得到基本操作
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的
性能:
每次对String 类型进行改变的时候都会重新生成一个新的String对象,既然改变了那就会生成,然后将指针指向新的String对象
对于三者的总结
如果要操作少量的数据用String
单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
多线程操作字符串缓冲区 下操作大量数据 = StriingBuffer
String,StringBuilder,StriingBuffer区别?
String是final的中介类,一旦创建后不可修改,也就是不可变的,另外这俩可变字符串,
StringBuilder不是线程安全的
StringBuffer是线程安全的
包装类相关
自动装箱和拆箱
装箱:就是把基本数据类型用它们对应的引用类型包装起来
拆箱:把包装类型转换为基本数据类型
int 和 Integer区别
为了能将这些基本数据类型当成对象操作,java为每一个基本数据类型都引入了对应的包装类型,int的包装类型就是 Integer
Integer a = 127和 Integer b = 127相等吗
对于对象引用类型 == 比较的是对象的内存地址
对于基本数据类型 == 比较的是值
idk和jre的区别?
jdk里面包含了jre,负责创建和编译软件,jre是拿来运行java程序的,交给jre去运行java程序
jre是运行时环境,里面包含了jvm,是Java程序运行时必须的软件环境。
面向过程和面向对象(OOP)的区别?
面向过程就是把问题分成一个一个的步骤,每个步骤使用函数进行实现,解决问题用函数之间的调用即可,最简单的实现就是写一个算法。
面向对象就是把这个问题抽象成不同的对象进行组合,建立对象的目的不是为了完成一个个步骤,而是为了描述解决这个问题的过程中发生的行为,
举个简单的例子,比如说造一辆车,车具有方向盘,轮胎等属性,跑起来,转弯这些行为,我们将这些属性和行为进行抽象并且组合成一个Car类,这就是面向对象编程。
面向对象的三大特征?
封装,继承,多态
封装:将属性私有,同时对外提供了set和get方法
继承:子类可以继承父类中属性和方法,父类中private的属性和方法不能呗继承
多态:父类中定义的方法可以被子类重写,同时在运行的时候根据实际类型调用子类中重写的方法
多态的实现满足这两种关系:
类之间有继承关系,子类重写了父类的方法
List 和Set的区别?
list是有序的集合,可以存储重复的元素,可以根据索引查询元素
set是无序的集合,不可存储重复的元素,
list通常用于 存储需要按照顺序访问的元素,如历史记录
set通常用于去重和判重操作
list支持添加,删除和修改操作,set不支持修改操作
ArrayList 和LinkedList的区别?
ArrayList底层是基于动态数组实现的
LinkedList底层基于双链表实现的
这两者都是线程不安全的
如何保证集合的线程安全?
使用的时候 优先在方法内使用,声明为局部变量
使用Collections.synchonizedList将其包装成线程安全的集合
使用线程安全的集合类,如ConcurrentHashMap这个在项目中好像就用到了
HashMap和HashTable的区别?
HashMap不是线程安全的
HashTable是线程安全的。因为他的每一个方法都用到了synchronized修饰
HashMap扩容是数组容量翻倍
HashTable扩容是数组容量翻倍+1
java中的异常
对于java中的异常,主要分两大类(检查型异常和非检查型异常)
常见的异常:空指针异常,类型转换异常,数组越界异常
java创建对象的几种方式
使用new关键字 最常见的
使用反射的方式创建对象,调用newInstance方法
使用class类的newInstance方法
使用constructor类的newInstance方法(这俩用到反射)
使用clone方法,这种方式不会调用任何构造方法,需要先实现Cloneable接口,并重写其定义的clone方法
反序列化
【面试题】Java中创建对象的方式有几种?_创建对象的方式有哪些 面试题-CSDN博客
什么是泛型?泛型的好处?
泛型是jdk5之后引入的一个新特性,它允许在定义类和接口的使用类型参数,咋使用时候再用具体的类型进行替换
最主要的用用是在集合类框架中
泛型好处:
方便:提高代码的复用性:比如将String类型和Integer类型放入List集合中,放String类型的时候需要定义一个List接口,而放Integer类型需要在定义一个接口,那么这样的化代码比较冗余,使用泛型很好的解决整个问题