1. 程式人生 > 其它 >java基礎(3)

java基礎(3)

java.lang.Object類 類Object是類層次結構的根(最頂層)類。每一類都是用Object作為超(父)類。所有物件(包括陣列)都實現這個類的方法。 String toString() 返回這個類的方法,列印物件的資訊。重寫前列印的是包名類名@地址值;重寫後列印的是物件中的屬性值。 直接列印物件名字其實就是呼叫物件的toString()方法p=p.toString(); 看一個類是否重寫了toString方法,直接列印這個類對應物件的名字即可,如果沒有重寫toString方法,那麼列印的就是物件的地址值(預設) 如果重寫toString方法,那麼就按照重寫的方法列印。 boolean equals(Object obj)指示其他某個物件是否與此物件"相等"。重寫前比較物件的地址值;重寫後比較的是物件中的屬性值。 Object類equals方法的原始碼: public boolean equals(Object obj){ return (this == obj); } 引數:Object obj:可以傳遞任意的物件 方法體: ==:比較運算子,返回的就是一個布林值 true,false 基本型別比較值,引用型別比較物件的地址值 this是呼叫equals方法的那個物件,obj是傳過來的引數 Objects類的equals方法:對兩個物件進行比較,防止空指標異常。比較兩個物件是否相同,但是加了一些健壯性的判斷。
     public static boolean equals(Object a, Object b) {return (a == b) || (a != null && a.equals(b));}

java.util.Date:表示日期和時間的類
類Date表示特定的瞬間,精確到毫秒。 毫秒:千分之一秒 1000毫秒=1秒;
特定的瞬間:一個時間點,一剎那時間。 毫秒的作用:可以對時間和日期進行計算。
2099-01-03到2088-01-01中間一共多少天
可以日期轉換為毫秒進行計算,計算完畢,再把毫秒轉換成日期。
把日期轉換成毫秒:
當前的日期:2088-01-01
時間原點(0毫秒):1970年1月1日00:00:00(英國格林威治)
就是計算當前日期到時間原點之間一共經歷了多少毫秒(374267540068L)
注意:
中國屬於東八區,會把時間增加8個小時1970年1月1日08:00:00
把毫秒轉換成日期:
1天=24*60*60=68400秒=68400*1000=68400000毫秒
     System.out.println(System.currentTimeMillis());//獲取當前系統時間到1970年1月1日00:00:00經歷了多少毫秒

Date類的空引數構造方法: Date()獲取的就是當前系統的日期和時間
Date類的帶引數構造方法:Date(long date)傳遞毫秒值(long型別值),把毫秒值轉化為Date日期。(從1970起)
long getTime() 把日期轉換為毫秒(相當於System.CurrentTimeMillis())
返回自1970年1月1日00:00:00GMT以來此Date物件表示的毫秒數。
String toLocalString(); 根據本地格式轉化日期物件。
不僅僅是Java,幾乎所有的語言的時間都是從這一刻開始算起的。原因:java起源於UNIX系統,而UNIX認為1970年1月1日0點是時間紀元。

