數據結構——反射、枚舉以及lambda表達式

1. 反射

Java的反射(reflection)機制是在運?時檢查、訪問和修改類、接?、字段和?法的機制;這種動態獲取信息以及動態調?對象?法的功能稱為java語?的反射(reflection)機制。
用途
1. 框架開發
2. 注解處理
3. 動態代理
4. 配置?件解析
5. 等等

1.?反射相關的類

2. Class類(反射機制的起源 )

類 |API 參考 |Android 開發人員 代表類的實體,在運?的Java應?程序中表?類和接?

1. Java程序運行的生命周期

  1. 編譯階段

    • Java源代碼(.java文件)經過javac編譯器編譯

    • 生成與平臺無關的字節碼文件(.class文件)

    • 字節碼文件包含類的結構信息和方法指令

  2. 類加載階段

    • JVM通過類加載器(ClassLoader)讀取.class文件

    • 將字節碼數據轉換為JVM內部的數據結構

    • 創建對應的java.lang.Class對象

  3. Class對象的作用

    • 每個加載的類在JVM中都有唯一的Class對象

    • Class對象包含類的完整元數據:

      • 類名、修飾符、包信息

      • 字段(屬性)信息

      • 方法信息

      • 構造器信息

      • 注解信息

  4. 反射機制

    • 通過Class對象可以獲取類的運行時信息

    • 動態操作類的能力包括:

      • 創建類的實例

      • 調用方法和訪問字段

      • 修改訪問權限

      • 動態代理

2.?獲得Class對象的三種?式

