Java基础(个人总结+八股问题整理)

语言基础、面向对象、集合框架、IO、泛型、反射、异常处理等等这些都属于Java基础,为了更易于梳理和体系构建,笔者把语言基础和面向对象归类为Java基础,后续知识归为高级特性(基础),整理后后续会发布,希望能与正在准备春招&秋招的伙伴共同交流。如果笔者遇到本章较好的题目,内容会逐步完善更新。

参考 pdai-全栈知识体系

文章目录

一、个人总结

1.1语言基础

1.1.1概述

在这里插入图片描述

1.1.2数据类型
  1. 基本类型:分为四类八种
    • 整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)
    • 浮点型:float(4字节)、double(8字节)
    • 字符型:char(2字节,表示单个字符)
    • 布尔型:boolean(表示真假值)
  2. 基本数据类型都有其对应包装类
    基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
    Integer x = 2;     // 装箱
    int y = x;         // 拆箱
    
  3. 枚举类型
  4. 引用类型
    1. String
    2. 数组、集合
    3. 类、接口
1.1.3关键字(final和static的详解)
  1. final
    • final 关键字用于声明一个实体(变量、方法或类)是最终的,不能被修改。
    • final变量:一旦给final变量赋值后,就不能更改它的值。final修饰的变量效果上成为常量。例:final int MAX_VALUE = 10;
      • 对于基本类型,final 使数值不变;
      • 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
    final int x = 1;
    // x = 2;  // cannot assign value to final variable 'x'
    final A y = new A();
    y.a = 1;
    
    • final方法:这种方法不能在子类中重写。
    public final void showFinalMethod() {
         
         
        // 方法体
    }
    
    • final类:被声明为final的类不能被继承。
      例:public final class MyFinalClass { ... }
  • 使用final关键字可以让程序运行得更安全,因为它可以避免无意的赋值或继承导致的错误。同时,final 变量经常与不可变类搭配使用,以创建线程安全的常量。
  1. static

    • static 关键字用于声明独立于对象的类成员。即它可以创建类级别的变量和方法。

    • 静态变量(Static Variable)

      • 静态变量: 又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它;静态变量在内存中只存在一份。
      • 实例变量: 每创建一个实例就会产生一个实例变量,它与该实例同生共死。
      public class A {
             
             
          private int x;         // 实例变量
          private static int y;  // 静态变量
      
          public static void main(String[] args) {
             
             
              // int x = A.x;  // Non-static field 'x' cannot be referenced from a static context
              A a = new A();
              int x = a.x;
              int y = A.y;
          }
      }
      
    • 静态方法(Static Method)

      • 静态方法在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法(abstract)。
      public abstract class A {
             
             
          public static void func1(){
             
             
          }
          // public abstract static void func2();  // Illegal combination of modifiers: 'abstract' and 'static'
      }
      
      • 只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字。
      public class A {
             
             
          private static int x;
          private int y;
      
          public static void func1(){
             
             
              int a = x;
              // int b = y;  // Non-static field 'y' cannot be referenced from a static context
              // int b = this.y;     // 'A.this' cannot be referenced from a static context
          }
      }
      
    • 静态语句块
      静态语句块在类初始化时运行一次,通常用于初始化变量。

        public class A {
             
             
            static {
             
             
                System.out.println("123");
            }
      
            public static void main(String[] args) {
             
             
                A a1 = new A();
                A a2 = new A();
            }
        }
        //123
      
    • 静态内部类(Static Inner Class):它可以访问外部类的静态成员。

      • 非静态内部类依赖于外部类的实例,而静态内部类不需要。
      public class OuterClass {
             
             
          class InnerClass {
             
             
          }
      
          static class StaticInnerClass {
             
             
          }
      
          public static void main(String[] args) {
             
             
              // InnerClass innerClass = new InnerClass(); 
              // 'OuterClass.this' cannot be referenced from a static context
              OuterClass outerClass = new OuterClass();
              InnerClass innerClass = outerClass.new InnerClass();
              StaticInnerClass staticInnerClass = new StaticInnerClass();
          }
      }
      
    • 静态导入(Static Import):允许导入类的静态成员而无需类前缀。

      • 在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
        例:import static java.lang.Math.*;
    • 初始化顺序

      • 静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。
      public static String staticField = "静态变量";
      
      static {
             
             
          System.out.println("静态语句块");
      }
      
      public String field = "实例变量";
      
      {
             
             
          System.out.println("普通语句块");
      }
      
      public InitialOrderTest() {
             
             
          System.out.println("构造函数");
      }
      
      • 存在继承的情况下,初始化顺序为:

        • 父类(静态变量、静态语句块)
        • 子类(静态变量、静态语句块)
        • 父类(实例变量、普通语句块)
        • 父类(构造函数)
        • 子类(实例变量、普通语句块)
        • 子类(构造函数)
    • 静态成员是类的一部分,而不是单个实例的一部分。这意味着如果一个对象修改了一个静态变量,这个修改会影响到所有的实例。

