Java

Java基础知识回顾:

1:数据的基础类型

  Byte,short,char,int,long,float,double.boolean;其中Byteshortchar是无法相互转换的,占字节少的可以自动转化为占字节多的,占字节多的变为占字节少的要强制类型转换。

   int param1=12;

   float param2=19.0f;

   param2=param1;

   System.out.println(param2);

   int param3=4;

   param3=(int)param2;

   System.out.println(param3);

输出结果分别是12.012;说明我的结论是正确的。

其中byte,charboolean分别占一个字节,short占两个字节,intfloat占四个字节,doublelong占据八个字节,一个字等于两个字节,一个字节等于8,所以byte-128127,其他的以此类推。

2:变量和常量

局部变量:在某一方法里面的变量(可以改变数值的一个属性)
全局变量:在整个类中可以通用的变量

Public classTest{
     static int con=88;

     publicstatic void main(String args){

  publicstatic void printshuju() {

int con = 22;

con++;

System.out.println(con);

}

}

最终输出的是23,说明在方法里运行的是局部变量,就近原则。

常量:用final修饰的

final double conn=33.0;

        conn++;

报错说明常量是不可变的,不能进行算术运算。

3:运算符:

运算符包括:算术运算符,逻辑运算符,比较运算符,三目运算符,位运算符。

算术运算符:加减乘除

int canshu=2;

        //canshu=canshu++;

         canshu=++canshu;

         System.out.println(canshu);

先后输出2,3i++是先赋值在相加,++i是先相加再去赋值。

逻辑运算符:与或非

int c=9,b=99;

if(c>0&&b>0){

System.out.println("双方成立才输出");

}

if((c>0)||(b<9)){

System.out.println("其中一个条件成立就输出");

}

if(c!=0&&b!=9){

System.out.println("双方全部不成立才输出");

}

依次输出

            双方成立才输出

            其中一个条件成立就输出

            双方全部不成立才输出

比较运算符:大于小于等于

3.

booleanb=(3>8);

System.out.println(b);

输出为false

三目运算符:

    intc=99,b=88,d=77;

    intf=(c>b?c:b>d?b:d);

    System.out.println(f);

输出为99

位运算符:<<,>>

double i=9;

System.out.println(9<<2);

System.out.println(9>>2);

这个运算的作用相当于:9*49/4

4:条件语句,循环语句,breakcontiue

doublescore=88.0;

   if(score>90){

   System.out.println("学习成绩好");

   }

   elseif(score>80){

   System.out.println("学习成绩还是不错的");

   }

   elseif(score>70){

   System.out.println("学习成绩还算可以");

   }

输出:学习成绩还是不错的

if(score>80){

   System.out.println("学习成绩还是不错的");

   }

    if(score>70){

   System.out.println("学习成绩还算可以");

   }

输出:

学习成绩还是不错的

学习成绩还算可以

 

说明:if else满足条件以后就结束判断,if没有结束判断,而是继续去执行判断,这两者差别很大;

循环语句:forforeach ,do while ,while do

int sum=0;

for(int i=0;i<100;i++){

sum+=i;

}

System.out.println(sum);

int j=0;

while(j<100)

{

sum+=j;

j++;

}

  System.out.println(sum);

  inta[]=new int[]{2,4,5,6};

for(int x :a){

System.out.println(x);

}

输出:495099002456

int sum=0;

int c=0;

do{

sum+=c;

c++;

}while(c<100);

System.out.print(sum);

}

输出4950

 

Breakcontinue

 for(inti=0;i<100;i++){

 if(i==2){

continue;

 }

 System.out.println(i);

 if(i==4){

 break;

 }

 System.out.println(i);

 

 }

输出结果:0011334

Continue是结束本次循环,break是结束该程序(到此为止)

4字符串的api中常见方法

4.1  strstr1是一样的

         Stringstr="abc";

chardata[]={'a','b','c'};

String str1=newString(data);

if(str.equals(str1)){

System.out.println("equals");

}

else{

System.out.println("notequals");

}

4.2 concat(连接),replace(替换),contains(是否保存)三个常用方法

          Stringresult="to".concat("get").concat("her") ;

 System.out.println(result);

 String r="mesquite in your cellar".replace('e','o');

         System.out.println(r);

         Stringf="the war of baronets".replace('r','y');

         System.out.println(f);

         boolean flag="abc".contains("agb");

         System.out.println(flag);

4.3 split()tolowerCase(),replaceAll();

    Stringresult[]=ss.split(",");

for(inti=0;i<result.length;i++){

System.out.println(result[i]);

}

Stringf=ff.toLowerCase();

System.out.println(f);

Stringh=ff.replaceAll("A","B");

    System.out.println(h);

4.4 trim(),toString(),toCharArray(),format();等一系列方法

        Stringtr=ssh.trim();

    System.out.println(tr);

    cc=ssh.toCharArray();

    System.out.println(String.valueOf(cc));

    for(intj=0;j<cc.length;j++){

    System.out.println(cc[j]);

 

    }

 

 

 

5StringBuffer常用方法:

 5.1 append可以添加char,String,数组,charAt(index)返回字符,insert插入函数,toString,倒序输出。

     StringBuffersBuffer=new StringBuffer();

     sBuffer.append("shixinfa");

     sBuffer.append('z');

     sBuffer.append(c);

     char a=sBuffer.charAt(3);

     System.out.println(sBuffer);

     System.out.println(a);

     sBuffer.insert(3,'v');//在某个位置插入一个数

     System.out.println(sBuffer);

     sBuffer.delete(3,4);

     System.out.println(sBuffer);

     System.out.println(sBuffer.toString());

     System.out.println(sBuffer.reverse());

 5.2StringBuffer是线程安全的,StringBuilder是线程不安全的。如果程序不是多线程的使用StringBuilder的效率比StringBuffer要高。