package reflection;public class Student {//私有屬性private String name = "zhangshan";//公有屬性public int age = 18;//不帶參數的共有構造方法public Student(){System.out.println("student()");}//帶一個參數的公有構造方法public Student(String name){this.name = name;System.out.println("Student(name)");}//帶一個參數的私有構造方法private Student(int age){this.age = age;System.out.println("Student(age)");}//帶兩個參數的私有構造方法private Student(String name,int age){this.name = name;this.age = age;System.out.println("Student(name,age)");}//公有方法public void sleep(){System.out.println("I am sleepy");}//私有方法private void eat(String food){System.out.println("I love delicious food");}private void run(){System.out.println("Run fast");}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}public static void main(String[] args) {Student student = new Student();System.out.println(student);}
}
1. 使? Class.forName("類的全路徑名"); 靜態?法。
前提:已明確類的全路徑名。
2. 使? .class ?法。
說明:僅適合在編譯前就已經明確要操作的 Class
3. 使?類對象的 getClass() ?法; 已經加載的類的對象實例
//獲得Class對象的三種?式
class Main {public static void main(String[] args) {//1. 通過Class.forName獲取class對象Class<?> c1 = null;try{c1 = Class.forName("reflection.Student");}catch(ClassNotFoundException e){e.printStackTrace();}//2.直接通過 類名.class 的?式得到,該?法最為安全可靠,程序性能更?//這說明任何?個類都有?個隱含的靜態成員變量 classClass<?> c2 = Student.class;//3. 通過getClass獲取Class對象Student s3 = new Student();//創建對象Class<?> c3 = s3.getClass();//?個類在 JVM 中只會有?個 Class 實例,即我們對上?獲取的//c1,c2,c3進? equals ?較,發現都是trueSystem.out.println(c1.equals(c2));System.out.println(c1.equals(c3));System.out.println(c2.equals(c3));}
}

3.?Class類中的相關?法

1. 獲取類信息
方法返回值用途示例
Class.forName("全限定類名")Class<?>動態加載類Class.forName("java.lang.String")
對象.getClass()Class<?>獲取對象的?Class?對象"hello".getClass()
類名.classClass<?>直接獲取類的?Class?對象String.class
clazz.getName()String獲取全限定類名(如?"java.lang.String"String.class.getName()
clazz.getSimpleName()String獲取簡單類名(如?"String"String.class.getSimpleName()
clazz.getPackage()Package獲取包信息String.class.getPackage()
clazz.getModifiers()int獲取修飾符(需用?Modifier?解析)Modifier.isPublic(modifiers)
clazz.getSuperclass()Class<?>獲取父類Integer.class.getSuperclass()
clazz.getInterfaces()Class<?>[]獲取實現的接口List.class.getInterfaces()
2. 常?獲得類相關的?法:

3. 獲取注解(Annotation)
方法返回值用途示例
clazz.getAnnotations()Annotation[]獲取類上的所有注解clazz.getAnnotations()
clazz.getAnnotation(注解類)Annotation獲取類上的指定注解clazz.getAnnotation(Deprecated.class)
field.getAnnotations()Annotation[]獲取字段上的所有注解field.getAnnotations()
method.getAnnotations()Annotation[]獲取方法上的所有注解method.getAnnotations()
constructor.getAnnotations()Annotation[]獲取構造方法上的所有注解constructor.getAnnotations()
4. 獲取構造方法(Constructor)
方法返回值用途示例
clazz.getDeclaredConstructors()Constructor<?>[]獲取所有聲明的構造方法(包括私有)clazz.getDeclaredConstructors()
clazz.getConstructors()Constructor<?>[]獲取所有公共構造方法clazz.getConstructors()
clazz.getDeclaredConstructor(參數類型...)Constructor<?>獲取指定參數類型的構造方法(包括私有)clazz.getDeclaredConstructor(String.class)
clazz.getConstructor(參數類型...)Constructor<?>獲取指定參數類型的公共構造方法clazz.getConstructor()
constructor.setAccessible(true)void設置私有構造方法可訪問constructor.setAccessible(true)
constructor.newInstance(參數...)Object通過構造方法創建實例constructor.newInstance("Tom")
5. 獲取屬性(Field)
方法返回值用途示例
clazz.getDeclaredFields()Field[]獲取所有聲明的屬性(包括私有)clazz.getDeclaredFields()
clazz.getFields()Field[]獲取所有公共屬性(包括繼承的)clazz.getFields()
clazz.getDeclaredField("name")Field獲取指定名稱的屬性(包括私有)clazz.getDeclaredField("age")
clazz.getField("name")Field獲取指定名稱的公共屬性clazz.getField("name")
field.setAccessible(true)void設置私有屬性可訪問field.setAccessible(true)
field.get(obj)Object獲取屬性值field.get(user)
field.set(obj, value)void設置屬性值field.set(user, "Tom")

6. 獲取方法(Method)
方法返回值用途示例
clazz.getDeclaredMethods()Method[]獲取所有聲明的方法(包括私有)clazz.getDeclaredMethods()
clazz.getMethods()Method[]獲取所有公共方法(包括繼承的)clazz.getMethods()
clazz.getDeclaredMethod("方法名", 參數類型...)Method獲取指定方法(包括私有)clazz.getDeclaredMethod("setName", String.class)
clazz.getMethod("方法名", 參數類型...)Method獲取指定公共方法clazz.getMethod("toString")
method.setAccessible(true)void設置私有方法可訪問method.setAccessible(true)
method.invoke(obj, 參數...)Object調用方法method.invoke(user, "Tom")
package reflection;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Test{//類的實例化public static void reflectNewInstance(){try{Class<?> classStudent = Class.forName("reflection.Student");Object objectStudent = classStudent.newInstance();//Student student = (Student) objectStudent;System.out.println("獲得學生對象:"+objectStudent);} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}//獲取類的公有(public)帶一個參數構造方法并實例化public static void reflectPublicConstructor(){try{Class<?> classStudent = Class.forName("reflection.Student");//獲取類的公有(public)無參構造方法Constructor<?> con = classStudent.getConstructor(String.class);//利用構造方法進行實例化Object studentNewInstance = con.newInstance("wangwu");//Student student = (Student) studentNewInstance;System.out.println("獲得公有帶一個參數構造方法并修改姓名:"+studentNewInstance);} catch (Exception e) {throw new RuntimeException(e);}}//獲取類的私有(private)帶一個參數構造方法并實例化public static void reflectPrivateConstructor(){try{Class<?> classStudnt = Class.forName("reflection.Student");//獲取類的私有(private)帶一個參數構造方法Constructor<?> con = classStudnt.getDeclaredConstructor(int.class);//繞過 Java 的訪問控制檢查,允許你訪問或調用原本不可見的成員(如 private 構造方法、方法或字段)。con.setAccessible(true);//實例化Object studentNewInstance = con.newInstance(20);System.out.println("獲得私有帶一個參數構造方法并修改年齡:"+studentNewInstance);} catch (Exception e) {throw new RuntimeException(e);}}//獲取類的所有構造方法并實例化public static void reflectionConstructor(){try{Class<?> classStudent = Class.forName("reflection.Student");//取類的所有構造方法Constructor<?>[] con = classStudent.getDeclaredConstructors();//使所有構造方法繞過 Java 的訪問控制檢查,允許訪問或調用原本不可見的成員for(Constructor<?> constructor:con){constructor.setAccessible(true);}//實例化Object s1 = con[3].newInstance();Object s2 = con[0].newInstance("lihua",23);System.out.println("獲得公有帶一個參數構造方法并修改姓名:"+s1);System.out.println("獲得私有帶兩個參數構造方法并修改姓名和年齡:"+s2);} catch (Exception e) {throw new RuntimeException(e);}}//獲取私有屬性public static void reflectPrivateField(){try {Class<?> classStudent = Class.forName("reflection.Student");//實例化Object s1 = classStudent.newInstance();//獲取私有屬性Field field = classStudent.getDeclaredField("name");field.setAccessible(true);//修改私有屬性field.set(s1,"xh");//獲取修改后的私有屬性String name = (String) field.get(s1);System.out.println("修改之后的私有屬性:"+name);} catch (Exception e) {throw new RuntimeException(e);}}//獲取私有方法public static void reflectPrivateMethod(){try {Class<?> classStudent = Class.forName("reflection.Student");//獲取私有方法Method method = classStudent.getDeclaredMethod("eat",String.class);System.out.println("獲取私有?法的?法名為:"+method.getName());method.setAccessible(true);//實例化Object s1 = classStudent.newInstance();//方法調用method.invoke(s1,"vegetable");} catch (Exception e) {throw new RuntimeException(e);}}public static void main(String[] args) {reflectNewInstance();reflectPublicConstructor();reflectPrivateConstructor();reflectionConstructor();reflectPrivateField();

3.?反射優點和缺點

1. 優點

1. 動態性(運行時操作類)

  • 無需在編譯時確定類,可以在運行時動態加載類、調用方法、訪問屬性。

2. 訪問私有成員

  • 通過?setAccessible(true)?可以繞過 Java 的訪問控制,訪問?private?方法、屬性和構造方法。

3. 泛型擦除時獲取真實類型

  • 由于 Java 泛型在運行時會被擦除(Type Erasure),可以通過反射獲取泛型的實際類型。

4. 注解處理

  • 反射可以讀取類、方法、字段上的注解,實現靈活的配置和擴展。

5. 動態創建和操作對象

  • 可以在運行時動態創建對象、調用方法,適用于?高度靈活?的場景。

2. 缺點

大家都說 Java 反射效率低,你知道原因在哪里么_慕課手記

1. 性能較差

  • 反射比直接調用慢 10~100 倍,主要因為:

    • JVM 無法優化反射調用(如方法內聯)。

    • 需要額外的安全檢查(如?AccessibleObject.setAccessible())。

  • 影響場景

    • 高頻調用的代碼(如循環內使用反射)。

    • 高性能要求的系統(如交易系統、游戲引擎)。

2. 破壞封裝性

  • setAccessible(true)?可以繞過?private?限制,導致:

    • 代碼安全性降低(惡意代碼可能篡改私有數據)。

    • 破壞面向對象的封裝原則(如?final?字段被修改)。

3. 代碼可讀性和維護性差

  • 反射代碼通常?冗長、難以調試,IDE 也無法提供智能提示。

4. 編譯時檢查失效

  • 反射調用在?編譯期不會檢查錯誤(如方法名拼寫錯誤、參數類型不匹配),只能在運行時拋出異常。

5. 安全問題

  • 反射可以?繞過安全管理器(SecurityManager),可能導致:

    • 私有 API 被非法調用。

    • 敏感數據泄露(如通過反射獲取?Password?字段)。

通過?getDeclaredMethods()getDeclaredFields()?或?getDeclaredConstructors()?獲取的方法、屬性或構造方法的順序是不確定的,具體順序取決于 JVM 的實現(如 OpenJDK 和 Oracle JDK 可能不同)。所以我們可以使用 Arrays.sort?按名稱、修飾符、參數類型等自行排序。
優點缺點
動態加載和操作類性能差(比直接調用慢 10~100 倍)
可訪問私有成員破壞封裝性
支持泛型擦除時的類型獲取代碼可讀性差
強大的注解處理能力編譯時檢查失效
適用于框架和靈活架構可能引發安全問題

2. 枚舉

1. 背景及定義

枚舉是在JDK1.5以后引?的。主要?途是:將?組常量組織起來,在這之前表??組常量通常使?定義常量的?式:
public static final int RED = 1;
public static final int GREEN = 2;
public static final int WHITE = 3;
但是常量舉例有不好的地?,例如:可能碰巧有個數字1,但是他有可能誤會為是RED,現在我們可以直接?枚舉來進?組織,這樣?來,就擁有了類型,枚舉類型。?不是普通的整形1
優點:將常量組織起來統?進?管理
場景:錯誤狀態碼,消息類型,顏?的劃分,狀態機等等....
本質:是 java.lang.Enum 的?類,也就是說,??寫的枚舉類,就算沒有顯?的繼承 Enum ,但 是其默認繼承了這個類。

2. Enum 類的常??法

枚舉可以像普通類一樣定義字段、構造方法和普通方法。此時,枚舉常量必須調用相應的構造方法:

3. 關鍵點:

  1. 枚舉常量必須放在枚舉類的最前面,并用逗號?,?分隔,最后一個常量后用分號?;?,后面才能定義字段和方法。。

  2. 枚舉的構造方法是自動調用的,構造方法必須與枚舉常量的參數匹配(無參常量 → 無參構造方法;帶參常量 → 帶參構造方法)。

  3. 構造方法默認是?private,不能聲明為?public?或?protected(因為枚舉的實例只能由枚舉自身創建)。

  4. 構造方法調用是隱式的,當枚舉類被 JVM 加載時,所有枚舉常量會被初始化,并自動調用對應的構造方法(不能手動調用構造方法),例如?WHITE("White",5);

  5. 枚舉常量是單例的構造方法只會被調用一次

  6. 每個枚舉常量本質上是一個靜態實例,相當于:

public static final EnumDom WHITE = new EnumDom("White",10);

(枚舉類型(enum)的構造方法默認是私有的(private),這意味著你不能直接使用new關鍵字來創建枚舉實例。 枚舉常量必須通過枚舉類型本身隱式創建。例如?WHITE("White",5);

7.?在Java中,枚舉常量的引用不可變,但若設計不當(含非?final?字段),其內部狀態可能被修改。強烈建議將枚舉設計為完全不可變

4. 使用

public enum EnumDom {RED,//無參枚舉常量GREEN("Green"),//帶一個參數的枚舉常量WHITE("White",5);//帶兩個參數的枚舉常量//枚舉類型(enum)的構造方法默認是私有的(private),這意味著你不能直接使用new關鍵字來創建枚舉實例。// 枚舉常量必須通過枚舉類型本身隱式創建。//public static final EnumDom WHITE = new EnumDom("White",10);//構造方法必須匹配枚舉常量的參數類型和數量//無參構造方法(可不寫,java會自動提供)private EnumDom(){}public String name;public int code;//帶一個參數的構造方法private EnumDom(String name){this.name = name;}//帶兩個參數的構造方法private EnumDom(String name,int code){this.name = name;this.code = code;System.out.println(this.name+" "+this.code);}//方法private void color(String name){this.name = name;//非final字段,可以修改System.out.println(this.name);}//    @Override
//    public String toString() {
//        return "EnumDom{" +
//                "name='" + name + '\'' +
//                ", code=" + code +
//                '}';
//    }public static void main(String[] args) {//直接調用枚舉常量//枚舉常量在類加載時通過構造方法初始化,且僅初始化一次(線程安全)。EnumDom w1 = EnumDom.WHITE;EnumDom w2 = EnumDom.WHITE;System.out.println(w1);System.out.println(w2);System.out.println(w1==w2);//同一個WHITE//以數組形式返回枚舉類型的所有成員EnumDom[] enumDom = EnumDom.values();for(EnumDom e: enumDom){System.out.print(e+" ");//獲取枚舉成員的索引位置System.out.println(e.ordinal());}//將普通字符串轉換為枚舉實例EnumDom e1 = EnumDom.valueOf("RED");System.out.println(e1);//比較兩個枚舉成員在定義時的順序System.out.println(enumDom[0].compareTo(enumDom[2]));//方法調用enumDom[0].color("red");enumDom[1].color("green");}
}

5. 枚舉和反射

通過反射我們可以獲取枚舉常量本身,非final字段,方法,構造方法信息,注解信息

不可以獲取/操作的內容:

  1. 無法通過構造方法創建新的枚舉實例

    • 嘗試反射調用構造方法會拋出IllegalArgumentException: Cannot reflectively create enum objects

  2. 無法修改final字段(除非使用特殊技巧)

    • 常規反射無法修改final字段

    • 需要先修改Field的modifiers字段(不推薦)

  3. 無法獲取編譯器生成的某些特殊方法

    • values()valueOf()方法在字節碼中是編譯器生成的

  4. 無法改變枚舉常量的順序(ordinal)

    • ordinal是final的且由編譯器決定

  5. 無法刪除或添加枚舉常量

    • 枚舉集合在運行時是固定的

package enumeration;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;public class Test {public static void main(String[] args) {try{Class<?> clazz = Class.forName("enumeration.EnumDom");//獲取所有枚舉常量并調用對應的構造方法Object[] enumDoms = clazz.getEnumConstants();//打印所有枚舉成員for(Object em :enumDoms ){System.out.println(em);}//獲取枚舉構造方法Constructor<?>[] con = clazz.getDeclaredConstructors();for(Constructor<?> constructor:con){constructor.setAccessible(true);}//獲取指定枚舉構造方法,包含繼承的Enum的構造方法的參數Constructor<?> con1 = clazz.getDeclaredConstructor(String.class,int.class,String.class);//無法通過反射創建新實例//Object e1 = con[0].newInstance();//拋出異常 Cannot reflectively create enum objects//System.out.println(e1);//獲取枚舉類的方法Method method = clazz.getDeclaredMethod("color",String.class);method.setAccessible(true);method.invoke(EnumDom.RED,"red");//在反射中可以直接調用枚舉常量method.invoke(enumDoms[1],"green");} catch (Exception e) {throw new RuntimeException(e);}}
}

3. Lambda表達式

1. 背景

Lambda表達式是Java SE 8中?個重要的新特性。lambda表達式允許你通過表達式來代替功能接?。 lambda表達式就和?法?樣,它提供了?個正常的參數列表和?個使?這些參數的主體(body,可以是?個表達式或?個代碼塊)。 Lambda 表達式(Lambda expression),基于數學中的λ演算得名,也可稱為閉包(Closure) 。

2. Lambda表達式的語法

(parameters) -> expression
(parameters) ->{ statements; }
Lambda表達式由三部分組成:
1. paramaters:類似?法中的形參列表,這?的參數是函數式接??的參數(可以包含零個或多個) 。這?的參數類型可以明確的聲明也可不聲明?由JVM隱含的推斷。另外當只有?個參數且無參數類型時可以省略掉圓括號。
2. ->:可理解為“被?于”的意思,將參數與方法體分開
3. ?法體:可以是單個表達式或代碼塊,是函數式接???法的實現。代碼塊可返回?個值或者什么都不返回,這?的代碼塊等同于?法的?法體。如果是表達式,也可以返回?個值或者什么都不返回。單個表達式或不用return關鍵字 直接返回表達式結果可以省略大括號{}。

3.?函數式接?

?個接?有且只有?個抽象?法 。
注意:
1. 如果?個接?只有?個抽象?法,那么該接?就是?個函數式接?
2. 如果我們在某個接?上聲明了 @FunctionalInterface 注解,那么編譯器就會按照函數式接?的定義來要求該接?,這樣如果有兩個抽象?法,程序編譯就會報錯的。所以,從某種意義上來說,只要你保證你的接?中只有?個抽象?法,你可以不加這個注解。加上就會?動進?檢測的。
//?返回值?參數
@FunctionalInterface
interface NoParameterNoReturn {void test();
}
//?返回值?個參數
@FunctionalInterface
interface OneParameterNoReturn {void test(int a);
}
//?返回值多個參數
@FunctionalInterface
interface MoreParameterNoReturn {void test(int a,int b);
}
//有返回值?參數
@FunctionalInterface
interface NoParameterReturn {int test();
}
//有返回值?個參數
@FunctionalInterface
interface OneParameterReturn {int test(int a);
}
//有返回值多參數
@FunctionalInterface
interface MoreParameterReturn {int test(int a,int b);
}
public class Test {public static void main(String[] args) {//內部類NoParameterNoReturn noParameterNoReturn1 = new NoParameterNoReturn() {@Overridepublic void test() {System.out.println("?返回值?參數1");}};noParameterNoReturn1.test();NoParameterNoReturn noParameterNoReturn =()->System.out.println("?返回值?參數2");noParameterNoReturn.test();//當只有一個參數時,無參數類型,可以不需要()OneParameterNoReturn oneParameterNoReturn = x->{System.out.print("?返回值一個參數:");System.out.println(x);};oneParameterNoReturn.test(10);MoreParameterNoReturn moreParameterNoReturn = (x,y)->{System.out.print("?返回值多個參數:");System.out.println(x+y);};moreParameterNoReturn.test(10,20);//當 Lambda 體不使用 return 語句時,直接返回表達式結果不需要大括號NoParameterReturn noParameterReturn = ()->100;System.out.print("有返回值無參數:");System.out.println(noParameterReturn.test());//當 Lambda 體使用 return 語句時,必須使用大括號 {} 包裹代碼塊OneParameterReturn oneParameterReturn = (int x)->{return x;};System.out.print("有返回值一個參數:");System.out.println(oneParameterReturn.test(200));MoreParameterReturn moreParameterReturn = (x,y)->{System.out.print("有返回值多個參數:");return x+y;};System.out.println(moreParameterReturn.test(300,400));}
}

4.?Lambda 表達式和匿名內部類

特性Lambda 表達式匿名內部類
引入版本Java 8Java 1.1
語法簡潔性更簡潔相對冗長
適用場景僅適用于函數式接口(單個抽象方法)適用于任何接口或抽象類
生成類文件不生成額外.class文件生成外部類$數字.class文件
this關鍵字含義指向外部類實例指向內部類自身實例

1. 變量捕獲

Lambda 表達式可以捕獲外部作用域的變量,這種特性稱為"變量捕獲"(Variable Capture)。這是 Lambda 表達式強大功能之一,但也需要遵循特定規則。

1. 局部變量捕獲

Lambda 可以捕獲方法中的局部變量,但有嚴格限制:

  • 被捕獲的局部變量必須是?final 或 effectively final(即初始化后不再修改)

  • 原因:Lambda 可能在原始變量生命周期結束后執行,Java 需要保證值的一致性

2. 實例變量捕獲

Lambda 可以自由捕獲所在類的實例變量:

  • 可以讀取

  • 可以修改

  • 不需要是 final

3. 靜態變量捕獲

Lambda 可以自由捕獲靜態變量:

  • 可以讀取

  • 可以修改

  • 不需要是 final

變量類型可讀性可修改性final要求
局部變量必須effectively final
實例變量不需要
靜態變量不需要
interface Student{void fun();
}
public class Test2 {public int a = 10;//實例變量public static int b = 20;//靜態變量public void fuction(){int c = 30;//局部變量Student student = ()->{a = 40;b = 50;//被捕獲的局部變量必須final 或 effectively final(即初始化后不再修改)//c = 60;//err System.out.println(a);//40System.out.println(b);//50System.out.println(c);//30};student.fun();}public static void main(String[] args) {Test2 test2 = new Test2();test2.fuction();}
}

5.?Lambda在集合當中的使?

注意:Collection的 forEach()?法是從接? java.lang.Iterable 拿過來的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901757.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901757.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901757.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言教程(十):C 語言函數詳解

一、引言 在 C 語言中&#xff0c;函數是一組執行特定任務的代碼塊。通過將復雜的程序邏輯劃分為多個函數&#xff0c;不僅能提高代碼的可讀性、可維護性&#xff0c;還便于代碼的復用。無論是簡單的數學計算&#xff0c;還是復雜的系統操作&#xff0c;函數都發揮著核心作用。…

力扣面試150題--有效的字母異位詞和字母異位詞分組

Day 24 題目描述 思路 初次思路&#xff1a;如果兩個字符串為異位詞&#xff0c;說明它們長度相同并且字母出現的次數相同&#xff0c;于是有以下做法&#xff1a; 定義一個map&#xff0c;來保存s中每個字符的出現次數處理特殊情況&#xff0c;如果長度不同&#xff0c;直接…

數理邏輯(Mathematical Logic)綜論與跨學科應用

李升偉 整理 數理邏輯&#xff08;Mathematical Logic&#xff09;是現代邏輯學與數學交叉的核心學科&#xff0c;以嚴格的數學方法研究邏輯推理的形式與規律。其發展深刻影響了數學基礎、計算機科學、語言哲學等領域。以下從多個維度綜論數理邏輯&#xff1a; 1. 核心分支 命…

高性能內存kv數據庫Redis(續)

目錄 四.主從同步與對象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis為什么要實現持久化 2.2fork進程的寫時復制機制 2.3大Key的影響 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的優缺點 3.redis里面的高可用體現在哪里&#xff1f; 3.1r…

泛型算法——只讀算法(一)

在 C 標準庫中&#xff0c;泛型算法的“只讀算法”指那些 不會改變它們所操作的容器中的元素&#xff0c;僅用于訪問或獲取信息的算法&#xff0c;例如查找、計數、遍歷等操作。 accumulate std::accumulate()是 C 標準庫**numeric**頭文件中提供的算法&#xff0c;用于對序列…

SvelteKit 最新中文文檔教程(21)—— 最佳實踐之圖片

前言 Svelte&#xff0c;一個語法簡潔、入門容易&#xff0c;面向未來的前端框架。 從 Svelte 誕生之初&#xff0c;就備受開發者的喜愛&#xff0c;根據統計&#xff0c;從 2019 年到 2024 年&#xff0c;連續 6 年一直是開發者最感興趣的前端框架 No.1&#xff1a; Svelte …

健康養生:開啟活力生活的密鑰

當我們在健身房看到年逾六旬卻身形矯健的老人&#xff0c;在公園偶遇精神矍鑠、步伐輕快的長者&#xff0c;總會驚嘆于他們的健康狀態。其實&#xff0c;這些都得益于長期堅持科學的養生之道。健康養生并非遙不可及的玄學&#xff0c;而是融入生活細節的智慧。? 在飲食的世界…

Linux信號三部曲:產生機制、處理方式與內核接口

Linux系列 文章目錄 Linux系列前言一、背景知識鋪墊1.1 信號的基本概念1.2 進程對信號的處理 二、信號的產生2.1 前臺進程和后臺進程2.2 鍵盤組合鍵2.3 kill 命令2.4 系統調用2.4.1 signal()接口2.4.2 kill()接口2.4.3 raise()接口2.4.4 abort()接口 總結 前言 Linux中&#x…

win7/win10/macos如何切換DNS,提升網絡穩定性

本篇教程教您如何在Windows10、Windows8.1、Windows7、MacOS操作系統切換DNS&#xff0c;以提升系統的穩定性&#xff0c;獲得更好的操作體驗。 Windows10及Windows8.1 1、右鍵單擊“此計算機”&#xff0c;然后選擇“屬性”。進入Windows系統界面后&#xff0c;選擇左側的“…

移動硬盤突然打不開緊急救援指南:從排查到完整恢復?

突發狀況的典型特征? 當移動硬盤突然打不開時&#xff0c;用戶常會遇到多種異常表現&#xff1a;接入電腦后硬盤指示燈雖亮但無法識別、系統反復提示“設備未連接成功”或彈出“磁盤結構損壞”的警告。部分情況下&#xff0c;資源管理器中的盤符雖可見&#xff0c;但雙擊后顯示…

華為OD機試真題——統計匹配的二元組個數(2025A卷:100分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析&#xff1b; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式&#xff01; 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《統計匹配…

半導體制造如何數字化轉型

半導體制造的數字化轉型正通過技術融合與流程重構&#xff0c;推動著這個精密產業的全面革新。全球芯片短缺與工藝復雜度指數級增長的雙重壓力下&#xff0c;頭部企業已構建起四大轉型支柱&#xff1a; 1. 數據中樞重構產線生態 臺積電的「智慧工廠4.0」部署著30萬物聯網傳感器…

[Spark]深入解密Spark SQL源碼:Catalyst框架如何優雅地解析你的SQL

本文內容組織形式 總結具體例子執行語句解析層優化層物理計劃層執行層 猜你喜歡PS 總結 先寫個總結&#xff0c;接下來會分別產出各個部分的源碼解析&#xff0c;Spark SQL主要分為以下五個執行部分。 具體例子 接下來舉個具體的例子來說明 執行語句 SELECT name, age FR…

【數據結構】4.單鏈表實現通訊錄

在上一篇文章我們學會了用單鏈表來實現各種方法&#xff0c;在這一篇文章我們將在單鏈表的基礎上實現通訊錄。 0、準備工作 實現通訊錄之前&#xff0c;我們還需要在單鏈表的基礎上添加2個文件&#xff0c;頭文件Contact.h和源文件Contact.c。Contact.c來實現通訊錄方法的聲明…

【bash】.bashrc

查看當前路徑文件數量 alias file_num"ls -l | grep ^- | wc -l"查看文件大小 alias file_size"du -sh"alias ll alias ll"ls -ltrh"cd的同時執行ll alias cdcdls; function cdls() {builtin cd "$1" && ll }自定義prompt…

微信小程序實戰案例 - 餐館點餐系統 階段 2 – 購物車

階段?2 – 購物車&#xff08;超詳細版&#xff09; 目標 把“加入購物車”做成 全局狀態&#xff0c;任何頁面都能讀寫在本地 持久化&#xff08;關閉小程序后購物車仍在&#xff09;新建 購物車頁&#xff1a;數量增減、總價實時計算、去結算入口打 Git?Tag v2.0?cart 1. …

從紅黑樹到哈希表:原理對比與典型場景應用解析(分布式以及布隆過濾器)

在數據結構的世界里&#xff0c;紅黑樹一直以「自平衡二叉查找樹」的身份備受贊譽。憑借紅黑節點的精妙設計&#xff0c;它能將插入、刪除、查找的時間復雜度穩定控制在 ( log ? n ) (\log n) (logn)&#xff0c;成為處理有序數據的經典方案。然而&#xff0c;當業務場景對「…

游戲報錯?MFC140.dll怎么安裝才能解決問題?提供多種MFC140.dll丟失修復方案

MFC140.dll 是 Microsoft Visual C 2015 運行庫的重要組成部分&#xff0c;許多軟件和游戲依賴它才能正常運行。如果你的電腦提示 "MFC140.dll 丟失" 或 "MFC140.dll 未找到"&#xff0c;說明系統缺少該文件&#xff0c;導致程序無法啟動。本文將詳細介紹 …

《電子類專業:通往科技未來的鑰匙》

一、電子類專業全景概覽 在當今科技飛速發展的時代,電子類專業無疑占據著現代科技體系中基礎與核心的重要地位。從我們日常生活中不可或缺的智能手機、電腦,到推動社會進步的人工智能、大數據技術,再到探索宇宙奧秘的航天航空設備,電子類專業的身影無處不在。它就像一把萬…

Java--批量刪除

前端部分 前端代碼主要負責收集用戶選擇的學生記錄的 id&#xff0c;并將這些 id 發送給后端的 DeleteMoreServlet 進行處理。 批量刪除按鈕綁定點擊事件 $(".deleteMore").on("click",function(){// ... }); 當用戶點擊 “批量刪除” 按鈕時&#xff…