java SE 亂記(一)

作者的個人分享網:分享時刻【www.itison.cn】

正數:
源碼:即對應的二進制
源碼,反碼,補碼一樣
負數:
反碼 = 最高位之後全取反,最高位不變
補碼 = 反碼 + 1

float: 後面要加f
long: 後面要加 L 或 l




switch 根據jdk版本
1.6及以上版本支持string變量

switch常量值不能一樣
switch能解決的問題,都可以用多重if都可以解決
但是反過來不可以
等值判斷首選switch
switch只能執行等值判斷問題


無特殊情況case 最後要break;

默認值default放在最後比較好

異常:if(input.hasNextInt()){}


循環結構:
while(條件表達式) 先判斷 後執行

do while 無條件執行一次,然後再判斷條件

變量在哪個大括號裏面聲明
作用域就在哪個大括號裏面

string變量.equals(“y”)

System.exit(0);  //正常退出程序

int random = (int)(Math.random()*1000); 
//隨機生成1000以內的整數

import java.util.Scanner;
Scanner input = new Scanner(System.in);
int x = input.nextInt();
//創建輸入

數組一般和for循環一起使用
循環次數確定用for循環
for(; ; ;)可省表達式,分號不可省
過程:表達式1,表達式2正確則執行循環體,表達式3

break //跳出當前整個循環結構
與條件語句一起使用

continue; //跳過本次循環
與break區分開來


array //數組開闢連續的空間存數據
數組也有數據類型
數組元素的數據類型相同
int[] a; //聲明數組,聲明後長度固定
a = new int[5];  //給數組分配空間
a[0] = 8;  //賦值
b = a; // 兩個數組公用一個內存(淺拷貝)
// a 改變後 b 也是改變了,兩個數組同時改變
a[0] = a[0]*10;  //使用數組元素
數組作爲參數傳遞,作爲引用
可以作爲引用參數改變值


也可以: 
int[] a = new int[5]; //一次性分配空間
一個int類型4個字節
int[] a = {a,b,c,d}; //一次性賦值


//想要倒序就反過來輸出
求最大值:(打擂臺思想)
if(max<a[i]){
       max = a[i];
}


二維數組:
int[][] arr = new int[3][5];
int[][] arr = { {1, 2},{3, 4, 5},{5, 6} }
//支持創建列不相等的二維數組
//不是以最長列爲基準讓每行都等列
arr[i][j]  (i 行 j 列)
arr.length:  行數(高度)
arr[i].length: 第 i 行的列數(寬度)





Exception 異常類  //在JDK API 1.6.0中文版中查看常見異常
在畢業之前記住100多個異常



比較字符串大小:s1.compareTo(s2);
//爲正數則s1>s2
String.valueOf(num).length(); 
//返回一個數字有多少位數


雙重for循環解決方程組(雞兔同籠)
解決二維數組輸入類型(多個班級學員)
解決雙重累加、累乘


for(int aa : 數組名) {
       //int aa就是數組的別名
        System.out.println(aa);
}
//第四種循環:foreach循環
//變態for循環,只能用來遍歷輸出
//不能做其他操作



//逆序獲取x的各位數
while(x!=0){
i = x%10;//得到x的個位數
x = x / 10;//得到x除了個位數之外的數
}


//判斷它是幾位數
int count = 0;
while(n != 0)
{
    n = n/10;
    count++;
}



//生成四位隨機數?
int max = 9999;

int min = 1000;

cardNumber = (int)(Math.random()*(max-min)) +min;




//2+22+222+2222..........
巧妙算法:
int a = 2;
int sum = 0;
int num = 0;
for(int i = 1; i <= n; i++)
{
    num = num * 10 + a;
    sum = sum + num;
}



//1,1,2,3,5,8.......
(也可以用數組做)
用第三變量存中間值:
int a = 1,b = 1,c = 0;
		