6,线程

6.1 线程实现 实现runnable接口,继承Thread类,

public classKown {

public staticvoid main(String[] args) {

    Tickett = new Ticket();

        Threadwin1 = new Thread(t);

        Threadwin2 = new Thread(t);

        Threadwin3 = new Thread(t);

        Threadwin4 = new Thread(t);

        win1.start();

        win2.start();

        win3.start();

        win4.start();

}

}

/*Ticket win1 =new Ticket();

Ticket win2 =new Ticket();

Ticket win3 =new Ticket();

Ticket win4 =new Ticket();

win1.start();

win3.start();

win4.start();*/

 classTicket implements Runnable/extends Thread

  {

      privateint num = 50;

      publicvoid run()

      {

         while(num>0)

          System.out.println(Thread.currentThread().getName()+"...sale..."+num--);}

}

总结:为什么创建线程的第二种方式可以解决卖票问题?

第一种创建线程的方式:线程和线程任务是绑定在一起的,创建了4个线程就创建了4份资源。

第二种创建线程的方式:线程和线程任务进行了分离,只需要创建一个任务,让4个线程分别去执行。

6.2 线程的生命周期

   新建:Thread t=new Thread();

   就绪:t.start();

   运行:running();

   死亡:dead();

   堵塞:由于某些原因,正在运行的线程腾出cpu,暂停执行,

Sleep():正在睡眠,过了就进入就绪状态。

Wait();等待

Suspend();阻塞

6.3 线程和进程的区别

1一个程序至少一个进程,一个进程至少一个线程。

2线程的划分尺度小于进程,使得多线程程序的变并发性高。

3进程在执行过程中有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4线程是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源

5一个线程可以创建和撤销另一个线程,同一进程中多个线程可以并发执行。

7,数组的一系列方法:

7.1创建和使用

             Stringstr[]={"abc","def","utf"};

    Strings[]=new String[]{"abc","def","gbk"};

    for(int i=0;i<str.length;i++){

        System.out.println(str[i]);

        System.out.println(s[i]);

数组的复制

public static void main(String[] args) {

int source[] = { 1, 2, 3 };

/*

 * intcopy[] = new int[5]; for (int i = 0; i < source.length; i++) {

 * copy[i]= source[i]; System.out.println(copy[i]); }

 */

for (int i = 0; i< CopyArray.copy(source).length; i++) {

System.out.println(CopyArray.copy(source)[i]);

}

 

}

 

public static int[] copy(int data[]) {

int newcopy[] = new int[9];

newcopy =data.clone();

return newcopy;

 

}

7.2二维数组

         inta[][]=new int[][]{{1,2,3},{4,5,6},{7,8,9}};

    for(inti=0;i<a.length;i++){

    for(int j=0;j<a[i].length;j++){

    System.out.println(a[i][j]);

    }

7.3常见数组Api

7.3.1 查询是否包含,是否为空,输出全部数据。

        Stringstringarray[] = { "a", "b", "c", "d","e" };

boolean b =Arrays.asList(stringarray).contains("a");

System.out.println(b);

boolean flag =Arrays.asList(stringarray).isEmpty();

System.out.println(flag);

List<Person>list = new ArrayList<Person>();

        list.add(newPerson("zhangyan",33));

        list.add(newPerson("shixinfa",44));

        for(inti=0;i<list.size();i++){

              System.out.println(list.indexOf(i));

        }

        System.out.println(list.toArray());

}

}

class Person {

private Stringname = "shixinfa";

private int age= 22;

publicPerson(String name, int age) {

this.name =name;

this.age = age;

}

public StringgetName() {

return name;

}

public voidsetName(String name) {

this.name =name;

}

public intgetAge() {

return age;

}

public voidsetAge(int age) {

this.age = age;

}

 

}

7.3.2数组翻转,删除指定元素,

//方法一

/*Stringstr[]=new String[]{"a","b","c","dd"};

for(inti=0;i<str.length;i++){

String s=str[i];

str[i]=str[str.length-i-1];

str[str.length-i-1]=s;

}

for(intj=0;j<str.length;j++){

System.out.println(str[j]);

}*/

//方法二

// 当一个一个添加到arrylist中的时候,可以反转,因为每添加一次就开辟一个内存,一串一串添加时不会出现反转,因为同是存在同一个内存中

ArrayListarrayList = new ArrayList();

        /*arrayList.add("A");

        arrayList.add("B");

        arrayList.add("C");

        arrayList.add("D");

        arrayList.add("E");*/

        arrayList.add("A,B,C,D,E,F");

        arrayList.add("K,B");

        System.out.println("反转前排序: " + arrayList);

        Collections.reverse(arrayList);

        System.out.println("反转后排序: " + arrayList);

        //方法三

        String[]Array = { "a", "b", "c", "d", "e"};  

        reverseArray2(Array);//使用集合ArrayList实现反转  

        for(int j = 0; j < Array.length; j++) {  

            System.out.print(Array[j]+ " ");  

        } 

  

        System.out.print("\n");

        String[]temp = reverseArray3(Array);// 直接使用数组实现反转  

        for(int j = 0; j < temp.length; j++) {  

            System.out.print(Array[j]+ " ");  

        } 

}

        privatestatic void reverseArray2(String[] Array){

        ArrayList<String> list=new ArrayList<String>();

        for(int i=0;i<Array.length;i++){

        list.add(Array[Array.length-1-i]);

        

        }

        Array=list.toArray(Array);

        }

        //方法四

        privatestatic String[] reverseArray3(String[] Array){

        String news[]=new String[Array.length];

        for(int i=0;i<Array.length;i++){

        news[i]=Array[Array.length-i-1];

        

        }

        return news;

        }

        

}

         int[]arr = new int[] { 1, 2, 4, 5, 9, 8, 0 };

