Java基础
一、面向对象的特征
- 封装
- 将属性和方法封装到一个抽象的类中
- 外界使用类创建对象,然后让对象调用方法
- 对象方法的细节都被封装在类的内部
class Animal
{
String name;
public void eat(){};
}
- 继承
- 继承基类的方法,并且做出自己的改变或者扩展。
class Animal
{
String name;
public void eat(){};
}
class Dog extends Animal
{
public void eat() {
System.out.println("狗吃骨头");
}
}
class Cat extends Animal
{
public void eat() {
System.out.println("猫吃鱼");
}
}
- 多态
- 允许将⼦类类型的指针赋值给⽗类类型的指针(缺点:无法调用子类特有功能)
二、JDK JRE JVM
- JDK 开发工具
- JRE JAVA运行时环境
- JVM java虚拟机
三、 == 和equals比较
- ==:是对比栈中的值,基本数量类型是变量值,音乐类型是堆中内存对象地址
- equals:object 中默认也是 ==比较,String 、Date、ArrayList一般会重写
四、final
最终的
如果引用为基本数据类型,则该引用为常量,该值无法修改; 如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。 如果引用时类的成员变量,则必须当场赋值,否则编译会报错。
五、String,StringBuffer,StringBulider
- StringBulider 线程不安全
- StringBuffer 线程安全
- String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
- 使用场景:优先使用StringBulider ,多线程使用共享变量的情况先使用StringBuffer,不对字符串经常改动情况下String
六 、重载和重写
- 重载 发生在同一个类中方法名相同,参数类型,个数不同
- 重写 发生在子父类中,方法名,参数列表相同,重写父类方法
七、接口和抽象类区别
-
抽象类要被子类继承,接口要被类实现。
-
接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
-
抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量
八、 List和Set区别
List和Set是用来存放集合的接口,并且二者都继承自接口Collection。
List是有序,可重复的,可以有存多个null。
- ArrayList:底层是动态数组,连续内存存储,适合下标访问,适合遍历查询,当底层数组满的时候会创建一个更大的新数组,拷贝数据到新数组,如果new 的时候指定初始容量,并且使用尾插法,可以极大提升性能。
- LinkedList:底层是链表,在内存中是散列的,适合增删改,只能用iterator遍历。
Set是无序,不可重复的最多一个 NULL对象,只能用iterator遍历,用for的话,每次get(i)都会重写遍历list,对性能损耗很大。
- HashSet:HashMap哈希表结构储存,不能保证元素的顺序,元素是无序的,可以有null,但是null只能有一个,不能有重复的元素。HashSet不是同步的,需要外部保持线程之间的同步问题。
- TreeSet:TreeSet的底层是通过TreeMap实现的,TreeSet实现了SortedSet接口,它是一个有序的集合类,。TreeSet并不是根据插入的顺序来排序,而是根据实际的值的大小来排序。TreeSet也支持两种排序方式:自然排序和自定义排序。不能放入重复元素和null。
九、hashCode与equals
- 1、若两个对象equals返回true,则hashCode有必要也返回相同的int数;
- 2、若两个对象hashCode返回相同int数,则equals不一定返回true。
- hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
- equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”。同样的,equals()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有equals()函数。
十、HashMap和HashTable
- HashMap线程不安全,HashTable线程安全,因为HashTable的方法用synchronized修饰。
- HashMap允许null为key或value,HashTable不允许
十一、JAVA垃圾回收
GC判断对象是否需要回收
- 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计 数为0时可以回收,效率高(其他编程语言采用)
引用计数法,可能会出现A 引用了 B,B 又引用了 A,这时候就算他们都不再使用了,但因为相互 引用 计数器=1 永远无法被回收。【java不采用的原因】
- 可达性分析法:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就判断是可回收对象。(java采用)
JAVA释放垃圾算法 - 标记回收算法
- 复制算法
- 标记—整理
https://www.cnblogs.com/tuyang1129/p/12508216.html
十二、多线程
生命周期
- 1、new:当程序使用new关键字创建了一个线程对象之后,该线程就处于新建状态,此时由JVM分配内存,并初始化其成员变量的值。
- 2、 runnable:当线程调用了start()方法之后,该线程就处于就绪状态,java虚拟机会为其创建方法调用栈和程序计数器,等待调用执行
- 3、 running:如果处于就绪状态的线程获得了cpu时间片,开始执行run()方法的线程执行体,则该线程处于运行状态
- 4、 blocked:阻塞状态是指线程因为某种原因让出了cpu使用权,也就是让出了cpu时间片,暂时停止运行,直到线程进入可运行状态,才有机会获得cpu时间片,转到运行状态。
- 5、dead:所有线程执行完毕,就进入了死亡状态
阻塞的情况分为三种
- 1、等待阻塞:正在运行中的线程执行wait()方法时,JVM会把该线程放入等待队列中
- 2、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被其他线程占用,则JVM会把该线程放入锁池中,
- 3、其他阻塞:运行的线程执行sleep()、join()方法,或者发出了IO请求时,JVM会把该线程置为阻塞状态
线程死亡:线程会以三种方式结束,结束后就是死亡状态
- 1、正常结束:run()或call()方法执行完成,线程正常结束
- 2、异常结束:线程抛出一个未捕获的异常
- 3、调用stop:直接调用该线程的stop()方法来结束该线程(该方法容易导致死锁)
start()与 与 run() 区别
-
1、start()方法来启动线程,真正实现了多线程运行。无需等待 run 方法体代码执行完毕。
-
2、方法 run()称为线程体,它包含了要执行的这个线程的内容,线程就进入了 Running 状态,开始运行 run() 方法当中的代码。 run()方法运行结束, 此线程终止。然后 CPU 再调度其它线程。
sleep() 与 wait() 的区别 -
1、sleep是 Thread 类中的方法,wait 是Object 类中的方法。
-
2、sleep()方法导致了程序暂停执行指定的时间,让出 cpu 给其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态,线程不会释放对象锁,进入到了计时等待状态
-
3、而当调用 wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,线程进入等待状态,只有针对此对象调用 notify() 方法唤醒后,本线程才进入对象锁定池,准备获取对象锁而进入运行状态。
yield()与 与 join() 区别
- yield:执行后线程直接进入就绪状态,马上释放了CPU执行权,但是依然保留cpu执行资格,所以有可能cpu下次进行线程调度还会让这个线程继续执行。
- join:执行后线程进入阻塞状态,例如线程B中调用线程A的join ,那线程B会进入阻塞队列,直到线程A结束或中断线程。
并发,并行,串行
- 并发:允许两个任务彼此干扰。统一时间点、只有一个任务运行,交替执行。
- 并行:在时间上是重叠的,两个任务在同一时刻互不干扰的同时执行。
- 串行:在时间上不可能发生重叠,前一个任务没执行完,下一个任务就只能等待。
并发的三大特性:原子性、可见性、有序性
- 原子性:线程里面的操作是不可中断的,要么全部执行成功要么全部执行失败。例如转账:从A转B 转100元,要执行2操作,从A减掉100元,B加上100元。2个操作必须全部完成。
- 可见性:可见性是指当一个线程修改了共享变量后,其他线程能够立即看见这个修改
- 有序性:有序性是指程序指令按照预期的顺序执行而非乱序执行,乱序又分为编译器乱序和CPU执行乱序。
为什么使用线程池
1、降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。
2、提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,再执行。
3、提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。
corePoolSize 代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后并不会 消除,而是一种常驻线程
maxinumPoolSize 代表的是最大线程数,它与核心线程数相对应,表示最大允许被创建的线程
数,比如当前任务较多,将核心线程数都用完了,还无法满足需求时,此时就会创建新的线程,但 是线程池内线程总数不会超过最大线程数
keepAliveTime 、 unit 表示超出核心线程数之外的线程的空闲存活时间,也就是核心线程不会
消除,但是超出核心线程数的部分线程如果空闲一定的时间则会被消除,我们可以通过setKeepAliveTime 来设置空闲时间
workQueue 用来存放待执行的任务,假设我们现在核心线程都已被使用,还有任务进来则全部放入队列,直到整个队列被放满但任务还再持续进入则会开始创建新的线程
ThreadFactory 实际上是一个线程工厂,用来生产线程执行任务。我们可以选择使用默认的创建
工厂,产生的线程都在同一个组内,拥有相同的优先级,且都不是守护线程。当然我们也可以选择
自定义线程工厂,一般我们会根据业务来制定不同的线程工厂
Handler 任务拒绝策略,有两种情况,第一种是当我们调用 shutdown 等方法关闭线程池后,这时候即使线程池内部还有没执行完的任务正在执行,但是由于线程池已经关闭,我们再继续想线程
池提交任务就会遭到拒绝。另一种情况就是当达到最大线程数,线程池已经没有能力继续处理新提 交的任务时,这是也就拒绝。
Volatile和Synchronized区别,Volatile能不能保证线程安全
- 1.Synchronized关键字用来加锁。Volatile只是用来保持线程变量可见性。同程适用于一个线程写,多个线程读场景。
- 2.Volatile关键字只能保证线程可见性,不能保证原子性。
- 3.volatile修饰的变量在多线程场景下被修改后,其他线程能立马感知并更新为最新的值,实现多线程共享变量。
** 让线程同时运行CountDownLatch**
** 让线程顺序执行**
十三、浅拷贝和深拷贝
-
浅拷贝:浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。
-
深拷贝: 深拷贝复制变量值,对于引用数据,则递归至基本类型后,再复制。深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。
十四、JAVA网络通信
** TCP和UDP区别**
十五、java类加载过程
十六、Dubbo
简介
是一款高性能、轻量级的开源Java RPC框架,提供面向接口代理的高性能RPC调用、智能负载均衡、服务自动注册和发现、运行期流量调度、可视化服务治理和运维等功能。
超时设置
1) 服务提供者端设置超时时间,在 Dubbo 的用户文档中,推荐如果能在服务端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特性。
2)服务消费者端设置超时时间,如果在消费者端设置了超时时间,以消费者端为主,即优先级更高。因为服务调用方设置超时时间控制性更灵活。如果消费方超时,服务端线程不会定制,会产生警告。
十七、Zookeeper(动物管理员)
Zookeeper提供的服务
配置管理,分布式锁,集群管理(当做注册中心)。
十七、Web Service技术
简介
WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然
- 1.WebService采用Http协议,使用XML来封装数据,XML主要的优点在于它是跨平台的。
- 2.WebServiceHTTP消息头和XML内容格式就是SOAP协议规定的。
- 3.WebService服务器端通过WSDL文件来说明自己有什么服务可以对外调用。用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。
调用
apache的Axis本质上就是一个SOAP引擎
十八、MQTT协议
简介
它被设计为一个极其轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、高延迟或不可靠的网络而设计
特点
开放消息协议,简单易实现
发布订阅模式,一对多消息发布
基于TCP/IP网络连接,提供有序,无损,双向连接。
1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。
消息QoS支持,可靠传输保证
十九、VUE
v-show和v-if区别的区别
- v-show通过css display控制显示和隐藏,v-if组件真正的渲染和销毁,而不是显示和隐藏,频繁切换状态使用v-show 否则v-if
为何v-for要用key
快速查找到节点,减少渲染次数,提升渲染性能
https://blog.youkuaiyun.com/weixin_59519449/article/details/123636668