for(int i = 0, i < n; i++)
{ 
    c = a;
    a = b;
    b = b + c;
}



一個基本數據類型的變量作爲參數傳遞的時候,
在方法裏面對形參做修改不會影響實參的
數組做形參,則會改變,涉及到引用地址



int temp = a[0];
a[0] = b[0];
b[0] = temp;
//a, b 作爲參數互換兩個數組的內容
//對象也是類似數組,引用數據類型


方法重載:
1.方法名相同
2.參數的個數或類型要不同
3.返回類型不理

正確遞歸:
1.設計正確的遞歸算法
2.設計一個遞歸出口
public static int getSum( int n ){
   if (n == 0){
       return  1;
   }
   return n + getSum(n - 1);
}



(API 含左不含右)
數組常用方法:
//拷貝數組從a1考到a2
System.arraycopy( a1, 0, a2, 0, 3 );

//二分查找, 必須有序的數據,返回下標
Arrays.binarySearch(a, n);

//快速打印數組內容
System.out.print(Arrays.toString(arr));

//導入數組包
import java.util.Arrays; 

//數組排序,默認升序
Arrays.sort(數組名);

//拷貝數組a, 返回4個元素存到b
int[] b = Arrays.copyOf( a, 4 );

//比較兩個數組是否相等
Arrays.equals(a, b);

//給d初始化
Arrays.fill( d, 100);



//存大寫字母
for( int i = 0, i < 26, i++ ){
   str[i] = (char)('A' + i) + "";
}

//輸入字符串
String str = s.nextLine();	

//全部變成大寫字母
toUpperCase()  

//獲取字符串下標爲index的值
str.charAt(index)   

//變成字符數組
toCharArray()



//格式化和解析日期的具體類
SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");

//Date 類與獲取年月的函數
//創建日期對象
Date date = new Date();
//獲取年
int year = date.getYear() + 1900;
//獲取月
int month = date.getMonth() + 1;
//獲取星期,如果沒有明確到天,默認返回每月的1號的星期
int day = date.getDay();




java常用算法:
排序都是雙重循環
查找都是一重循環
考慮時間複雜度 和 空間複雜度

