1. 程式人生 > 實用技巧 >Linux驅動之GPIO子系統和pinctrl子系統

Linux驅動之GPIO子系統和pinctrl子系統

Java常用類

內部類

內部類大體分為四種:

  • 成員內部類
  • 靜態內部類
  • 區域性內部類
  • 匿名內部類

成員內部類

//外部類
public class Outer{
    private String name = "張三";
    //...
    public class Inner{
        //成員內部類
        private String name = "李四";
        
        //private static int age = 18;//不被允許
        private static final int age = 18;//靜態常量,允許
        public void show(){
            System.out.println(Outer.this.name);
        }
        //...
    }
}
  • 成員內部類可以訪問外部類的私有屬性
  • 如果成員內部類的屬性和外部類的屬性重名,但是想要使用外部類的屬性的時候可以使用“外部類類名.this.屬性名”。eg:Outer.this.name
  • 成員內部類不能定義靜態成員
  • 可以包含靜態常量

關於如何建立內部類物件:

Outer out = new Outer();
Inner in = out.new Inner();
  • 內部類物件的建立必須依賴外部類物件

靜態內部類

public class Outer{
    private String name = "張三";
    private int age = 20;
    //靜態內部類,和外部類相同
    public static class Inner{
        private String address = "地球";
        private static int age = 18;//靜態成員是允許的
        
        public void show(){
            //呼叫外部類屬性
            Outer outer = new Outer();
            System.out,println(outer.name);
            System.out,println(outer.age);
            //呼叫內部類屬性
            System.out,println(address);
            //呼叫靜態屬性
            System.out,println(Inner.age);
        }
    }
}

關於靜態內部類呼叫外部類屬性:

  1. 先建立外部類物件
  2. 呼叫內部類物件的屬性

直接建立靜態內部類物件

Outer.Inner in = new Outer.Inner();

區域性內部類

定義在外部類的方法中,作用範圍和建立物件僅限於當前方法。

public class Outer {
    private String name = "張三";
    private int age = 18;
    public void show(){
        String address = "上海";

        //區域性內部類:不能加任何訪問修飾符
        class Inner{
            private String phone = "121321-123";
            private String email = "[email protected]";

            public void show1(){
                //訪問外部類屬性
                System.out.println(Outer.this.name);
                System.out.println(age);
                //訪問內部類屬性
                System.out.println(this.phone);
                System.out.println(email);
                //訪問區域性變數,jdk1.7,變數必須加final,jdk1.8自動新增fianl
                System.out.println(address);
            }
        }
        //建立區域性內部類物件
        Inner in = new Inner();
        in.show1();
    }
}
  • 建立區域性內部類物件需要在方法體內建立,進而使用。

  • 訪問區域性變數的時候,jdk1.7中變數必須加final,jdk1.8自動新增fianl

匿名內部類

  • 類似於沒有類名的區域性內部類
  • 必須繼承一個父類或實現一個介面
//介面Usb
public interface Usb{
    void service();
}
//Test類
public class Application {
    public static void main(String[] args) {
       //匿名內部類
        Usb usb = new Usb(){
            @Override
            public void service(){
                System.out.println("風扇開始工作...");
            }
        }
        usb.service();
    }
}

Object類

  • 超類、基類,所有類的直接或者間接父類,繼承樹的最頂層
  • 任何類如果沒有extends某個類,都是直接繼承Object類,否則就是間接繼承Object類
  • Object類中所定義的方法,是所有物件都具備的方法
  • Object型別可以儲存任何物件

getClass()方法

示例程式碼:

package com.huaji.demo3;

public class Person {
    public int id;
    private String name;
    public Person(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
}
package com.huaji;


import com.huaji.demo3.Person;

public class Application {
    public static void main(String[] args) {
        Person p = new Person(1,"huaji");
        System.out.println(p.getClass());
        System.out.println(p.getClass().getName());
        System.out.println(p.getClass().getSimpleName());
        System.out.println(p.id);
    }
}

執行結果:

class com.huaji.demo3.Person
com.huaji.demo3.Person
Person
1
  • getClass()方法是獲得呼叫該方法的物件的類;getClass().getName()可以得到該類的路徑;
  • 通過getClass()方法得到該物件類Class後,可以通過Class獲取這個類中的相關屬性和方法;

hashCode()方法