ArrayList list =new ArrayList<Integer>();

for (int i = 0;i < arr.length; i++) {

list.add(arr[i]);

}

list.remove(1);

for (int j = 0;j < list.size(); j++) {

System.out.println(list.get(j));

1:线性表:

1.1什么是线性表:表头没有前驱,表尾没后继,其他的只有一个前驱一个后继。

1.2线性表的基本操作:initList(),Length(),,ListInsert(),ListDelete(),PrintList(),Empty(),

DestroyList();

1.3顺序表:线性表的顺序存储称为顺序表,它是一组地址联系的地址单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的数据元素在物理地址上也相邻。

2.顺序表的一系列操作

 2.1插入操作

 2.2 删除操作

 2.3查询操作

public interfaceIList {

public voidclear();

public booleanisEmpty();

public intlength();

public Objectget(int i) throws Exception;

public voidinsert(int i, Object x) throws Exception;

// 删除操作

public voidremove(int i) throws Exception;

// 查找操作

public intIndexof(Object x);

// 显示

public voiddisplay();

}

public classSqlite implements IList{

public Object[]listElem;//线性表存储空间

    privateint curlen; //线性表当前长度

    //顺序表构造函数,构造一个长度为maxSize的线性表

    publicSqlite(int maxSize){

        curlen= 0;

        listElem= new Object[maxSize];

    }

    //置空操作

    publicvoid clear() {

        curlen= 0;

    }

    //判断当前长度是否为0,0即为空表

    publicboolean isEmpty() {

        returncurlen == 0;

    }

    //取表长度,返回curlen当前长度即可

    publicint length() {

        returncurlen;

    }

    //取表元素

    publicObject get(int i) throws Exception {

        //判断 i是否合法

        if(i> 0 || i > curlen -1)

            thrownew Exception(""+i+"个元素不存在");

        returnlistElem[i];

    }

    //插入操作

    publicvoid insert(int i, Object x) throws Exception {

        if(curlen== listElem.length)

            thrownew Exception("顺序表已经满了");

        if(i< 0 || i > curlen)

            thrownew Exception("插入位置不合法");

        //从尾部往前扫

        for(intj = curlen; j > i; j--)

            listElem[j]= listElem[j - 1];

        listElem[i]= x;

        //插入成功后,表长度+1

        curlen++;

    }

    //删除操作

    publicvoid remove(int i) throws Exception {

        if(i< 0 || i > curlen - 1)

            thrownew Exception("删除位置不合法");

        //下标移动要出删除的i

        for(intj = i; j < curlen - 1; j++)

            listElem[j]= listElem[j++];

        curlen--;

    }

    //查找操作,找到则返回下标,否则返回-1

    publicint Indexof(Object x) {

        intj = 0;

        //遍历查找

        while(j< curlen && !listElem[j].equals(x))

            j++;

        if(j< curlen)

            returnj;

        else

            return-1;

    }

    //显示操作

    publicvoid display() {

        //遍历线性表

        for(inti = 0; i < curlen; i++)

            System.out.println(listElem[i]);

    }

    //主函数

    publicstatic void main(String[] args) throws Exception{

        //初始化线性表

        Sqlitemlist = new Sqlite(10);

        mlist.insert(0,"a");

        mlist.insert(1,"b");

        /*mlist.insert(2,"c");

        mlist.insert(3,"d");

        mlist.insert(4,"e");*/

        //mlist.insert(0,"g");

        mlist.remove(0);

        //mlist.insert(5,'f');      报错了,类型出错

        intfindFlag = mlist.Indexof("e");

        if(findFlag!= -1)

            System.out.println("顺序表中第一次出现'e'的位置是:"+ findFlag);

        else

            System.out.println("顺序表不存在元素'e'");

        mlist.display();

    }

8,类和对象

8.1类就是一系列具有相似属性,方法的一类事物,对象是具体的存在的事物。

8.2例子初步了解接口,继承,抽象类,判断对象是否一致,封装,构造函数

测试类:

public class Lei{

public staticvoid main(String[] args) {

// 继承

AnimalAnimaltiger = new Animal("老虎");

Animal Animaldog= new Animal("老虎");

Dog dog=newDog();

Animaldogcopy=new Dog();

        Animaltiger.say();

        dog.say();

        dog.eatgutuo();

        dog.eatlu();

        dogcopy.say();

        booleanfalg=Animaltiger.equals(Animaldog);

        System.out.println(falg);

        System.out.println(dog.equals(dogcopy));

        System.out.println(dog==dogcopy);

        Pegp=new Peg();

        System.out.println(p.getAge());

        System.out.println(p.getXingming());

}

}

 

class Animal {

Stringname=null;

public Animal(){

}

publicAnimal(String name){

this.name=name;

}

   publicvoid say(){

   System.out.println("动物叫声");

   }

}

 

class Tigerextends Animal {

    @Override

    publicvoid say() {

    super.say();

    }

}

class Dogextends Animal implements Action {

    @Override

    publicvoid say() {

    super.say();

    System.out.println("狗叫");

    }

    publicvoid eatgutuo(){

    System.out.println("狗吃骨头");

    }

    publicvoid eatlu(){

    System.out.println("狗吃小鹿");

    }

}

封装类:

public class Peg{

   privateString xingming="史新发";

   privateint age1=20;

  publicString getXingming() {

return xingming;

}

  publicvoid setXingming(String xingming) {

this.xingming =xingming;

}

   publicint getAge() {

return age1;

}

  publicvoid setAge(int age) {

if(age>100){

return;

}

this.age1 = age;

}

接口:

public interface Action {

  public static Stringzhonglei="猫科";

  //protected static  double high=30.0;错误,只能是public修饰

  public void eatgutuo();

  public void eatlu();

  

}

}

抽象类:

public abstract class Dongwu {

     public  abstract void jump();

     

}

8.3详细了解抽象类和接口的区别

 8.3.1 接口的方法全部实现,抽象类的也要实现

 8.3.2 抽象类中的方法没必要是public的,接口的方法全部是public

 8.3.3 抽象类中可以存在非全局的静态变量,但是接口中全是全聚德静态变量

 

 

 

9 i/O流的基础知识

9.1分为输入流inputStream,输出流OutputStream,分为字符流,字节流。

 public class IO {

   public static void main(String[]args)throws Exception{

   //创建文件

   Filef=new File("c://test.txt");

   if(!f.exists()){

   f.createNewFile();

   }

   //向文件中输入数据

   InputStreaminput=new FileInputStream(f);

   try{

   java.util.Scanners=new java.util.Scanner(System.in);

   Stringstr=s.nextLine();

   while(input.read()!=-1){

   str+=str;

   }

   System.out.println(str);

   }

   catch (Exception e) {

e.printStackTrace();

}

   //支指出C盘下的全部子目录

   

   Stringfilename="C:"+File.separator;

   Filef2=new File(filename);

   String[]list=f2.list();

   for(int i=0;i<list.length;i++){

   System.out.println(list[i]);

   }

   //查询指定目录的全部数据

   Filef3=new File(filename);

   print(f3); public static void print(File f){

   if(f!=null){

   if(f.isDirectory()){

   File ff[]=f.listFiles();

   if(ff!=null){

   for(int i=0;i<ff.length;i++){

   print(ff[i]);

   }

   }

   }

   else{

   System.out.println(f);

   }

   }

   }

文件的复制,向文件中写入字符窜,读取文件字符窜

public class IO{

public staticFile f;

    publicstatic void main(String[] args) throws Exception{

   // 文件的复制

  Filefsource=new File("c:\\shixinfa.txt");

  Filefcopy=new File("c:\\zhangyan.txt");

  if(!fsource.exists()||!fcopy.exists()){

  fsource.createNewFile();

  fcopy.createNewFile();

  }

  //利用outStream输入字符窜到文件中(写),利用inputStream()读取数据

  InputStreaminput=new FileInputStream(fsource);

  OutputStreamoutput=new FileOutputStream(fcopy);

  Stringstr="abcdefg";

  byte[]b=str.getBytes();

  output.write(b);

  input.read(b);

  System.out.println(newString(b));

  if(input!=null&&output!=null){

  inttemp=0;

  while((temp=input.read())!=-1){

  output.write(temp);

  }

  }

  output.close();

  input.close();

   }

 

9.2字节流和字符流的常用方法和优劣比较

   字节流读取的时候,读取到一个字节就返回一个字节,字符流使用字节流读到一个或多个字节时,先去查找指定的编码表,将查到的字符返回。

 字节流可以处理任何类型的数据,如图片,MP3,字符流只能处理字符数据。

 字节流输入流是用inputStream结尾的,字节流的输出流是用outputStream结尾的。

 字符流输入流使用reader结尾的,输出流使用writer结尾的。

使用字节流还是字符流好:
答案是字节流,因为硬盘上全部的文件是用字节的形式进行传输和保存的,包括图片等数据,但字符只是在内存在才形成的。只有处理纯文本数据时,才考虑使用字符流。其他的全部考虑字节流。

 

 

 

9.3 Android字节流读取网络的数据

Activity的代码实现

private WebView webView;

private Handler handler=new Handler();

@Override

protected void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

webView=(WebView)findViewById(R.id.web);

new HttpThread("http://www.baidu.com",webViewhandler).start();

}

开启一个新的线程来访问网页

   public class HttpThread extends Thread{

private String url;//网络请求的地址

private WebView webview;//显示数据的界面

private Handler handler;//传递消息的对象

public HttpThread(String url,WebView webView,Handler handler)

{

this.url=url;

this.webview=webView;

this.handler=handler;

}

@Override

public void run() {

try {

URL httpUrl=new URL(url);//创建一个httpur对象

try {

HttpURLConnectionconnection=(HttpURLConnection)    httpUrl.openConnection();//创建一个连接对象

connection.setReadTimeout(5000);

connection.setRequestMethod("GET");

final StringBuffer stringBuffer=new StringBuffer();//创建缓存对象

BufferedReader

reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));//得到返回的输出对昂,把字符流转变为字节流

String str;

while((str=reader.readLine())!=null){

stringBuffer.append(str); //读出流的全部数据

}

handler.post(new Runnable() {

@Override

public void run() {

webview.loadData(stringBuffer.toString(),  "text/html;charset=utf-8",null);

}

});

catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

catch (MalformedURLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

super.run();

}

}

 

9.4 http协议的原理和特点

9.4.1超文本传输协议定义了浏览器向万维网请求万维网文档,服务器把文档传送给浏览器,他是应用层协议

9.4.2四个步骤

   客户端和服务器建立连接,只要单击某个超级链接,Http的工作开始

   建立连接后,客户机发送一个请求给服务器,请求方式一般为统一资源定位符,协议版本号。

   服务器接收到请求后,给予相应的响应,其格式为一个状态行,包括信息的协议版本号,一个成功或错误的代码,服务器信息,实体信息。

   客户端接收到服务器返回的信息,通过浏览器显示在用户的显示屏幕上,然后客户端和服务器断开连接。

9.4.3 URL

第一部分是 协议

第二部分是 存有该资源的主机地址

第三部分是 主机资源的具体地址

9.4.4Tcp/IP

      客户端发送syn到服务器端

      服务器发送ack告诉接收到了

      客户端发送ack到服务器结束

9.4.5

支持客户,服务器模式

简单快捷,客户端发送请求方式和路径

灵活:可以传输任意类型的数据

无连接:每次连接只处理一个请求,服务器收到客户端请求,并应答,断开连接

无状态:没有记忆能力

9.5 Socket编程具体实现

服务器端

public staticvoid main(String[] args){

try{

 ServerSocketserver=new ServerSocket(3678);

 Socketclient=server.accept();

 BufferedReaderin=new BufferedReader(new     InputStreamReader(client.getInputStream()));

 PrintWriterout=new PrintWriter(client.getOutputStream());

 while(true){

 Stringstr=in.readLine();

 System.out.println(str);

 out.println("hasreceiver");

 out.flush();

 if(str.equals("end")){

 break;

 }

 client.close();

 }

}catch(Exception e) {

e.printStackTrace();

}

}

客户端

public class TalkClient{

 static Socket server;

public static void main(String[] args)throws Exception{

server=new Socket("127.0.0.1",3678);

BufferedReaderin=new BufferedReader(new InputStreamReader(server.getInputStream()));

PrintWriter out=new PrintWriter(server.getOutputStream());

BufferedReaderwt=new BufferedReader(new InputStreamReader(System.in));

while(true){

Stringstr=wt.readLine();

out.println(str);

out.flush();

if(str.equals("end")){

 

break;

 

}

System.out.println(in.readLine());

 

}

server.close();

}

 

 

 

 

10 JDBC基础知识J

10.1 访问数据库的方法一

Class.forName("com.MySQL.jdbc.Driver");

//提供jdbc连接的Url

String url ="jdbc:mysql://localhost:3306/dinner" ;   

 Stringusername = "root" ;   

     Stringpassword = "933032" ;

     //连接mysql数据库

   Connectioncon =DriverManager.getConnection(url , username ,  password ) ;  

   Statementstmt = con.createStatement()

 

 

10.2 访问数据库方法二

 

 

 

 

 

 

10.3 访问数据库方法三

 

 

 

 

11.AraryListVector的区别,HashMapHashtable的区别,Listmapset三个接口各自的特点。

11.1集合:保存多个其他对象的对象,不能保存简单数据

Collection 包括ListSet接口,List包括LinkedListArrayListVector

Map包括HashTable,Hashmap;

Map提供kayvalue的映射;

List存放重复的有序集合

ArrayList实质上是一个会自动增长的数组,查询简单,删除,添加复杂。

LinkList 底层是双向循环链表实现的,添加,删除简单,查询复杂。

Set:无序的,不允许有重复元素的集合

SortedSet接口是Set的子接口,TreeSetSortedSet的实现类。

Key不可以重复,value可以重复。

HashMap非线程安全,HashTable线程安全。

11.2

AraryList线程安全的,Vector线程不安全的。

Vector增长空间为原来的一倍,ArrayList增长为原来的0.5倍。

HashMap允许key为空,线程不安全

Hashtable不允许key为空,线程安全

 

12 反射的基础知识

 

 

 

 

 

 

13.23种设计模式基础知识

13.1 单例模式

//构造方法是私有的

//静态方法返回该类的实例

    //在内部创生实例化对象,并将其封装成private static 类型

/*private SingletonTest(){

}

private staticfinal SingletonTest instance=new SingletonTest();

public staticSingletonTest getInstance(){

return instance;

}*/

// 定义私有构造方法(防止通过new SingletonTest()去实例化)

    private SingletonTest() {   

    }  

 

    // 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)

    private static SingletonTestinstance;   

 

    // 定义一个静态的方法(调用时再初始化SingletonTest,但是多线程访问时,可能造成重复初始化问题)

    public static SingletonTest getInstance() {   

        if (instance ==null)   

            instance = new SingletonTest();   

        return instance;   

 

13.2 工厂模式:简单工厂模式,抽象工厂模式,工厂方法模式。

 2)简单工厂模式:后来出现工业革命。用户不用去创建宝马车。因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建。比如想要320i系列车。工厂就创建这个系列的车。即工厂可以创建产品。
    3
)工厂方法模式时代:为了满足客户,宝马车系列越来越多,如320i523i,30li等系列一个工厂无法创建所有的宝马系列。于是由单独分出来多个具体的工厂。每个具体工厂创建一种系列。即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象。你需要指定某个具体的工厂才能生产车出来。

4)抽象工厂模式时代:随着客户的要求越来越高,宝马车必须配置空调。于是这个工厂开始生产宝马车和需要的空调。

   最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车.

   这就是工厂模式

ublic classTaocione  extends Changpin {

publicTaocione(){

System.out.println("制造陶瓷one");

}

}

public classTaocitwo  extends Changpin{

publicTaocitwo(){

System.out.println("制造陶瓷two");

}

public classFactoryTest {

public Changpincreatetaoci(int type){

switch(type){

case 2:

return newTaocitwo();

case 1:

return new Taocione();

default:

break;

}

return null;

}

//没有工厂的前提下

/*public staticvoid main(String[] args) {

Taoci tc1 = newTaoci();

Taoci2 tc2 = newTaoci2();

}

}

class Taoci {

public Taoci() {

System.out.println("自己制作陶瓷1");

}

}

class Taoci2 {

public Taoci2(){

System.out.println("自己制作陶瓷2");

 

}*/

}

public classCustomer {

/**

 * @paramargs

 */

public staticvoid main(String[] args) {

// TODOAuto-generated method stub

     FactoryTestfactoryTest=new FactoryTest();

     Changpinone=factoryTest.createtaoci(1);

     Changpintwo=factoryTest.createtaoci(2);

}

public classChangpin {

     publicChangpin(){

     }

 

 

 

 

 

 

 

 

 

13.3 观察者模式

 

 

 

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

14.xml基础知识

 XML 指可扩展标记语言(eXtensible Markup Language

XML 文档实例

<?xmlversion="1.0"encoding="UTF-8"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></noteXML 简介


XML 被设计用来传输和存储数据。

HTML 被设计用来显示数据。


应该掌握的基础知识

在您继续学习之前,需要对以下知识有基本的了解:

·       HTML

·       JavaScript

如果您希望首先学习这些项目,请在我们的 首页 访问这些教程。


什么是 XML

·       XML 指可扩展标记语言(EXtensible MarkupLanguage)。

·       XML 是一种很像HTML的标记语言。

·       XML 的设计宗旨是传输数据,而不是显示数据。

·       XML 标签没有被预定义。您需要自行定义标签。

·       XML 被设计为具有自我描述性。

·       XML W3C 的推荐标准。


XML HTML 之间的差异

XML 不是 HTML 的替代。

XML HTML 为不同的目的而设计:

·       XML 被设计用来传输和存储数据,其焦点是数据的内容。

·       HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息,而 XML 旨在传输信息。


XML 不会做任何事情

也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。

下面实例是 Jani 写给 Tove 的便签,存储为 XML

<note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>

上面的这条便签具有自我描述性。它包含了发送者和接受者的信息,同时拥有标题以及消息主体。

但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。


通过 XML 您可以发明自己的标签

上面实例中的标签没有在任何 XML 标准中定义过(比如 <to> <from>)。这些标签是由 XML 文档的创作者发明的。

这是因为 XML 语言没有预定义的标签。

HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如 <p><h1> 等等)。

XML 允许创作者定义自己的标签和自己的文档结构。


XML 不是对 HTML 的替代

XML 是对 HTML 的补充。

XML 不会替代 HTML,理解这一点很重要。在大多数 Web 应用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据。

XML 最好的描述是:

XML 是独立于软件和硬件的信息传输工具。


XML W3C 的推荐标准

XML 1998 2 10 日成为 W3C 的推荐标准。

如需了解有关 W3C XML 活动的更多信息,请访问我们的 W3C教程


XML 无所不在

目前,XML Web 中起到的作用不会亚于一直作为 Web 基石的 HTML

XML 是各种应用程序之间进行数据传输的最常用的工具。

XML 树结构


XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"


一个 XML 文档实例

XML 文档使用简单的具有自我描述性的语法:

<?xmlversion="1.0"encoding="UTF-8"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>

第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码(UTF-8 : 万国码, 可显示各种语言)。

下一行描述文档的根元素(像在说:"本文档是一个便签"):

<note>

接下来 4 行描述根的 4 子元素to, from, heading 以及 body):

<to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body>

最后一行定义根元素的结尾:

</note>

您可以假设,从这个实例中,XML 文档包含了一张 Jani 写给 Tove 的便签。

XML 具有出色的自我描述性,您同意吗?


XML 文档形成一种树结构

XML 文档必须包含根元素。该元素是所有其他元素的父元素。

XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。

所有的元素都可以有子元素:

<root><child><subchild>.....</subchild></child></root>

父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。

所有的元素都可以有文本内容和属性(类似 HTML中)。


实例:

上图表示下面的 XML 中的一本书:

XML 文档实例

<bookstore><bookcategory="COOKING"><titlelang="en">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><bookcategory="CHILDREN"><titlelang="en">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book><bookcategory="WEB"><titlelang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book></bookstore>

实例中的根元素是 <bookstore>。文档中的所有 <book> 元素都被包含在 <bookstore> 中。

<book> 元素有 4 个子元素:<title><author><year><price>

XML 语法规则


XML 的语法规则很简单,且很有逻辑。这些规则很容易学习,也很容易使用。


XML 文档必须有根元素

XML 必须包含根元素,它是所有其他元素的父元素,比如以下实例中 root 就是根元素:

<root><child><subchild>.....</subchild></child></root>

以下实例中 note 是根元素:

<?xmlversion="1.0"encoding="UTF-8"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>


XML 声明

XML 声明文件的可选部分,如果存在需要放在文档的第一行,如下所示:

<?xml version="1.0" encoding="utf-8"?>

以上实例包含 XML 版本(<p=""><>

UTF-8 也是 HTML5, CSS, JavaScript, PHP, SQL 的默认编码。


所有的 XML 元素都必须有一个关闭标签

HTML 中,某些元素不必有一个关闭标签:

<p>This is a paragraph.
<br>

XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签:

<p>This is a paragraph.</p>
<br />

注释:从上面的实例中,您也许已经注意到 XML 声明没有关闭标签。这不是错误。声明不是 XML 文档本身的一部分,它没有关闭标签。


XML 标签对大小写敏感

XML 标签对大小写敏感。标签 <Letter> 与标签 <letter> 是不同的。

必须使用相同的大小写来编写打开标签和关闭标签:

<Message>这是错误的</message>
<message>这是正确的</message>

注释:打开标签和关闭标签通常被称为开始标签和结束标签。不论您喜欢哪种术语,它们的概念都是相同的。


XML 必须正确嵌套

HTML 中,常会看到没有正确嵌套的元素:

<b><i>This text is bold and italic</b></i>

XML 中,所有元素都必须彼此正确地嵌套:

<b><i>This text is bold and italic</i></b>

在上面的实例中,正确嵌套的意思是:由于<i> 元素是在 <b> 元素内打开的,那么它必须在 <b> 元素内关闭。



XML 属性值必须加引号

HTML 类似,XML 元素也可拥有属性(名称/值的对)。

XML 中,XML 的属性值必须加引号。

请研究下面的两个 XML 文档。第一个是错误的,第二个是正确的:

<note date=12/11/2007>
<to>Tove</to>
<from>Jani</from>
</note>
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>

在第一个文档中的错误是,note 元素中的 date 属性没有加引号。


实体引用

XML 中,一些字符拥有特殊的意义。

如果您把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。

这样会产生 XML 错误:

<message>if salary < 1000 then</message>

为了避免这个错误,请用实体引用来代替"<" 字符:

<message>if salary &lt; 1000 then</message>

XML 中,有 5 个预定义的实体引用:

&lt;

less than

&gt;

greater than

&amp;

&

ampersand

&apos;

'

apostrophe

&quot;

"

quotation mark

注释: XML 中,只有字符 "<" "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。


XML 中的注释

XML 中编写注释的语法与 HTML 的语法很相似。

<!-- This is a comment -->

XML 中,空格会被保留

HTML 会把多个连续的空格字符裁减(合并)为一个:

HTML:

Hello Tove

Output:

Hello Tove

XML 中,文档中的空格不会被删减。


XML LF 存储换行

Windows 应用程序中,换行通常以一对字符来存储:回车符(CR)和换行符(LF)。

Unix Mac OSX 中,使用 LF 来存储新行。

在旧的 Mac 系统中,使用 CR 来存储新行。

XML LF 存储换行

XML 验证


拥有正确语法的 XML 被称为"形式良好" XML

通过 DTD 验证的XML"合法" XML


形式良好的 XML 文档

"形式良好" XML 文档拥有正确的语法。

在前面的章节描述的语法规则:

·       XML 文档必须有一个根元素

·       XML元素都必须有一个关闭标签

·       XML 标签对大小写敏感

·       XML 元素必须被正确的嵌套

·       XML 属性值必须加引号

<?xmlversion="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

 


验证 XML 文档

合法的 XML 文档是"形式良好" XML 文档,这也符合文档类型定义(DTD)的规则:

<?xmlversion="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM"Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

在上面的实例中,DOCTYPE 声明是对外部 DTD 文件的引用。下面的段落展示了这个文件的内容。


XML DTD

DTD 的目的是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:

<!DOCTYPEnote
[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>

如果您想要学习 DTD,请在我们的首页查找 DTD 教程。


XML Schema

W3C 支持一种基于 XML DTD 代替者,它名为 XML Schema

<xs:elementname="note">

<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>

</xs:element>

如果您想要学习 XML Schema,请在我们的首页查找 Schema 教程。


一个通用的 XML 验证器

为了帮助您检查 XML 文件的语法,我们创建了 XML 验证器,以便您对任何 XML 文件进行语法检查。

请看下一章

 

 

 

 

 

 

 

 

 

 

 

 

16java常见的排序算法

分为以下几类

1.冒泡排序

public voidmaop(int a[]) {

for (int i = 0;i < a.length - 1; i++) {

for (int j = 0;j < a.length - 1 - i; j++) {

if (a[j] >a[j + 1]) {

int temp = a[j];

a[j] = a[j + 1];

a[j + 1] = temp;

}

}

}

for (int k = 0;k < a.length; k++) {

System.out.println(a[k]);

}

}

 

 

2.选择排序

    public void selectSort(int [] a) { 

        int n = a.length;  

        for(int k=0; k<n-1; k++) {  

            int min = k;  

            for(int i=k+1; i<n; i++) {  

                if(a[i] < a[min]) {  

                    min= i;  

                } 

            } 

            if(k != min) {  

                int temp = a[k];  

                a[k]= a[min];  

                a[min]= temp;  

            } 

        } 

    } 

3.快速排序

   

        int[]a = {12,20,5,16,15,1,30,45,23,9};

        intstart = 0;

        intend = a.length-1;

        sort(a,start,end);

        for(inti = 0; i<a.length; i++){

             System.out.println(a[i]);

         }

        

     }

     

     publicstatic  void sort(int[] a,int low,int high){

         intstart = low;

         intend = high;

         intkey = a[low];

         

         

         while(end>start){

             //从后往前比较

             while(end>start&&a[end]>=key) //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较

                 end--;

             if(a[end]<=key){

                 inttemp = a[end];

                 a[end]= a[start];

                 a[start]= temp;

             }

             //从前往后比较

             while(end>start&&a[start]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置

                start++;

             if(a[start]>=key){

                 inttemp = a[start];

                 a[start]= a[end];

                 a[end]= temp;

             }

         //此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用

         }

         //递归

         if(start>low)sort(a,low,start-1);//左边序列。第一个索引位置到关键值索引-1

         if(end<high)sort(a,end+1,high);//右边序列。从关键值索

 

 

 

4二分法查找

    public class DichotomySearch {

     public static void main(String[] args) {

       int[]arr = new int[] { 12, 23, 34, 45, 56, 67, 77, 89, 90 };

      System.out.println(search(arr, 12));

      System.out.println(search(arr, 45));

      System.out.println(search(arr, 67));

      System.out.println(search(arr, 89));

      System.out.println(search(arr, 99));

   }

   public static int search(int[]arr, int key) {

       intstart = 0;

       intend = arr.length - 1;

       while(start <= end) {

          int middle = (start + end) / 2;

          if (key < arr[middle]) {

              end = middle - 1;

          } else if (key > arr[middle]) {

              start = middle + 1;

          } else {

              return middle;

          }

      }

       return -1;

   }

}

5直接插入排序

 public class InsertionSort {

    public static void insertionSort(int[] a) {

        int tmp;

        for (int i = 1; i <a.length; i++) {

            for (int j = i; j > 0;j--) {

                if (a[j] < a[j - 1]) {

                    tmp= a[j - 1];

                    a[j- 1] = a[j];

                    a[j]= tmp;

                }

            }

        }

    }

    public static void main(String[] args) {

        int[]a = { 49, 38, 65, 97, 76, 13, 27, 50 };

        insertionSort(a);

        for (int i : a)

            System.out.print(i+ " ");

    }

}

希尔排序

 public void shellSort(int[] list) {
    int gap = list.length / 2;
    while (1 <= gap) {
        // 把距离为 gap 的元素编为一个组,扫描所有组
        for (int i = gap; i < list.length; i++) {
            int j = 0;
            int temp = list[i];
 
            // 对距离为 gap 的元素组进行排序
            for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap) {
                list[j + gap] = list[j];
            }
            list[j + gap] = temp;
        }
      System.out.format("gap = %d:\t", gap);
        printAll(list);
        gap = gap / 2; // 减小增量
 }
}

17:Java异常基础知识

 

public static void main(String[] args)throws Exception{

/*int a =divide(3, 0);

System.out.println(a);*/

/*try{

int a=4/0;

}catch(Exception e) {

System.out.print("执行到这里");

}finally{

System.out.print("不管是否捕捉到异常,此代码执行");

}*/

int a=5/0;

/*算术异常类:ArithmeticExecption

空指针异常类:NullPointerException

类型强制转换异常:ClassCastException

数组负下标异常:NegativeArrayException

数组下标越界异常:ArrayIndexOutOfBoundsException

违背安全原则异常:SecturityException

文件已结束异常:EOFException

文件未找到异常:FileNotFoundException

字符串转换为数字异常:NumberFormatException

操作数据库异常:SQLException

输入输出异常:IOException

方法未找到异常:NoSuchMethodException*/

}

//报错,语法本身有错

/*public staticint divide(int a, int b) {

try{

return a % b;

}catch(Exceptione){

e.printStackTrace();

}

}*/

//报错

/*public staticint divide(int a, int b) throws Exception {

return a % b;

}*/

//

}

18:内部类的基础知识

内部类是指一个外部类的外面再去定义一个类,内部类作为外部类的一个成员,并依附于外部类而存在,内部类继承自某个类或某个接口,操作创建外围类的对象。分为四种:静态,成员,局部,匿名。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

19

 

 

 

20Javaweb基础知识

一:安装javaweb运行环境

应用程序一般分两种,C/SB/S,,其中C/S是客户端/服务器端应用程序,也就是说这种应用程序一般独立运行。另外B/S就是浏览器/服务器端应用程序,一个web应用程序包括web客户端和web服务器端两部分,其中客户端通常指的是用户机上的浏览器,客户端不需要开发任何的界面,统一采用浏览器即可。Web服务器是一台或多台可运行web应用程序的计算机,通常在浏览器上输入的网络地址,就是web服务器的地址。

开发工具jdk,它提供了编译Java程序和运行Java程序的环境,jdk包括jreapi。类库等开发必备的东西,

Tomcat服务器,web服务器的工作原理:

1web浏览器向一个特定的web服务器发出web页面请求。

2web服务器接收到请求之后,寻求所请求的web页面,执行相应的功能。

3,将用户请求的最后结果以web页面形式发送到客户的web浏览器上。

Tomcat中包含bin,conf,lib,logs,temp,webapps,work.等子文件。双击bin目录中的startup.bat,启动tomcat,在浏览器上输入http://localhost:8080访问tomcat,其中8080表示tomcat默认端口号。

Mysql数据库和myeclispe

二:jsp页面元素

1.jsp指令元素page指令,include指令,taglib指令。

其中page指令包含

language,extends,session,buffer,authflush,isThraedflush,info,errorPage,isErrorPage,cotenttype

等元素。

Include指示包含文件,taglib指示jsp页面使用的标签库。

2.jsp脚本元素用来插入java代码,这些Java代码将出现在由当前jsp页面生成的Servelt中。

<%!declaration%> 声明脚本元素

<%=expression%> 表达式

<%scriptlet%>脚本

声明:

<%!  

     Stringusename=”shixnfa”

     Stringpassword=”933032”

%>

<%!

  Publicstatic int tt(int n){
if(n==0){
  return 0;

   }

else if(n==1){
return 1;

}

else{
return tt(n-2)+tt(n-1);

}

}

%>

表达式:

<body>

Currenttime:<%=new java.util.Date()%>

</body>
脚本元素:

<%

 Stringname[]={“tom”,”lily”,”wangming”,”zhangsan”};

 For(inti=0;i<name.length;i++){%>

<tr>

 <td><%=name[i]%></td>

<tr>

<%}
%>

3.jsp动作元素

主要包括以下几种:

Jsp:include 在页面被请求时引入一个文件。

<jsp:includepage=”URL” flush=”true”/>

Jsp:usebean 寻找或实例化一个javabean

<jsp:useBeanid=”name” class=”package.class”/>

Jsp:setProperty 设置javaBean的属性

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值