java.text.DateFormat:是時間/日期格式化子類的抽象類
作用: 格式化(也就是日期->文字)、解析(文字->時間)
構造方法: SimpleDateFormat(String s); 根據指定模板傳進日期格式化物件。
成員方法:
String format(Date date)按照指定的模式,把Date日期,格式化為符合模式的字串。
1.建立SimpleDateFormat物件,構造方法中傳遞的模式。
2.呼叫SimpleDateFormat物件中的format,按照構造方法中指定的模式,把Date日期格式化為符合模式的字串(文字)
Date parse(String source)把符合模式的字串,解析為Date日期
1.建立SimpleDateFormat物件,構造方法中傳遞的模式。
2.呼叫SimpleDateFormat物件中的parse,把符合構造方法中模式的字串,解析為日期。
DateFormat類是一個抽象類,無法直接建立物件使用,但可以使用Dateformat的子類
java.text.SimpleDateFormat extends DateFormat
構造方法:
SimpleDateFormat(String pattern) 用給定的模式和預設語言環境的日期格式符號構造SimpleDateFormat。
引數: String pattern:傳遞指定的模式
模式: 區分大小寫
y年 M月 d天 H時 m分 s秒
寫對應的模式,會把模式替換為對應的日期和時間"yyyy-MM-dd HH-mm-ss""yyyy年MM月dd日 HH時mm分ss秒"
注意:模式中的字母不能更改,連線模式的符號可以更改。
java.util.Calendar類:日曆類
Calendar類是一個抽象類,裡面提供了很多操作日曆欄位的方法(YEAR、MONTH、DAY_OF_MONTH、HOUR)
Calendar類無法直接建立物件使用,裡面有一個靜態方法叫getInstance(),該方法返回了Calendar類的子類物件
static Calendar getInstance() 使用預設時區和語言環境獲得一個日曆。
java.util.Calendar
類的成員方法:
public int get(int field):返回給定日曆欄位的值。
public void set(int field,int value):將給定的日曆欄位設定為給定的值。(set有一個過載方法可以同時設定年月日)
public abstract void add(int field,int amount):根據日曆的規則,為給定的日曆欄位新增或者減去指定的時間量。
int field:傳遞指定的日曆欄位
int amount:增加/減少的值(正、負)
public Date getTime():返回一個表示此Calendar時間值(從曆元到現在的毫秒偏移量)的Date物件;將日曆物件轉換為日期物件。
java.lang.System類提供了大量的靜態方法,可以獲取與系統相關的資訊或系統級操作,在System類的API文件中,常用的方法有:
  public static long currenTimeMIllis():返回以毫秒為單位的當前時間。(返回的時間值可以當時間戳或者檔名進行使用)
public static void arrayCopy(Object src,int srcPos,Object edst,int desPos,int length):將陣列中指定的
資料拷貝到另一個數組中。

java.lang.StringBuffer類
字串緩衝區,可以提高字串的操作效率(看成一個長度可以變化的字串)
底層也是一個數組,但是沒有被final修飾,可以改變長度: byte[] value=new byte[16];
StringBuilder在記憶體中始終是一個數組,佔用空間少,效率高。如果超出了StringBuilder的容量,會自動地擴容。
構造方法:
public StringBuilder():構造一個空的StringBuiler容器;
public StringBuilder(String str):構造一個StringBuiler容器,並將字串新增進去。
成員方法:
public StringBuilder append(...):新增任意型別的字串形式,並返回當前物件自身。使用append方法無需接收返回值
引數:可以是任意型別。可以鏈式程式設計
StringBuilder reverse();反轉內容,使用reverse方法無需接收返回值
String toString();將快取區內容轉換為字串。

StringBuiler和String可以相互轉換:
String-》StringBuilder :可以使用StringBuilder的構造方法StringBuilder(String str)構造一個字串生成器,
並初始化為指定的字串內容。
StringBuilder-》String:可以使用StringBuilder中的toString 方法
public String toString():當前StringBuilder物件轉換為String物件。