  • public int hashCode(){}
  • 返回該物件的雜湊碼值
  • 雜湊值是根據物件的地址字串字串使用hash演算法計算出來的int型別的數值
  • 一般情況下相同的物件返回相同雜湊碼
public class Application {
    public static void main(String[] args) {
        Person p = new Person(1,"huaji");
        
        System.out.println(p.hashCode());
    }
}

356573597

toString()方法

  • public String toString(){}
  • 返回該物件的字串表示
  • 可以根據需求覆蓋此方法

equals()方法

  • public boolean equals(Object obj){}

  • 預設實現為(this==obj),比較兩個物件地址是否相同

  • 可進行覆蓋,比較兩物件內容是否相同

關於重寫equals為比較倆物件內容是否相同:

public class Student{
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;

    @Override
    public boolean equals(Object obj) {
        //1.判斷兩物件是否是同一個引用
        if (this==obj){
            return true;
        }
        //2.判斷obj是否null
        if (obj==null){
            return false;
        }
        //3.判斷是否是同一型別
        if (obj instanceof Student){
            //4.強制型別轉換
            Student s = (Student)obj;
            //5.判斷屬性是否相等
            if (this.name.equals(s.getName()))
            return true;
        }
        return false;
    }
}

finalize()方法

  • protected void finalize() throws Throwable { }
    
  • 當物件被判定為垃圾物件時,由JVM自動呼叫此方法,用以標記垃圾物件,進入回收佇列

  • 垃圾物件:沒有有效引用指向此物件時,為垃圾物件

  • 垃圾回收:由GC銷燬垃圾物件,釋放資料儲存空間(Garbage Collection,垃圾收集,垃圾回收)

  • 自動回收機制:JVM的記憶體耗盡,一次性回收所有垃圾物件

  • 手動回收機制:使用System.gc();通知JVM執行垃圾回收

使用情況:

finalize()方法中一般用於釋放非Java 資源(如開啟的檔案資源、資料庫連線等),或是呼叫非Java方法(native方法)時分配的記憶體(比如C語言的malloc()系列函式)。

為什麼避免使用:

首先,由於finalize()方法的呼叫時機具有不確定性,從一個物件變得不可到達開始,到finalize()方法被執行,所花費的時間這段時間是任意長的。我們並不能依賴finalize()方法能及時的回收佔用的資源,可能出現的情況是在我們耗盡資源之前,gc卻仍未觸發,因而通常的做法是提供顯示的close()方法供客戶端手動呼叫。
另外,重寫finalize()方法意味著延長了回收物件時需要進行更多的操作,從而延長了物件回收的時間。

包裝類

  • 基本資料型別所對應的引用資料型別。eg:int->Integer,byte->Byte,float->Float.....
  • Object可統一所有資料,包裝類的預設值是null

型別轉換

裝箱

基本型別轉換成引用型別的過程

int num=10;
//使用Integer類建立物件
Integer integer=new Integer(num);//方法一
Integer integer1=Integer.valueOf(num);//方法二

拆箱

引用型別換成基本型別轉的過程

Integer integer=new Integer(100);
int num=Integer.intValue();//jdk1.5之前的方式 

jkd1.5以後,Java提供自動裝箱拆箱

int age=10;
//自動裝箱
Integer integer=age;
//自動拆箱
int age1=integer;

基本型別和字串之間轉換

基礎型別轉換成字串的過程

int n=100;
//1.使用+
String s1=n+"";
//2.使用Integer的toString()方法
String s2=Integer.toString(n);

字串轉換成基礎型別的過程

String str="150";
//使用Integer。parseXXX()
int n=Integer.parseInt(str);

String 類

  • String物件的值儲存在字串常量池中,常量池位於堆記憶體中
  • 字串的比較中,“==“表示的是對地址的比較,equals的話,先比較引用,如果引用相等,返回值為true,如果引用不相等,再比較值,如果值相等,返回值也是true,只有當引用和值都不相等的情況下,返回的才是false。
  • new的話會在堆中建立一個物件,一個new對應一個物件
String s1=new String("張三");
String s2=new String("張三");
System.out.println(s1==s2);//false,由於==比較的是地址,儘管內容都是“張三”,但是s1和s2在棧中對應不同的地址

String s3="張三";
String s4="張三";
System.out.println(s3==s4);//true,s1指向字串常量池中的“張三”,s4也指向字串常量池中的“張三”,所以它兩地址相同

String 常用方法

