java基础
gqtallhappy
程序员
展开
-
Java反射与泛型
1、Java的反射:在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。 2、Java泛型:JDK5以后引入的一个新特性。是指类型参数化。允许在定义类、接口、方法时使用类型形参,当使用时指定具体类型。 泛型类、泛型方法、泛型类派生的子类、类型通配符 泛型的上限:上界<? extends T> 不能往里存,只能取。 泛型的下限:下界<? super T> 可以存,取的时候只能返回O原创 2021-12-29 19:41:17 · 421 阅读 · 0 评论 -
Java锁
1、synchronized:隐式获取释放锁的方式。 synchronized锁升级:无锁、偏向锁、轻量锁(自旋锁)、重量锁(10次自旋锁后) 2、Lock:主动获取和释放锁,具有可操作性、超时获取锁、等多种特性。 Lock是一个接口,定义了锁的基本操作。Lock接口的实现基本都是通过聚合了一个同步器的子类来完成现场访问控制。 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互斥锁 / 读写锁 乐观锁 / 悲观锁 分段锁 偏向锁 / 轻量级锁 / 重量...原创 2021-12-28 15:26:23 · 208 阅读 · 0 评论 -
Java内存模型(JMM)
JMM是一个概念:为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范 JMM解决并发问题主要采用两种方式:限制处理器优化和使用内存屏障 指令重排:编译器优化的重排序、指令级并行的重排序、内存系统的重排序 源代码-->编译器优化重排序-->指令级并行重排序-->内存系统重排序-->最终执行的指令序列 as-if-serial语义:不管怎么重排序单线程程序的执行结果不能被改变。 happens-before语义:原创 2021-12-27 11:10:31 · 205 阅读 · 0 评论 -
Java设计模式
用抽象去构建框架、用实现去处理细节。 设计模式六大原则: 1、单一原则 2、迪米特原则 3、接口隔离原则 4、里氏替换原则 5、依赖倒置原则 6、开闭原则 工厂模式:Spring Ioc bean的创建 jdk动态代理 cglib动态代理 ...原创 2021-12-27 09:55:01 · 41 阅读 · 0 评论 -
HTTP 与 HTTPS
HTTPS特点: 基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护原创 2021-12-09 20:56:28 · 154 阅读 · 0 评论 -
TCP3次握手4次挥手
三次握手: 服务器与客户端都属于关闭状态,A客户端主动链接,B服务器被动打开链接。 第一次握手:A的TCP客户端向B发出连接请求报文段,(同步位SYN=1,初始序号seq=x),(SYN=1的报文段不能携带数据)但要消耗掉一个序号,此时TCP客户进程进入SYN-SENT(同步已发送)状态。 第二次握手:B收到连接请求报文段后,如同意建立连接,则向A发送确认,在确认报文段中(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),此时TCP服务器进程进入SYN-RCVD(同步收到)状态。原创 2021-12-09 20:53:03 · 1657 阅读 · 0 评论 -
String StringBuffer StringBuild
Stringbuffer线程安全的,append方法被synchronized修饰; StringBuild线程不安全; String不可变是因为被final修饰;原创 2021-12-03 18:20:59 · 60 阅读 · 0 评论 -
HashMap 与 Hashtable的区别
HashMap和HashTable都实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆,实现Map接口。 HashMap的父类AbstractMap类。 Hashtable的父类Dictionary。 Hashtable既不支持Null key也不支持Null value。都会抛空指针。 HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。 Hashtable是线程安全的,它的每个方法中都加入了Synchr原创 2021-12-03 17:21:34 · 350 阅读 · 0 评论 -
ArrayList 与 LinkList的区别
ArrayList是数组 初始10的大小 每次扩容是按照1.5倍来扩容 copyOf进行复制 ArrayList线程不安全 List<String> list = Collections.synchronizedList(new ArrayList<String>()); 线程安全 ArrayList:增删慢、查询快,线程不安全,对元素必须连续存储。 LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能 线程也不安全 LinkedList:增删快.原创 2021-12-03 18:10:44 · 116 阅读 · 0 评论 -
synchronized 和 Lock区别
synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁。 synchronized是托管给JVM执行的 Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是CAS操作(Compare and Swap)比较与替换。 lock是java写的控制锁的代码 ...原创 2021-12-03 18:12:35 · 294 阅读 · 0 评论 -
volatile关键字
保持内存可见性 防止指令重排 懒汉单例模式有体现原创 2021-12-03 18:13:54 · 43 阅读 · 0 评论 -
线程的状态及线程通信
线程的5种状态: 新建: 可运行: 运行: 阻塞: 死亡:原创 2021-12-03 10:36:54 · 85 阅读 · 0 评论 -
Java GC
1、如何判断对象不可用 判断对象不可用有2个算法:引用计数法、可达性分析算法 引用计数法:给对象添加一个引用计数器当计数为0是说明对象不在被引用。 优点:操作简单、方便实现。 缺点:无法解决对象相互引用的问题 可达性分析算法:当对象到GC ROOTS没有连接,证明对象不可用。但是当对象的finalize()方法被重写重新与GC ROOTS连接那么对象会变成可达对象;若没重写方法就会被回收。一个对象finalize()方法只会被调用一次。 2、GC ROOTS有哪些...原创 2021-12-03 10:29:34 · 190 阅读 · 0 评论 -
Java类的生命周期及创建对象内存分配策略
加载:将class文件加载到内存中 连接:分为验证、准备、解析。 验证:文件格式、数据、字节码等验证 准备:正式为类中变量分配内存并赋初始值 解析:将间接引用变成直接引用 如String s = "xx" + "ss"; 解析成 String s = "xxss" 初始化:初始化变量、静态代码块等 ...原创 2021-12-02 18:51:17 · 66 阅读 · 0 评论 -
Jvm内存分配
堆空间:JVM 所有线程共享的部分,在虚拟机启动的时候就已经创建。所有的对象和数组都在堆上进行分配。这部分空间可通过 GC 进行回收。当申请不到空间时会抛出 OutOfMemoryError(OOM)。 本地方法栈:与虚拟机栈相似(OOM)。 虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建(OOM)。 方法区:主要用于存储类的信息、常量池、方法数据、方法代码等(OOM)。 程序计数器:JVM支持多个线程同时运行,每个线程都有自己的程序计数器。 ...原创 2021-12-02 17:26:58 · 658 阅读 · 0 评论