两者(static 和 final)也经常一起使用,例如在定义静态常量的时候,static final 一起使用能够创建全局常量。

1.1.4变量声明与初始化
  1. 变量声明:指定变量类型并赋予名字
    • 示例:int number;
  2. 变量初始化:为变量赋予初始值
    • 示例:number = 10;
  3. 常量声明:使用final关键字定义常量,常量一旦赋值不能改变
    • 示例:final double PI = 3.14;
1.1.5运算符

在这里插入图片描述

  1. 算术运算符:+-*/%(取模)、++(自增)、--(自减)
  2. 比较运算符:==!=><>=<=
  3. 逻辑运算符:&&(与)、||(或)、!(非)
  4. 赋值运算符:=+=-=*=/=%=
  5. 位运算符:&(和)、|(或)、^(异或)、~(取反)、<<(左移)、>>(右移)
1.1.6控制流语句
  1. 条件语句:
    • if、else if、else:根据条件执行不同代码块
    • switch:根据不同的case值执行不同代码块
    //java7开始switch支持String对象
    //switch不支持long
    String s = "a";
    switch (s) {
         
         
        case "a":
            System.out.println("aaa");
            break;
        case "b":
            System.out.println("bbb");
            break;
    }
    
  2. 循环语句:
    for:一种有限次循环,通常知道循环次数时使用
    while:当某条件为真,执行循环体
    do-while:先执行循环体至少一次,然后检查条件
  3. 控制转移语句:
    break:退出循环或switch语句
    continue:跳过当前循环的剩余部分执行下一次循环
    return:退出当前方法
1.1.7类型转换
  1. 隐式类型转换:小类型自动转换到大类型,如int自动转换成double
  2. 显式类型转换(强制类型转换):需要显示声明新类型,可能造成数据丢失
    • 示例:int a = (int) 3.14;
1.1.8字符串处理

在这里插入图片描述

public class StringExample {
   
   
    public static void main(String[] args) {
   
   
        // 创建字符串
        String greeting = "Hello";

        // 字符串连接
        String name = "World";
        String message = greeting + ", " + name + "!";
        System.out.println(message);

        // 计算字符串长度
        int length = message.length();
        System.out.println("Length of the message: " + length);
        
        // 截取字符串
        String sub = message.substring(0, 5); // 截取Hello
        System.out.println("Substring: " + sub);

        // 转换大小写
        String upperMessage = message.toUpperCase();
        String lowerMessage = message.toLowerCase();
        System.out.println("Uppercase: " + upperMessage);
        System.out.println("Lowercase: " + lowerMessage);

        // 比较字符串
        String anotherGreeting = "HELLO";
        System.out.println("Are greetings equal? " + greeting.equalsIgnoreCase(anotherGreeting));

        // 检查字符串是否包含另一个字符串
        System.out.println("Does message contain name? " + message.contains(name));

        // 替换字符串中的字符
        String replacedMessage = message.replace("l", "r");
        System.out.println("Replaced message: " + replacedMessage);

        // 去掉字符串首尾空格
        String spacedString = "  lots of space  ";
        System.out.println("Trimmed string: '" + spacedString.trim() + "'");

        // 字符串分割
        String[] words = message.split(" ");
        System.out.println("The message split into words:");
        for (String word : words) {
   
   
            System.out.println(word);
        }

        // 检查字符串开头和结尾的字符或子字符串
        System.out.println("Does the message start with 'Hello'? " + message.startsWith("Hello"));
        System.out.println("Does the message end with 'world!'? " + message.endsWith("world!"));

        // 获取指定位置的字符
        char specificChar = message.charAt(1);
        System.out.println("The character at index 1 is: " + specificChar);

        // 字符串格式化
        String formatted = String.format("This is a %s formatted by %s", "string", "String.format");
        System.out.println(formatted);
    }
}

String、StringBuilder、StringBuffer:

  1. 可变性
    • String 不可变
    • StringBuffer 和 StringBuilder 可变
  2. 线程安全
    • String 不可变,因此是线程安全的
    • StringBuilder 不是线程安全的
    • StringBuffer 是线程安全的,内部使用 synchronized 进行同步
1.1.9数组

在这里插入图片描述

import java.util.Arrays;

public class ArrayOperations {
   
   
    public static void main(String[] args) {
   
   
        // 创建并初始化数组
        int[] numbers = {
   
   3, 5, 1, 4, 2};

        // 打印原始数组
        System.out.println("Original array: " + Arrays.toString(numbers));

        // 排序数组
        Arrays.sort(numbers);
        System.out.println(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值