  1. int length();  語法:字串變數名.length();  返回值為 int 型別。得到一個字串的字元個數(中、英、空格、轉義字元皆為字元,計入長度)
  2. char charAt(值);  語法 :字串名.charAt(值);  返回值為 char 型別。從字串中取出指定位置的字元
  3. char toCharArray();  語法 :字串名.toCharArray();  返回值為 char 陣列型別。將字串變成一個字元陣列
  4. int indexOf("字元")  語法 :字串名.indexOf("字元");字串名.indexOf("字元",值);查詢一個指定的字串是否存在,返回的是字串的位置,如果不存在,則返回-1 。 in lastIndexOf("字元") 得到指定內容最後一次出現的下標
  5. toUpperCase(); toLowerCase();字串大小寫的轉換
  6. String[] split("字元")  根據給定的正則表示式的匹配來拆分此字串。形成一個新的String陣列。
  7. boolean equals(Object anObject)  語法 :字串變數名.wquals(字串變數名);  返回值為布林型別。所以這裡用 if 演示。比較兩個字串是否相等,返回布林值
  8. trim();  去掉字串左右空格  replace(char oldChar,char newChar);新字元替換舊字元,也可以達到去空格的效果一種。
  9. String substring(int beginIndex,int endIndex)  擷取字串,beginIndex表示索引開始的位置,endIndex表示索引結束的位置
  10. boolean equalsIgnoreCase(String) 忽略大小寫的比較兩個字串的值是否一模一樣,返回一個布林值
  11. boolean contains(String) 判斷一個字串裡面是否包含指定的內容,返回一個布林值
  12. boolean startsWith(String)  測試此字串是否以指定的字首開始。返回一個布林值
  13. boolean endsWith(String)  測試此字串是否以指定的字尾結束。返回一個布林值
  14. String replaceAll(String,String) 將某個內容全部替換成指定內容,String repalceFirst(String,String) 將第一次出現的某個內容替換成指定的內容

StringBuffer類和StringBuilder類

  • StringBuffer:可變長字串,jkd1.0提供,執行效率慢、執行緒安全
  • StringBuilder:可變長字串,jkd1.5提供,執行效率快、執行緒不安全
  • 都比String效率高、節省記憶體
StringBuffer sb=new StringBuffer();
//StringBuild sb=new StringBuild();
        //1.append();追加
        sb.append("java世界第一");
        System.out.println(sb.toString());
        sb.append("java真香");
        System.out.println(sb.toString());
        sb.append("java太香啦");
        System.out.println(sb.toString());
        //2.insert();新增
        sb.insert(0,"我在最前面");
        System.out.println(sb.toString());
        //3.replace();替換
        sb.replace(0,5,"hello");
        System.out.println(sb.toString());
        //4.delete();刪除
        sb.delete(0,5);
        System.out.println(sb.toString());

執行結果:

java世界第一
java世界第一java真香
java世界第一java真香java太香啦
我在最前面java世界第一java真香java太香啦
hellojava世界第一java真香java太香啦
java世界第一java真香java太香啦

BigDecimal類

由於float、double都是近似值儲存,所有此類資料進行運算的話會產生誤差,儘管誤差不大,但在某些需求高精度的領域就會產生影響,所以引進使用BigDecimal類

  • java.math包內
  • 一般想要精確計算的話,傳進的值儘量使用字串形式
BigDecimal bd1=new BigDecimal("1.0");
        BigDecimal bd2=new BigDecimal("0.9");
        //減法
        BigDecimal r1=bd1.subtract(bd2);
        System.out.println(r1);
        //加法
        BigDecimal r2=bd1.add(bd2);
        System.out.println(r2);
        //乘法
        BigDecimal r3=bd1.multiply(bd2);
        System.out.println(r3);
        //除法
        BigDecimal r4=new BigDecimal("1.4")
                .subtract(new BigDecimal("0.5"))
                .divide(new BigDecimal("0.9"));
        System.out.println(r4);

執行結果:

0.1
1.9
0.90
1
  • 除法:divide(BigDecimal bd,int scal,RoundingMode mode) 引數scal:制定精確到小數點後幾位 引數mode:指定小數部分的取捨模式,通常使用四捨五入(BigDecimal.ROUND_HALF_UP)

Date類

Date表示特定的瞬間,精確到毫秒。Date中大部分方法都已經被Calendar類中的方法所取代

Calendar類

Calendar為抽象類,無法直接建立物件使用,裡面有一個靜態方法叫getInstance(),該方法返回了Calendar類的子類物件。static Calendar getInstance() 使用預設時區和語言環境獲取一個日曆

// 多型
	Calendar c = Calendar.getInstance();
	Syste.out.println(c);   
  • get方法