//順序查找
int strainghtSearch(int[] num, int n){
  for(int i = 0; i < num.length, i++){
      if(num[i] == n)
          return i;
      else 
         return  -1;
}

//折半查找(也叫二分查找,要求集合有序)
//開始的時候min = 0; max = arr.length
while (min <= max) {
   int mid = (min + max) / 2;
   if (num[mid] == n) {			       
       return mid;
   }else if (num[mid] > n) {
       max = mid - 1;
   }else{
       min = mid + 1;
   }
}
return -1;



//冒泡排序
for (int i = 1; i < num.length; i++) {//共進行n-1趟
   for (int j = 0; j < num.length -i; j++) {
      if (num[j] > num[j + 1]) {			
         int temp = num[j];//比前一個小, 則與之交換	
         num[j] = num[j + 1];			
         num[j + 1] = temp;
      }
   }
}

//直接插入排序
for (int i = 1; i < num.length; i++) {//共進行n-1趟插入
   int m = i;
   while(m>=1 && num[m] < num[m-1]){//短路表達式
      int temp = num[m-1];//比前一個小, 則與之交換
      num[m-1] = num[m];
      num[m] = temp;
      m--;
   }
}






面向對象特性:抽象,封裝,繼承,多態
對象特徵:屬性(成員變量),行爲(方法)
類也是一種數據類型,組合的數據類型
對象是引用數據類型, 數組也是
類是對象的抽象
對象是類的實例化

抽象:
定義類的過程

封裝:
1. 將屬性和行爲封裝到一個類,對象
2. 不同的訪問權限(public/private)
3. 功能的實現細節要封裝

繼承:
不勞而獲,繼承父類(extends)
(父類也叫超類,子類也叫派生類)
1. 直接獲得父類已有的東西
2. 改造父類已有的東西
3. 增加自己新的東西
4. java不支持多繼承(多個父親),c++支持
5. java通過接口彌補不能多繼承的缺憾

多態:
同一種行爲,得到不同的形態


構造方法:
new 對象的時候構造方法執行
系統默認有無參的構造方法
自己定義後默認構造方法不存在了
自己可以重載一個無參構造方法


垃圾對象:
當一個對象失去了所有引用變量引用它的時候(沒人在用它了)


對象的比較:
==就是比較兩個變量的值是否相等(不包括地址)
equals 是比較兩個變量的內容是否相同
obj1 == obj2;//兩個地址相等
obj1.equals(obj2) //比較
//java中所有的類都是Object的子類
//Object 類中有equals方法


//重寫比較方法
@Override
public boolean equals( Object obj ){
  Person p = (Person)obj;
  if(this.name.equals(p.name) && this.age == p.age){
     return true;
   }else{
     return false;
   }
}


//打印對象
System.out.println(obj.toString());

//重寫打印對象方法
@Override
public String toString(){
  return "[" + name + " " + age + "]";
}



this 關鍵字:
代表一個對象 (也代表類)
指當前調用的對象
可以訪問本類中的屬性和方法
this(); //調用本類的構造方法
this()調用本類構造方法這條語句必須寫在構造方法的首行
this()不能調用自己所在的構造方法
this()調用構造方法不能形成閉環



理解main()方法:
public    //共有的
static     //靜態的
void      //不需要返回值
String[]  //系統傳遞參數使用的
運行的時候加上系統參數,可以作爲args[]打印出來



內存:棧區、堆區、靜態區、代碼段區

靜態變量:
   生命週期長,隨着類而生
   類名可以直接調用
   對象共享的變量
   用於存對象的值相等的屬性
   
靜態方法:
生命週期長,隨着類而生
   類名可以直接調用
   靜態方法不可以調用非靜態變量(非靜態的變量只有在創建對象纔會產生,相當於調用了不存在的東西)
   也不可以調用非靜態方法
   用於不訪問對象特有值得方法
   比如說輸出數組,排序數組

總之:
靜態有侷限性,有共同性


靜態方法塊:
  在類名下面寫(類加載就執行,只一次)
  父類優先與子類
(但子類的靜態代碼塊優先於父類構造代碼塊)
  主類優先於其它類

構造代碼塊:
  寫在類體裏面
  優先於構造方法



單例模式:
  1. (只能產生一個程序窗口的軟件)
  2. 構造方法私有
  3. 定義一個靜態的本類對象成員
  4. 設計一個公共的靜態接口方法
      用於返回本類對象
  private static Obj obj = null;
  public static Obj getObj(){
    if(obj == null)
       obj = new Obj();
     return  obj;
  }

單例類:
  避免創建多個對象
  省去了new操作符
  類似交易引擎,必須用單例類
  單例模式保證不重複命令
  不重複交易



對象數組:
  和常用的數組差不多
  但是要注意對象實例化




(API 含左不含右)
基本數據類型的包裝類:
java思想:(一切皆對象)

基本數據類型    包裝類
char  --->        Character
int  ---->        Integer
byte  ----->      Byte
short ------>     Short
long ----->       Long
float --->        Float
double ---->      Double
boolean --->      Boolean

int i = 0;
Integer x = new Integer(i);  //老版本裝箱過程
int j = x.intValue();  //老版本拆箱過程

//是整形字符串可得整數,若不是整形則報錯
int result = Integer.parseInt(“1234”);
//result == 1234
//類似的;Double.parseDouble(str);




(API 含左不含右)
String 類的常見方法:
charAt(index)  //返回字符串的index下標的值
toCharArray() //變成字符數組
indexOf("s")  //返回str的位置
trim(); //消除字符串兩邊的空格
str.split("&")  //按照一定格式分割字符串
str.replace('a','p') //替換
String.valueOf(x); //將x變成字符串
String a = x + "";  //也可以將x變成字符串




java註釋:
文檔註釋、單行註釋、多行註釋





繼承:(extends關鍵字)
1. 子類可以直接獲得父類已有的東西
2. 子類可以改造或增加父類的方法
3. 子類可以
4. super():父類的構造方法
   super:當前類的父類對象(臨時對象)
5. 構造方法裏面的父類對象只是在創子類的時候暫時存在
6. 私有的成員不能被繼承,也不能重寫
7. 子類有無參構造方法,父類必須也有
8. super可以訪問父類的屬性和方法
final 修飾的方法不可重寫
final 修飾的類不可繼承
9. 向上轉型,子類轉父類沒問題,能運行所有的方法
10. 向下轉型,父類轉子類,編譯的時候要進行強轉,運行的時候有時對,有時錯
11.如果這個父類引用的是父類實力的話,運行的時候一定出錯,無關是否調用的方法是父類和子類中都有的
12.構造方法不能重寫,不能繼承




修飾符:
  protected:不同包非子類不可訪問,其他可以
  protected: 不能修飾外部類
  public:都可用
  final 修飾的方法不可重寫
  final 修飾的類不可繼承





多態:(重寫、重載、抽象方法、接口實現)
(對象多態性和方法多態性)

方法重載:
1.方法名相同
2.參數的個數或類型要不同
3.必須在同一個類
4.註釋:Overload


方法重寫:
1.方法名相同
2.參數個數與類型都相同
3.返回值類型子類必須小於父類(類類型才比較)
4.子類的方法權限必須大於或等於父類
5.註釋:Override
6.final 修飾的方法不可重寫
7.final 修飾的類不可繼承
8.構造方法不能重寫,不能繼承

//重寫打印對象方法
@Override
public String toString(){
  return "[" + name + " " + age + "]";
}


抽象類:(abstract關鍵字)
(接口定義一種標準,抽象類定義一種模板)
1.用來作爲一個超類繼承
2.abstract修飾的類
3.可以包含抽象方法
4.抽象類不具有實例化的能力
5.如果抽象類的子類沒有實現父類中的所有抽象方法,那麼這個子類依然是一個抽象類
if(animal instanceof Dog){
  ((Dog)animal).swingTail();
}//判斷是否是這個類

(對象 instanceof 類或接口)





void
//從-128---------127 true
Integer i = -129;
Integer j = -129;
System.out.println(i==j);

但是 new出來的==比較都是false






final關鍵字:
final修飾的類不可繼承
final修飾的變量只能賦值一次(只能讀)
final修飾的方法不可重寫

fun(final int[] arg){
  arg[0] = 5;
} //程序沒錯,args沒被賦值

public static final int I = 100;
//全局變量,建議大寫






接口:(interface關鍵字)
(接口定義一種標準,抽象類定義一種模板)
1.接口裏面只能包含全局常量和抽象方法
2.裏面的變量都默認爲全局變量
  默認有 public static final 修飾
3.裏面的方法都默認爲抽象方法
  默認有public abstract 修飾
4.接口可以多繼承,彌補繼承的缺陷
  (C++類可多繼承,Java不可以)
5.implement 實現



只有調用子類重寫父類的方法時,才體現對象多態性

一個接口可以繼承多個接口.
interface C extends A, B { }是可以的.
一個類可以實現多個接口:
class D implements A,B,C{ }
但是一個類只能繼承一個類,不能繼承多個類
class B extends A{ }
在繼承類的同時,也可以繼承接口:
class E extends D implements A,B,C{ }



類的內部類:

1.可以被任何類修飾符修飾
2.通過外部類點內部類訪問
//創建一個內部類對象
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
3.屬性有就近原則
4.Outer.this.name //內部類的成員變量
5.不能用super關鍵字,沒用
6.匿名接口實現類(匿名內部類)直接new 對象直接調用,不用事先new對象


方法內部類:(沒有什麼意義的)






枚舉:(用於類似四季,星期幾)

enum Color{
  yellow,
  blue,
  gray,
  red
}

Color color = Color.red;
Color[] colors = Color.values();
for(Color:value, colors)
{ System.out.print(value);}







java系統常見類:

如果一個類沒有構造方法:
1.它裏面所有方法都是靜態方法
2.如果它裏面有靜態方法,那麼它一定有一個靜態的返回此類對象的接口方法runTime()


System 類:

exit(0); //退出系統
System.arraycopy(b,2,a,3,3);//拷貝數組
getProperties() //返回當前系統屬性
console(...) //獲取當前控制檯對象
readPassword(...) //禁止回顯,不顯示輸入的東西

//在cmd裏面纔能有結果
Console con = System.console();
System.out.println("請輸入密碼:");
char[] ch = con.readPassword();
String str = new String(ch);
System.out.println(str);




Runtime 類:
(程序運行時)



Math 類:
abs();
cos(); //cos值
cbrt(a);//返回立方根,必須正數,否則返回NaN
round(2.5);//返回最接近的long值,返回3
rint(2.5);//返回最接近的int,返回2
ceil(2.4);//向上取整,返回3
floor(2.4);//向下取整,返回2

Random random = new Random();
//帶固定參數的話每次生成的隨機數不變
random.nextInt(33)+1;//隨機產生1~~33
random.nextDouble();
random.nextFloat();




BigInteger 類:
(大數據操作類)
BigInteger bi1 = new BigInteger("987979879878");
BigInteger bi2 = bil.add(new BigInteger(100000));



String 類:

Date 類:





內存:棧區、堆區、靜態區、代碼段區
java垃圾回收機制:只負責堆內存,不負責棧區
finalize() //系統自動調用(當對象成爲永死狀態)
System.gc();//通知系統馬上回收垃圾(不通知也會回收)

demo = new Demo();
demo = null;//去活狀態
demo = this;//復活(在重寫finalize()裏面鞋且只有一次復活一次)

傳參JVM:右鍵Run As --->run configuration..








當程序中出現異常,而我們沒有處理的時候它交給JVM處理,JVM的處理方式就是結束程序

異常處理機制:

算數異常(ArithmeticException)
數組越界(ArraysIndexOutOfBoundsException)
空指針異常(NullPointException)
輸入不匹配(InputMismatchException)
指定的類不存在(ClassNotFoundException)
轉換爲數字異常(NumberFormatException)
方法的參數錯誤(IllegalArgumentException)
沒有訪問權限(IllegalAccessException)
數據類型轉換異常(ClassCastException)
文件未找到(FileNotFoundException)
數組存儲異常(ArrayStoreException)
方法不存在(NoSuchMethodException)
文件結束異常(EOFEception)
實例化異常(InstantiationException)
內存不足(OutOfMemoryException)
不支持克隆(CloneNotSupportedException)
被中斷異常(InterruptedException)
未找到類定義(NoClassDefFoundException)



//循環輸入int但出現非int的問題
if(input.hasNextInt()){  
  x = input.nextInt();
}else{
  input.next();
}
或:
try{
  x = input.nextInt();
//寫可能會出現異常的代碼

}catch(Exception e){
  input.next();
//寫異常處理的代碼
}catch(){
//寫異常處理的代碼
}finally{
//寫不管如何一定會輸出的代碼
//比如數據庫連接的close();方法
}


例:
try{
  result = i / j;
  for(int k = 0; k > 3; k++){
    sum = sum1[k] + sum;
}catch(Exception e){
  System.out.print("除數爲0!");
  System.out.print("數組越界");
}//可以兩個catch,但是一旦捕獲到異常不會繼續下面的代碼

寫多個catch的時候一定要從小到大

try{
  if(i < 0 || j < 0) { 
    //主動拋出異常
    throw new ArithemticException();
  }else{
    result = i * j;
  }
}catch(ArithemticException e){
  System.out.print("輸入的數有負數");
  e.printStackTrace();//打印異常的跟蹤棧信息
}


自定義異常類:
class MyException extends Exception{
//默認沒有構造方法,構造方法不能重寫,不能繼承
  public MyException(String name){
    super(name);
  }

}




斷言語法:
assert boolean 條件
用來調試,現在沒什麼實用性





註解:(Annotation)
不是簡單的對代碼的說明
很多框架裏面廣泛使用
JDK1.5以後引進,與類,接口,枚舉一個層次的
功能:
編寫文檔,(生成doc檔)
代碼分析,(使用反射)
編譯檢查,()


系統的三個內定註解:
1.@Override:判斷某個方法是否是一個正確的重寫的方法,
只能在方法前用(如果不是,則方法報錯)
2.@Deprecated:標記某個結構是否是已過時的,
不建議使用,可以使用在類,字段,方法前
3.@SuppressWarnings("all") 壓制系統警告的信息(使用需要帶參數)
可以使用在類,字段,方法前

系統的四個元註解:(用來定義註解)
1.@Target:定義註解的使用範圍
2.@Retention:制定生命週期
3.@Inherited:制定註解是否被繼承
4.@Documented:指定註解是否會被生成到doc文檔


自定義註解:
@Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
//變量要記得帶括號,參數可以默認值
//自定義類型,接口類型,包裝基本數據類型不支持作爲參數
//註解類型可以用
public @interface MyAnnotation{
  int value() default 3;
  int name() default 4;
}

用法:@MyAnnotation(value = 3,name = 5);
//當變量名爲value,value可省






JDBC (Java DataBase Connectivity)
java數據庫連接,用於執行SQL語句的一組API
數據庫有很多種:
Oracle,MySql,SQL Server,DB2,Sybase

1.加載驅動
2.獲取數據庫的連接對象
3.通過獲得數據庫連接對象獲取一個Statement對象
4.通過Statement對象執行我們想要執行的SQL語句

後知後覺:
1.表設了外鍵本表可以直接刪除
2.被引用表不可刪除
3.必須去除引用財會,先刪引用它的表
4.可以修改數據,除了外鍵之外的
5.一般先獲取表所有信息存到集合
6.查詢、顯示可以在集合做
7.數據有更新再訪問數據庫修改


數據庫連接池:
往池子預先初始化幾個連接對象,
要用的時候從池子裏拿出一個對象來用,
用完歸還。

c3p0步驟:
1.導jar包(c3p0-xxx.jar)
2.複製配置文件(c3p0-config.xml)到src下
3.如果直接的用的化就是new一個ComboPooledDataSource
對象然後通過這個DataSource獲得Connection 連接對象
4.也可以先封裝一個工具類

dbcp步驟:
1.導jar包(commons-dbcp-xx.jar和commons-pool-xx.jar)
2.複製配置文件(xx.properties)到src下
3.如果直接的用的化就是new一個ComboPooledDataSource
對象然後通過這個DataSource獲得Connection 連接對象
4.也可以先封裝一個工具類


dbutils步驟:
1.導jar包(c3p0-xxx.jar)
2.new QueryRunner(C3PoUtils.getDataSource());






Object類型可以兼容所有類型int double ...
但是Object類型存在類型轉換的安全隱患



(萬能數據類型)
泛型類的定義:(泛型可以帶多個)
class Poit<T,K> {
  private T xPos;
  private K yPos;

  pubic Point(T xPos, K yPos){
      this.xPos = xPos;
      this.yPos = yPos;
  }
  
  public void setxPos(T xPos){
      this.xPos = xPos;
  }

   public T getxPos(){
      return this.xPos;
  }

}

//實例化
Point<nteger> p = new Point<Integer>(12,23);

泛型類對象之間是不能直接自動轉換的
//不同類型不能直接賦值
實例化泛型的類型只能是類類型


類實現泛型接口:
clas IC2<T,K> implements I2<T>{
//如果接口名沒有帶<T>,系統默認Object
//繼承也是同理,系統默認Object
//類可以擴展泛型,但必須帶上接口的
//記住:重寫參數類型和數量必須一致

}


泛型方法的定義:
//在類裏面定義(類不一定爲泛型類)
//泛型方法跟泛型類之間不相互影響
public <T> T add(T x, T y){
  return x + y;
}

public <T> fun(){

}

publc static <T> 


class P<T>{
  //T i = 2;  不可
  //T[] = new T[5]; 不可

  //初始化方法
  public void set(T a, T[] b){
    i = a;
    T[] = b;
  } 
}



new 泛型數組的時候不要用<>
MyGener<Integer>[] mgs = new MyGener[5];
mgs[0] = new MyGenr<Integer>();


泛型類充當泛型的實例化類(嵌套)
Test<Info<String,Integer>> t = new Test<Info<String,Integer>>();
Info<String,Integer> info = new Info<String,Integer>();
info.setValue("hehe");
info.setV(34);
t.setValue(info);



通配符,能讀不能寫

受限泛型:
設置上限:
class MyGener<T extends Number>{

}

public static void show(Test<? super Number>test)


設置下限:(只能在聲明對象的時候用)







數據結構:

線性:
順序表:
棧:先進後出
隊列:先進先出

鏈式存儲:
單鏈表,多鏈表

class Node{
  int iData; //數據域
  Node pNext; //指針域
}

main(){
  Node node123pHead = new Node();
  node1.pNext = node2;
  node2.pNext = node3;
  pHead = node1;
}


非線性:
樹
圖	




集合:
list.size() //元素個數,不是集合大小
remove(index) //刪除,通過下標或者通過元素
輸出集合:
1.直接用System.out.println(list);
2.通過for循環 或者 for_each循環
3.通過迭代器遍歷
Iterator<Integer> it = list.iterator
while(it.hasNext()){
  
}

elementt() //獲取但不移除列表的頭元素
peek() //獲取但不移除列表的頭元素
poll() //獲取並移除第一個元素
romove()//默認移除第一個元素
peekLast()
pop() //出棧 獲取並移除第一個元素
push() //入棧
offer() //往後添加
getFirst() //
getLast()
clone()




list:
ArrayList和LinkList
有序插入
treeSet:(sortedSet的唯一實現類)
會自動排序,也無插入順序
set:
無插入順序,取決於哈希地址
且內容不重複,且去重
如果需要判斷對象是否相等,需要
重寫equals()方法和hashCode()方法
public boolean equals(Obj o){
  Person p = (Person)obj;
  
  if(){ return ture}
  else(){ return false}
}

public int hashCode(){
  return name.hashCode() + age;
}

可自動生成重寫的方法
如果重寫了compareTo()方法,可以不用重寫
hashCode(),equals()方法也可以實現去重






JVM:
JAVA 反射機制:

1.獲取反射入口,也就是獲取Person類的Class實例

ClassLoader loader = ClassLoader.getSystemClassLoader();
//第一種方法加載類實例
Class c = loader.loadClass("com.itjob.Person");
//第二種方法加載類實例
Class.forName("com.itjob.Person");
//第三種方法加載類實例
Person p = new Person();
Class c = p.getClass();
//第三種方法加載類實(比較有效,不用知道包名)
Class c = Person.class;

2.通過相應的反射API完成相應的反射操作

//實際中一般不用這種
Person p = (Person)c.newInstance();


getConstructor();//獲取指定的構造方法
getConstructors();//獲取到所有的構造方法

getMethod();
getMethods();

Class c = Person.class;

Class cs = c.getSuperclass();

Class[] inters = c.getInterfaces();

Constructor[] cons = c.getDeclaredConstrutors();

Constructor con = c.getDeclaredConstrutor(String.class,int.class)

Person p = (Person)con.newInstance();

Class[] types = m.getParameterTypes();


getXXX():獲取當前類和父類繼承下來的XXX結構,不包含非public

getDeclaredXXX():包含非public


Method m = c.getDeclaredMethod("fun");
m.invoke(p); //通過反射調用


m.setAccessible(true);





sql語句拼接變量存在危險:
aaa' or '1'='1



//配置文件
src ---> new ----> file

file name : db.properties

driverclassname = com.mysql.jdbc.Driver
url = jdbc:mysql:///student?useUnicode=true&characterEncoding=utf-8
usernme=root
password=123456


static{

1.通過ResourceBundle類來加載資源源文件中的配置數據
ResourceBundle bundle = ResourceBundle.getBundle("db");
driverClassName = bundle.getString(driverClassName);
...

2.通過Properties類來加載資源源文件中的配置數據
Properties p = new Properties();
InputStream inStream = JDBCUtil.class.getClassLoader().getSystemResourceAsStream("db.properties");
p.load(inStream);

driverClassName = p.getProperty("driverClassName");

}








線程、進程:
進程:程序一次動態執行的過程
線程:進程已線程爲單位,爲了數據共享
n(至少一個)個線程組成一個進程
進程中必須有主線程


輪換快,與同時進行一樣


實現多線程的兩種方式:

1.通過Tread類實現
自定義一個類繼承Tread類
重寫run()方法,也就是線程方法
我們需要這個線程做的事都應該放到此方法中來自做
在需要創建一個線程的地方new一個自定義線程對象,
//運行時不能調用run(),否則沒差別

2.通過Runnable接口實現
自定義一個類實現Runnable接口
重新run()方法,一樣的
運行時:
MyThread1 mtr1 = new MyThread1();
new Thread(mtr1).start();


只有在run()方法裏面跑的纔是子線程

wait(); //等待
notify(); //通知

多線程解決阻塞







IO 流:

字節流、字符流、管道流
字節流:InputStream    OuputStream
        FileInputStream    FileOuputStream    
字符流:

File f1 = new File ("C;\\aaa\\1.txt");
得到類型對象
f1.createNewFile();
創建對象


絕對路徑:
從系統的根目錄出發的路徑
相對路徑:
不是從系統根目錄出發的路徑


字符流---->字符流的轉換:
InputStreamReader
OutputStreamWriter




字符編碼:
ASCII
GBK, GB2312
BIG5:繁體中文
unicode
utf-8
ISO-8859-1:單字節

支持中文的字符集:GBK, GB2312, utf-8

亂碼原因:
兩端使用的字符編碼不一致

編碼:字符--->byte[]   String.getByte()--->byte[]
解碼:byte[]---->字符  new String(byte[], charset)







對象序列化:(串行化)
將對象轉換爲二進制流






java網絡編程:

TCP:
1.三次握手
2.面向連接
3.安全可靠
4.傳輸速度慢

UDP:


InetAddress 類的使用:
ServerSocket 類的使用:



服務器:

創建服務器套接字
綁定IP和端口
等待客戶端的連接請求(如果有客戶端連接上來就會產生一個與客戶端的連接套接字)
收發數據
關閉與客戶端的連接套接字
關閉服務器


客戶端:

創建一個客戶端的套接字
發送一個請求(如果服務開啓則)
基於這個連接進行收發數據
關閉這個連接






按位取反:
快捷算法:相反數-1
~4567 = -4567 - 1 = -4568
~(-2345)= 2345 - 1 = 2344





// Springframework的jar包
https://repo.spring.io/release/org/springframework/spring/
發佈了43 篇原創文章 · 獲贊 86 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章