Java 基础
1.JDK 和 JRE 有什么区别?
java development kit:java开发工具包,提供开发环境和运行环境
java runtime environment:java运行环境,为java的运行提供了所需的环境
2.== 和 equals 的区别是什么?
==
- 基本类型:比较的是值是否相同;
- 引用类型:比较的是引用是否相同;
equals不重写的话本质上就是==,其源码就是用的==
总结来说== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是属性值是否相等。
3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
可以自己重写hashcode(),可以自己定义哈希码的生成规则
object中定义的hashcode方法生成的哈希码和对象本身的属性值无关
hashmap中,借助equals和hashcode方法来完成数据的存储
4.final 在 java 中有什么作用?
final修饰的类不能继承
final修饰的方法不能被重写
final修饰的变量叫常量,常量的值必须初始化,且初始化的值不能被修改
5.java 中的 Math.round(-1.5) 等于多少?
值为-1,round()方法在实现四舍五入的时候实际上是不论正负的,它会先将这个数加上0.5然后在像下取整.
6.String 属于基础的数据类型吗?
不属于,只有8种基础类型,String属于对象
7.java 中操作字符串都有哪些类?它们之间有什么区别?
String:生成的是不可变对象,每调用一次都会创建新的对象,将指针指向新的String
StringBuffer 线程是安全的,适用于多线程
StringBulider线程不安全,适用于单线程
后两者都可以对原有的对象进行操作
8.String str="i"与 String str=new String(“i”)一样吗?
不一样,因为前者生成的数据被存放在常量池中,后者则是放在堆当中
9.如何将字符串反转?
使用StringBuffer或StringBulider的reverse()方法
10.String 类的常用方法都有那些?
- indexOf():返回指定字符的索引。
- charAt():返回指定索引处的字符。
- replace():字符串替换。
- trim():去除字符串两端空白。
- split():分割字符串,返回一个分割后的字符串数组。
- getBytes():返回字符串的 byte 类型数组。
- length():返回字符串长度。
- toLowerCase():将字符串转成小写字母。
- toUpperCase():将字符串转成大写字符。
- substring():截取字符串。
- equals():字符串比较。
11.抽象类必须要有抽象方法吗?
抽象类不一定需要抽象方法,但有抽象方法的类一定会是抽象类
12.普通类和抽象类有哪些区别?
普通类不能含有抽象方法,抽象类则不一定
抽象类不能实例化,普通类可以实例化
13.抽象类能使用 final 修饰吗?
不能,定义抽象类是为了让其他类继承的,final修饰的类不能被继承
14.接口和抽象类有什么区别?
实现:抽象类继承使用extends,接口则需要使用implements
构造函数:抽象类可以有,接口不能有
main方法:抽象类可以有可以运行,接口类不能有main方法
实现数量:类可以实现多个接口;但是只能继承一个抽象类
访问修饰符:接口中使用的public,抽象类中都可以使用
15.java 中 IO 流分为几种?
分为输入流和输出流
分为字节流(8进制),字符流(16进制)
16.BIO、NIO、AIO 有什么区别?
- BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
- NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
- AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
17.Files的常用方法都有哪些?
-
Files.exists():检测文件路径是否存在。
-
Files.createFile():创建文件。
-
Files.createDirectory():创建文件夹。
-
Files.delete():删除一个文件或目录。
-
Files.copy():复制文件。
-
Files.move():移动文件。
-
Files.size():查看文件个数。
-
Files.read():读取文件。
-
Files.write():写入文件。
集合类怎么解决高并发问题?
线程中的非安全的集合类ArrayList、HashSet我们用到的比较多
普通的安全集合类
juc
ConcurrentHashMap
hashmap线程安全的方式?
1.通过collections.sychronizedMap()方式,会使用封装类来实现安全,使用sychroized锁住
2.concurrentmap通过对hashmap重写,使用的是新的锁机制,使用的是NonfaieSync
描述一下Object类中的常用方法
toString :返回一个字符串,定义一个对象的字符串表现形式,可以重写方法
hashCode:
equals:
clone:返回一个对象的副本(比创建一个对象方便) 深克隆和浅克隆 重写是要实现Cloneable方法
finalized:回收
1.8新特性:
Lambda表达式(内部类)函数式接口 函数式编程
重写 重载的区别
重写:继承中对父类的方法进行重写
重载:在同一个类当中发生的,减少方法名
java中的自增是线程安全吗,如何实现线程安全的自增?
不是安全的
增加syncahronized进行线程同步
使用lock、unlock处理Reetrantent锁进行锁定
hashmap在1.8后的改变
数据结构:1.7中使用的数据+单向链表1.8中使用数据+单向链表+红黑树1
链表插入节点的方式:1.7中是头插法1.8尾插法
为什么hashmap扩容的是两倍?
1.8扩容之后,需要重新计算元素位置,其中计算时用的与数组长度-1和hash码进行与运算,防守hash冲突
解决hash冲突的方法
1.开放定址法2.再哈希法
3.链地址法,将每一个hash表的next的指针,构成一个单向链表
4.建立公共溢出区
用红黑树不用AVL树
Hashmap为什么使用红黑树?
在链表长度大于8(泊松分布)的时候,将后面的数据存在红黑树中,加快检索速度
保证红黑树的查找、插入、删除的时间复杂度最坏为o(log2n)加快检索速度
AVL平衡度要求高高,会需要使用旋转,左旋,红黑树旋转的次数少,插入删除等效率高
Tomcat为什么要重写加载类
类加载器的双亲委派:一次向上询问,然后依次向下回答
java运行时数据区
反射,反射会不会影响性能
运行中可以动态的获取对象,动态的获取信息获取功能就是反射
反射方式实例化对象比正常的要慢,偶尔使用反射,反射的影响可以忽略不计
sleep和wait区别
1.方法所属的类不一样一个是thread中的wait是object类中
2.暂停了执行指定的时间,让出cpu,sleep不会释放锁
3.wait会放弃锁
4.sleep用thread调用,在非同步的状态也可以调用
syncahroized(jvm)和reentrantlock(jdk)
相同点:
1.都用来协调多线程共享对象、变量的访问
2.都是可重入锁,同一线程可以多次获得同一个锁
不同点:
1.reentrantlock可以显式获得释放锁,syncahroized隐式的
2.在异常中reentrantlock要放在final语句中syncahroized是一个关键字会自动释放线程占有的锁
3.lock可以让等待锁的线程响应中断,而syncahroized会一直等待下去
4.lock可以提高多个线程进行读取的效率。多个线程使用共享锁,写线程用的排它锁
trylock和lock和lockinterruptibly的区别
1.trylock能获得锁就返回true,不能就立即返回false
2.lock能获得锁就立刻返回ture,不能的话就一直等待获得锁
3.lock和lockinterruptibly,若中断两个线程,lock不会抛出异常,后一个会抛出异常
单例模式有哪些实现方法优缺点
单例模式:一个类只有能产生一个对象,提高工作效率,减少资源的占用
组成部分:
1.私有的构造方法
2.私有的当前类的对象作为静态属性
3.共有的向外界提供当前类的对象的静态方法
有饿汉式,懒汉式,内部式
饿汉式:上来就直接new一个对象,然后返回这个对象,无法实现延迟类的加载
懒汉式:当调用的时候先检测是否有这个对象,如果没有就创建对象然后返回,多线程的情况下会同时new多个对象,因此就会加个锁来限制,但是需要判断两次对象是否为空,双重检测锁机制(volatile)定义对象需要加
静态内部类单例模式:定义一个静态内部的类,然后当使用一个方法时才会静态调用这个内部类的方法
序列化
将对象序列化表示为字节序列,方便存入文件数据库,或者读取
使用的时候:需要通过网络之间发送的话,都需要使用
实体类都要实现序列化接口
使用transient关键字可以使对象不序列化
java基础语法知识
java运行过程
1.编译javac,把Java源文件编译成class字节码文件
2.运行java
标识符
1.以字母、下划线 开 头 2. 其 余 部 分 可 以 是 字 母 下 划 线 开头 2.其余部分可以是字母下划线 开头2.其余部分可以是字母下划线
3.不能为关键字变量
1.局部变量:定义在方法内或语句内。从属于方法或语句块,使用之前必须手动初始化
2.成员变量(实例变量):定义在类里面、方法外面。从属于对象,若没有手动初始化变量,系统会自动初始化。
数字:0.0,0 布尔:false char:、\u0000
3.静态变量:定义在类里面、方法外面、使用static修饰从属于类
数据类型
1.基本数据类型
a)数字:整数:byte(1字节)short(2个字节)int默认该类型(4字节)long(8字节)
浮点数:float(4个字节)double(8字节)默认类型
byte short char可以自动转化为int 其余则是用强制类型转化
b)字符char(2个字节)
c)布尔 boolean(1位)
2.引用类型(4个字节)
a)数组
b)对象
c)接口
表达式:
1.类型的自动提升
如果有long(double),结果就是long(double)
2.强制转型
运算符:
1.算术运算符
2.关系运算符
3.逻辑运算符(与或非)&&,||,!(左右两边均是布尔型)
&,| (3&4)
4.位运算符
&,|,<<(左移一位相当于乘以2),>>>(右移一位相当于除以2)
5.扩展运算符
6.三目运算符
(布尔表达式)?A:B
控制语句:
1.顺序结构
2.选择结构:if if else if else if else switch 多值选择 表达式:int、char short byte
3.循环结构
面向对象基础:
1.对象的进化史
a)基本数据类型阶段 数据少 无数据结构管理时代
b)数组 数据多了,将同类型数据放在一起 弱数据管理时代
c)结构体 数据多了,复杂了。将不同的数据类型的数据放在一起 强管理
d)对象 数据多了、类型复杂了、行为也复杂了。将不同类型的数据放在一起
2.对象和类:对象是具体的,类是抽象的。类是一个模板,通过类的模板new对象
定义类:
(public)class(类名){
//属性
private 修饰 //建议增加相应的getter、seeter方法
//方法
//构造方法
}
构造方法:
1.方法名必须和类名一致
2.无返回类型
3.通过new来调用
4.无参构造器问题
a)如果为手动定义构造器,系统将会自动添加一个无参的构造器
b)如果定义过则不会添加
5.构造方法的第一句总是super,就是调用直接父类的构造方法,有继承关系的构造方法调用顺序
方法的重载(overload):
两同(同一个类、同一个方法名)三不同(参数不同:类型、个数、顺序)
返回值不同不能构成重载
形参名称不同不能构成重载
this:普通方法中,调用本方法的对象。构造方法中,正要初始化的对象
还可以用来调用其他的构造方法
super:就是调用直接父类的构造方法,有继承关系的构造方法调用顺序
static:修饰的变量和方法,变成静态变量和静态方法。从属于类 。通过类名可调用实际存储在方法区中
package:位于非注释行的第一句
import:引入类
final:修饰变量:常量(命名规范:全部大写,多个单词之间通过下划线隔开)
修饰方法:不能被重写
修饰类:不能被继承
面向对象的三大特征:
封装
通过private、public、default、protected关键字实现属性或者方法的封装
高内聚、低耦合
继承
通过extends 优点:1.代码重用2.通过继承实现对现实世界更加准确的建模
类只能单继承,没有c++的多继承
方法的重写:=:方法名保持一致>=子类的权限可以大于等于父类<=子类的返回值类型小于等于父类的类型。子类声明的异常类型不能超过父类的类型
Object类:
1.根基类
2.toString
3.equal、hashcode
4.wait、notify、notifyAll
多态
三个必要条件:继承、方法的重写、父类引用指向子类对象
动态绑定、静态绑定:java比较慢
抽象类:
1.包含抽象方法的类,一定是抽象类
2.抽象类不能被new
3.抽象类可以包含:普通方法、成员变量、构造方法
接口:
1.interface
2.类实现接口:implements 可以实现多个接口
3.接口可以多继承
内存机制:
栈1.存放局部变量2.不可以被多个线程共享3.空间连续、速度快
堆1.存放对象2.可以被多个线程共享3.空间不连续速度慢但是灵活
方法区
1.存放类的信息:代码、静态变量、字符串常量等
2.可以被多个线程共享
垃圾回收器(GC Garbage Collection):
1.程序员无法调用垃圾回收器。但是可以通过system。gc建议回收
2.finallize:一般不会调用
异常机制:
1.try catch finally
2.声明抛出异常:throws
3.手动抛出异常:throw
4.自定义异常extends Exception或者他的子类
数组:
1.长度固定,不可变
2.所有元素的类型一致
3.元素类型可以为任意类型
4.Arrays类:包含了对数组的排序、查找
容器:1.Collection
a)list(有序可重复)
ArrayList底层用数组实现。线程不安全,效率高
LinkedList:底层用双向链表实现。线程不安全,效率高
Vector:底层用数组实现。线程安全,效率低
b)Set(无序,不可重复)
HashSet(内部使用HashMap实现)
2.Map
采用“key-value”来存储数据
a)HashMap线程不安全,效率高
b)HashTable线程安全,效率低
3.iterator
用过它可以实现遍历容器中的元素
4.泛型
5.Collections工具类
常用类:
1.包装类:实现了基本数据类型和对象的相互转化。自动装箱、自动拆箱
2.String/StringBulider/StringBuffer
String:不可变字符序列
StringBulider:可变字符序列,线程不安全
StringBuffer:可变字符序列,线程安全
3.时间:Date、DateFormat、Calendar
Date:使用毫秒数来表示时间
DateFormat:实现Date对象和String对象相互转化(根据制定格式转化)
Calendar:日期类。实现人的日期和Date相互转化
4.File(文件)
5.math
6.枚举,若定义一组常量就是使用枚举
转载:https://blog.csdn.net/qq_43789254/article/details/115565184