    ​ public int get(int field):返回給定日曆欄位的值
    ​ 引數:傳遞指定的日曆欄位(YEAR,MONTH...)
    返回值:日曆欄位代表的具體的值

    Copypublic static void main(String[] args) {
            demo01();
    }
    
    public static void demo01(){
            // 使用getInstance方法獲取Calendar物件
            Calendar c = Calendar.getInstance();
            System.out.println(c);
            int year = c.get(Calendar.YEAR);
            System.out.println(year);
    
            int mouth = c.get(Calendar.MONTH);
            // 西方月份0-11  東方月份1-12
            System.out.println(mouth);
    
            int date = c.get(Calendar.DAY_OF_MONTH);
            System.out.println(date);
            int date2 = c.get(Calendar.DATE);
            System.out.println(date2);
        }
    
  • set方法

​ public void set(int field,int value):將給定的日曆欄位設定為給定值
引數:
​ int field:傳遞指定的日曆欄位(YEAR,MONTH...)
​ int value:給指定的欄位設定值

Copypublic static void main(String[] args) {
         demo02();
   }
 public static void demo02(){
        // 使用getInstance方法獲取calendar物件
        Calendar c = Calendar.getInstance();
        System.out.println(c);

        c.set(999,6,6);
        // 獲取年
        c.set(Calendar.YEAR,666);
        int year = c.get(Calendar.YEAR);
        System.out.println("系統時間:"+year);
        System.out.println("重新設定年::"+year);

        // 重新設定月
        c.set(Calendar.MONTH,6);
        int month = c.get(Calendar.MONTH);
        System.out.println("月份:"+month);

        // 重新設定日
        c.set(Calendar.DATE,11);
        // 獲取日
        int date = c.get(Calendar.DATE);
        System.out.println(date);

        c.set(999,6,6);
        System.out.println(year+"年"+month+"月"+date+"日");
    }
  • add方法

public abstract void add(int field,int amount):根據日曆的規則,得指定的日曆欄位新增或者減去指定的時間量把指定的欄位量增加/減少指定的值
引數:
int field:傳遞指定的日曆欄位(YEAR,MONTH...)
int amount:增加/減少指定的值
正數:增加
負數:減少

public static void main(String[] args) {
         demo03();
}

public static void demo03(){
        Calendar c = Calendar.getInstance();
        // 增加兩年
        c.add(Calendar.YEAR,2);
        int year = c.get(Calendar.YEAR);
        System.out.println(year);

        // 減少兩個月
        c.add(Calendar.MONTH,-1);
        int month = c.get(Calendar.MONTH);
        System.out.println(month);
    }
  • getTime方法

Calendar中的getTime方法並不是獲取毫秒時刻,而是拿到對應的Date物件。

格式:

​ public Date getTime():返回一個表示此calendar時間值(從曆元到現在的毫秒值偏移量)的Date物件
把日曆物件,轉換為日期物件

public static void main(String[] args) {
         demo04();
}
public static void demo04(){
        // 使用getInstance方法獲取calendar物件
        Calendar c = Calendar.getInstance();

        Date date = c.getTime();
        System.out.println(date);
        // Thu Mar 12 23:20:35 CST 2020

    }

SimpleDateFormat類

SimpleDateFormat是一個以與語言環境有關的方式來格式化和解析日期的具體類

  • 進行格式化(日期->文字)
  • 解析(文字->日期)
public static void main(String[] args) throws ParseException {
    //1.建立SimpleDateFormat物件y年M月
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
    //2.建立Date
    Date date=new Date();
    //格式化date
    String str=sdf.format(date);
    System.out.println(str);

    //解析
    Date date1=sdf.parse("2008年08月08日08:08:08");
    System.out.println(date1);
}

執行結果:

2020年09月15日21:49:28
Fri Aug 08 08:08:08 CST 2008

System類

主要用於獲取系統的屬性資料和其他操作,構造方法私有

  1. static void arraycopy(...) 複製陣列
  2. static long currentTimeMillis() 獲取當前系統時間,返回的是毫秒值
  3. static void gc() 建議JVM趕快啟動垃圾回收器回收垃圾
  4. static void exit(int status) 退出JVM,如果引數是0表示正常退出JVM,非0表示異常退出JVM