包裝類:基本資料型別的資料,使用起來非常地方便,但是沒有對應的方法來操作這些資料,所以我們可以使用一個類,把基本型別資料包裝起來,
這個類叫包裝類,在包裝類中可以定義一些方法,用來操作基本型別的資料。 裝箱:把基本型別的資料,包裝到包裝類中(基本型別的資料-》包裝類) 構造方法: Interger(int value) 構造一個新分配的Integer物件,它表示指定的int值 Integer(String s) 它表示String引數所指的int值; 傳遞的字串,必須是基本型別的字串否則會丟擲異常 靜態方法: static Integer valueOf(int i)返回一個表示指定的 int值的Integer例項 static String valueOf(String s) 返回儲存指定的String 的值的Integer物件。 拆箱:在包裝類中取出基本型別的資料(包裝類-》基本資料型別) 成員方法:int intValue() 以int型別返回該Integer的值。 自動裝箱與拆箱: 基本型別的資料和包裝類之間可以自動的相互轉換。JDK1.5之後出現的新特性。
自動裝箱:直接把int型別的整數賦值給包裝類: Integer in=1;就相當於 Integer in=new Integer(1); 自動拆箱:in是包裝類無法直接參與暈眩,可以自動轉換為基本型別的資料,再參與運算in+2;相當於in.inValue() +2=3; in=in+2;就相當於in=new Integer(3)自動裝箱 ArrayList集合無法直接儲存整數,可以儲存Integer包裝類 ArrayList<Integer> list=new ArrayList<>(); list.add(1);//自動裝箱相當於list.add(new Integer(1)); int a=list.get(0);//自動拆箱相當於 list.get(0).intValue(); 基本型別轉換為String: 方法一: 基本型別直接與""相連線即可;如:34+"" 方法二: 使用包裝類中的靜態方法 static String toString(int i)返回一個指定整數的String物件。 方法三:使用String類中的靜態方法: 使用包裝類中的靜態方法static String valueOf(int i)返回int引數的字串表示形式 String轉換成對應的基本型別:除了Character類之外,其他所有包裝類都具有parseXxx 靜態方法可以將字串引數轉換為對應的基本型別: Integer類: static int parseInt(String s)
集合和陣列的區別: 集合是java提供的一種容器,可以用來儲存多個數據。陣列的長度是固定的,集合的長度是可變的。 陣列中儲存的是同一種類型的元素,可以儲存基本資料型別值。集合儲存的都是物件。而物件的型別可以是不一致的。在開發中一般當物件多的時候,使用集合進行儲存。 集合框架的學習方式: 1.學習頂層介面/抽象類中共性的方法,所有子類都可以使用。 2.使用底層:頂層不是介面就是抽象類,無法建立物件使用底層的子類建立物件使用。 Collection介面 定義的是所有單列集合中共性的方法;所有的單列集合都可以使用共性的方法,沒有帶索引的方法。有兩個子介面List和Set List介面: 1.有序的集合(儲存和取出元素順序相同) 2.允許儲存重複的元素 3.有索引,可以使用普通的for迴圈遍歷 Vector集合 ArrayList集合 :底層是陣列實現的,查詢快增刪慢 LinkedList集合:底層是連結串列實現的,查詢慢,增刪快。 Set介面 1.不允許儲存重複元素 2.沒有索引(不能使用普通的for迴圈遍歷) 3.無序的集合(儲存和取出元素的順序有可能不一致) TreeSet集合:底層是二叉樹實現的,一般用於排序 HashSet集合:底層是雜湊表+(紅黑樹)實現的,無索引,不可以儲存重複元素,存取無序 | LinkedHashSet集合:底層是雜湊表+連結串列實現的,無索引,不可以儲存重複元素、可以保證儲存順序。 boolean add(E e): 向集合中新增元素 boolean remove(E e); 刪除集合中的某個元素; void clear(); 清空集合所有的元素 boolean contains(E e):判斷集合中是否包含某個元素。 boolean isEmpty(); 判斷集合是否為空 int size() : 獲取集合的長度 Object [] toArray(); 將集合轉換成一個數組 java.util.Iterator介面:迭代器(對集合進行遍歷) 兩個常用的方法: boolean hasNext() 如果仍有元素可以迭代,則返回true 判斷集合中還有沒有下一個元素,有就返回true,沒有就返回false; E next() 返回迭代的下一個元素。 取出集合中的下一個元素。(沒有元素,則會丟擲NoSuch ElementException沒有元素異常) 它做了兩件事:1.取處下一個元素2.會把指標向後移動一位。 Iterator迭代器是一個介面,無法直接使用,需要使用Iterator介面的實現類物件,獲取實現類的方法比較特殊。 Collection介面中有一個方法,叫iterator(),這個方法返回的就是迭代器的實現類物件。 Iterator<E> iterator() 返回在此 collection 的元素上進行迭代的迭代器。獲取迭代器的實現類物件,並且會把指標(索引)指向集合的-1索引 迭代器的使用步驟: 1.使用集合中方法iterator() 獲取迭代器的實現類物件,使用Iterator介面接收(多型)。 Collecyion<E> coll=new ArrayList<E>(); Iterator<E> it=coll.iterator(); 2.使用Iterator介面中的方法hasNext判斷還有沒有下一元素。 3.使用Iterator介面中的方法next出集合中的下一個元素。 增強for迴圈:底層使用的也是迭代器,使用for迴圈的格式,簡化了迭代器的書寫,是JDK1.5之後出現的新特性。 Collection<E> extends Iterable<E>:所有單列集合都可以使用增強for迴圈 public interface Iterable<T> 實現這個介面允許物件成為"foreach"語句的目標;增強for迴圈:用來遍歷集合和陣列 格式:for(集合/陣列的資料型別 變數名:集合名/陣列名){ System.out.print(變數名); } 泛型:是一種位置的資料型別,當我們不知到使用什麼資料了型別的時候,可以使用泛型; 泛型也可以看出是一種變數,用來接收資料型別: E e:Element 元素 T t:Type 元素 ArrayList集合在定義的時候,不知道集合都會儲存什麼型別的資料,所以型別使用泛型。(不寫<E>預設為Object型別) 建立集合物件,使用泛型: 好處:1.避免了型別轉換的麻煩,儲存的是什麼型別,取處的就是什麼型別; 2.把執行期異常(程式碼執行之後會丟擲的異常),提升到了編譯器(寫程式碼的時候會報錯) 弊端:泛型是什麼型別,只能儲存什麼型別的資料。 建立集合物件,不使用泛型: 好處:集合不使用泛型,預設的型別就是Object型別,可以儲存任意型別的資料。 弊端:不安全,會引發異常。
       比如向下轉型,呼叫子類方法出錯:String str=(String)obj;
