Java

type
Post
status
Published
date
Feb 20, 2026
slug
java
summary
tags
category
Java Web
icon
password
Place

Java基础

Java为什么是跨平台的

JVM,相同的字节码文件,不同的JVM
  1. 主要是靠JVM的作用,
  1. Java在编译后生成的是.class文件(字节码文件),不同平台生成的class文件是相同的
  1. 不同平台的JVM也是不同的,我们通过JVM将字节码翻译成特定平台的机器码然后运行

封装继承多态

  1. 封装:指的是将对象的属性和行为封装在同一个类中,通过private字段保护不被外部访问或修改,通过public方法来与外界交互
  1. 继承:指的是子类可以继承父类的字段和方法,还可以在此之上添加自己的属性和方法,实现代码复用
  1. 多态:指的是同一方法在不同对象上具有不同的行为表现。主要是靠方法的重载和重写来实现。通过多态,使用父类类型来引用子类对象,使程序更加灵活和可扩展,重载是同一个类中,方法名相同,参数不同,我们可以通过调用同一个方法名传入不同的参数来调用不同的方法重写指的是子类重写父类的方法,方法名和参数名相同,通常上面可以加一个@Override来

值传递和引用传递

java中基本数据类型,比如说int,double,boolean这些是值传递
像String,数组,类和自定义类都是引用传递。

接口,抽象类,普通类

  1. 抽象类的定义:含有抽象方法的就是抽象类(方法和类都有abstarct修饰)
  1. 接口定义:接口即抽象的抽象
接口只定义方法(想想service层)
抽象类实现接口,不需要实现接口中所有方法,他可以选择实现部分方法,或者不实现任何方法,将所有方法都留给子类实现
例子:abstractlist抽象类实现了list接口中的大部分方法(isEmpty等),但是把get(int index)方法作为抽象方法留给子类linkedlist和arraylist实现

final和static

final

  1. 修饰的类:类无法被继承,比如String就是被final所修饰的
  1. 修饰的方法:不能被子类重写
  1. 修饰的字段:
    1. 如果是基本数据类型:那么一旦赋值就无法被改变
    2. 如果修饰引用类型:那么其引用地址无法改变,但是其中内容是可以改变的。例如Stringbuilder中的append来改变

static

static修饰字段或方法都表示字段或方法属于该类,而非实例,对于字段,所有实例共享同一份,对于方法,可以通过类直接调用

final+static

  • 修饰变量:表示他是一个全局常量
  • 修饰方法:表示他是一个静态且不可重写的方法

final关键字可以修饰抽象类吗

不行,final修饰的类无法被继承,方法无法被重写,而抽象类本事就是用来被继承的

静态方法为什么不能调用非静态成员变量(main方法注意)

  1. 静态方法属于类,在类加载时就会分配内存,通过类名来访问
  1. 非静态成员变量属于对象,在对象实例话之后才存在,需要通过对象来访问
  1. 因为非静态成员变量不存在时静态方法就已经存在了,此时调用可能会调用一个不存在的变量,属于非法操作

注解Annotation(2min)

常见注解

注解是JDK1.5提供的新特性,可以看作是一种特殊的注释,主要用于修饰类,方法或者变量,注解起作用的时机在源码,字节码和运行时

元注解

其实就是用于注解的注解,常用的应该就时@Target@Retention
  1. @Target(ElementType.METHOD) 这说明只能作用于方法上。有TYPE,FIELD和METHOD这3种
  1. @Retention(RetentionPolicy.RUNTIME) 这说明注解作用时机。有RUNTIME,SOURCE,CLASS这3种

反射

反射是 Java 框架的基石。 它允许我们在运行时动态地获取类的信息(如方法、属性、构造器)并进行操作。
在 Java 中,一切反射的入口都是 Class 对象。通过它,我们可以获取 Method 调用方法,获取 Field 修改属性。

集合

List

ArrayList 底层是基于动态数组实现的,它在内存中是一块连续的地址空间;而 LinkedList基于双向链表实现的,节点在内存中是分散存储的,通过指针相互连接。
  1. 对于随机访问来说,ArrayList的时间复杂度时O(1)
  1. 对于插入或删除来说,LinkedList的时间复杂度是O(1)的

Map

HashMap

  • 是由数组,链表和红黑树实现,当一个链表的长度大于8时,就转换未红黑树来存储,时间复杂度为O(log n),来提高查询性能
  • 扩容机制:初始容量为16,负载因子(loadFactor)为0.75。当第13个元素加入后,就会触发扩容,创建一个容量是原来两倍的hashmap,将二进制哈希值与原来容量进行按位与,为0就留在原位置,为1就在原索引的基础上加上原来容量,这样保证均匀分散到新的hashmap中

ConcurrentHashMap

  • 对于数组和Node中的Key和Value都用volatile修饰来保证可见性
  • 在进行PUT操作时,如果桶位为空则利用 CAS 无锁写入,若有值则对头节点加 synchronized 锁来保证线程安全
  1. ConcurrentHashMap 在 Java 8 中,写操作会对桶的头节点加 synchronized,写多读少时,锁竞争会成为瓶颈。
  1. 最直接的办法是扩大初始容量。默认容量只有 16,桶少的话 hash 冲突概率高,多个线程容易争抢同一把锁。把初始容量设大一些,key 分散到更多桶里,同桶竞争的概率就降下来了。
  1. 如果存在热点 Key 被频繁写入,那光扩容也不够,因为同一个 Key 一定落到同一个桶。这时候可以借鉴 LongAdder 的分段思想,把热点 Key 拆成多个分片 Key 分散写入,读取时再聚合。本质就是用空间换时间。
上一篇
JUC
下一篇
Redis
Loading...