System.out.println(str.length());
java.base/java.lang.Integer cannot be cast to java.base/java.lang.String 定義一個含有泛型的類:public class GenericClass<E>{ private E name;...} 定義含有泛型的方法:泛型定義在方法的修飾符和返回值型別之間。 格式: 修飾符 <泛型> 返回值型別 方法名(引數列表(使用泛型)){方法體}
 public <M> void method01(M m){System.out.println(m);}

含有泛型的介面定義格式: 修飾符 interface 介面名<代表泛型的變數>{ }
例如: public interface MyInterface<E>{ public abstract void add(E e);}
含有泛型的介面,第一種使用方式:定義介面的實現類,實現介面,指定介面的泛型。
Scanner類實現了Iterator介面,並指定介面的泛型為String,所以重寫的next方法泛型預設就是String
public final class Scanner implements Iterator<String>{ public String next(){...}}
含有泛型的介面,第二種使用方式:介面使用什麼泛型,實現類就使用什麼泛型,類跟著介面走,就相當於定義了含有泛型的類,建立
物件的時候確定泛型的型別。
public interface list<E>{
boolean add(E e);
E get(int index);
}
public class ArrayList<E> implements list<E>{ public boolean add(E e){} public E get(int index){} } 泛型萬用字元: 當使用泛型萬用字元或著介面時,傳遞的資料中,泛型型別不確定,可以通過萬用字元<?>表示,但是一旦使用泛型的萬用字元後,只能使用Object類中的共性方法,集合元素自身方法無法使用。 只能接受資料,不能往該集合中儲存資料;不能建立物件使用,只能作為方法的引數使用(泛型沒有繼承的概念) 定義一個方法,能遍歷所有型別的ArrayList集合,這時候我們不知道ArrayLilst集合使用什麼資料型別,可以泛型的萬用字元?來接收資料型別 泛型的上限限定: ?extends E 代表使用的泛型只能時E型別的子類/本身 泛型的下限限定: ?super E 代表使用的泛型只能是E型別的父類/本身
資料結構: 棧:先進後出,入口和出口在同一側; 佇列:先進先出; 陣列:查詢快:陣列的地址是連續的,我們可以通過陣列的首地址找到陣列,通過陣列的索引可以快速查詢到某一個元素。 增刪慢:陣列的長度是固定的,我們要增加/刪除一個元素必須建立一個新陣列,把原陣列的資料複製過來,原陣列會在記憶體中被銷燬 在堆記憶體中,頻繁的建立陣列,複製陣列中的元素,銷燬陣列,效率低下。