javase笔记

                                          




                                                            2016.10.17
1、JDK(java development kit)>JRE(java runtime environment >,JVM(java virtual machine)

2、JVM就是虚拟机相当于java中bin

   jvm会退出的几种情况:
 1)、程序正常执行结束
 2)、使用System.exit(0)方法
 3)、出现异常,没有捕获异常
 4)、平台强制结束jvm进程

                                      2016.10.20
A  a=new  A();
//用new来调用A类的构造器,new 就是在堆中开辟一个新的内存地址,返回一个A的对象或实例,并将实例或对象赋值给变量a,

  可以用a来调用A类中的属性和方法
例如:

Person p=new Person(“瓜码”,120);

-->>person p;

-->>P=new Person(“瓜码”,120);

用new来调用person类中的构造器person();并返回person,赋值给p,p可以调用person类里面的方法,属性等。

String str01=p.getMell();

注:因为str01是String类型,所以说明方法getMell()的返回值是String

3、List集合有顺序,Set集合无排列顺序并且不能有重复元素,即不能有相同的。

哈希码值  hashCode  equals来判断值和对象是否相等?

4.数组和字符串比较

基本数据类型:“==”是比较两个对象的值是否相等,引用型数据类型是比较两个对象是否相等

String str01=new String(“李白”);

String str02=new String(“李白”);

System.out.println(str01.equals(str02));

//输出结果为true!


5.String str=scan.next();

 Int i=scan.nextInt();

String str02=scan.nextLine();//可以识别空格键

6.求多位数中的个位,十位,百位,可以用下面方法

  Int  a,b,c
  d=543;
百位:a=d/100
十位:b=(d-a*100)/10
各位:c=d-a*100-b*10

For(int i=0;i<54;i++){} i如果想把i导入到数组arr[]中是不可以的,i只是索引,但是可以用for循环遍历数组,关键在于i<arr.length;

7、如果第一个类中有含有参数的构造器,想在第二个类中调用,就必须给这构造器赋值,除非再在第一个类中写一个没有参数的构造器。

8、For循环里面可以写多个变量

For(int a,b,c;a<10&&b<3&&c<5;...){}

9、random():[0,1)
10、利用好break,continue,return

   Break:整个循环
Continue:结束当前循环
Return:结束整个方法

11、保留两位小数

Import  java.text.DecimalFormat;
DecimalFormat df=new DecimalFormat(“#.00”);
Double d=25.0256;
System.out.println(df.format(d));
12.冒泡排序:
public static void main(String[] args){
        int[] arr={48, 11, -12, 545, 66, 88, 99, 66, 32};
        for(int i=0; i<arr.length-1; i++){
            for(int j=0; j<arr.length-1; j++){
                if(arr[j]>arr[j+1]){
                    int tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                }
            }
        }
          
        System.out.print("{");
        for(int x=0; x<arr.length; x++){
            if(x!=arr.length-1){
                System.out.print(arr[x]+",");
            }else{
                System.out.print(arr[x]+"}");
           }
    }
}
}
13.Ctrl+鼠标左键见目标文字具体情况

14.This 表示调用类中属性或对象或方法,有static 修饰的不能用this调用

15.成员变量和局部变量名称可以相同

16.数组的长度arr.length;字符串的长度str.length();

17.访问修饰符:由default(缺省)修饰的类,只能被相同包下的类访问,如Person用了default修饰Test类就不能

   访问Person,protected修饰类中的成员变量供子类修改

顶级类只能用Public和缺省

父类 a= new 子类   由父类编译,由子类运行,调用的是子类里面的东西

父类派生子类的条件:1)、保证子类是一个特殊的父类

                   2)、子类需要增加额外的属性

                   3)、子类需要有自己独特的行为方式

 创建子类时,系统会隐式的创建一个父类的对象
 
18、            int i = 5;
        Object o = 5;
        String str04 = o.toString();
        String str01 = i + ""; // 方法一:直接加空字符串
        String str02 = String.valueOf(i);// 方法二:调用valueOf()方法
        String str03 = ((Object) i).toString();// 方法三:强制转换成Object然后调用toString()方法
        System.out.println(str01);
        System.out.println(str02);
        System.out.println(str03);
        // 引用数据类型转换成基本数据类型

//        总共一种方法

        String str = "88";
        int i01 = Integer.parseInt(str);
        double d01 = Double.parseDouble(str);
        System.out.println(i01);
        System.out.println(d01);
19、栈内存:变量(基本、引用) 堆内存:new+构造器

   1).在堆中new了一个新的对象或者数组,在栈中可以定义一个特殊的变量,让这个栈中的变量的取值为这个堆中的首地址,
     栈中的变量就成了数组或者变量的引用变量,以后就可以用引用变量来访问堆中的数组或者对象。
  2).堆的优点:动态分配内存大小,垃圾回收器来回收垃圾
          缺点:存取速度慢
  3).栈的优点:存取速度快,可以共享数据
           缺点:数据和生存期必须确定,缺乏灵活性

20.trim 消除空格 System.out.println(str.trim().length())

21.不要把相同的代码书写两次!
 public Test(String name, int age){
          this.name=name;
          this.age=age;
}
    public Test(String name, int age,double weight){
          this(name,age);
}
22.子类继承父类的方法应遵循“两同两小一大”

  1).两同:方法名相同、形参列表相同;

  2).两小:子类返回值类型和抛出异常类型要比父类小或者相等;

  3).一大:子类的访问权限比父类大或者相等

                                          2016.11.1
一、抽象类(模板)
 1、抽象类可以没有抽象方法,但是有抽象方法的类必须定义为抽象类
 2、抽象类中可以定义属性、方法、构造器、内部类、枚举,但是不能使用new调用构造器,抽象类不能被实例化

 3、抽象类中的继承关系:子类必须继承父类中的全部方法;若子类没有完全继承抽象父类的方法,

    则子类需要用abstract来修饰,但是这种方式尽量不要用。

 4、有static修饰的父类或父类方法不能被子类继承(不能被子类重写),但是能够在子类中使用。

二、接口(interface):接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,

  因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

 1、接口只有抽象方法,没有方法体

 2、修饰符 interface 接口名{

    // 零到多个常量     public static final int a=5;可以直接写成 int a=5;

     //零到多个抽象方法
}    
 3、 可以实现多个接口:修饰符 class 类名 implements 接口1,接口2,......

     接口本身可以继承多个接口

 4、如果不用public修饰interface,该接口在该包下有效,接口里所有成员默认public修饰

 5、接口里面的方法不能用static修饰

 6、接口体现的是一种规范,对于接口的实现而言,接口规定实现者必须向外界提供哪些方法(以方法的形式调用)

    对于接口的调用者而言,接口规定了调用者可以调用哪些方法,以及如何调用这些服务

    抽象类和接口不一样,作为多个子类的父类,体现的是一种模板思想
  7、抽象类和接口的区别:

      相同点:1)、都不能实例化,用于被其他类实现或者继承;

              

              2)、都可以定义抽象方法,其子类都必须重写这些抽象方法。

       区别: 1)、抽象类有构造方法,接口没有构造方法;

                  抽象类中的构造器不能被继承,只能所以不能被重写,可以被调用

              2)、抽象类可包含普通方法和抽象方法,接口只包含抽象方法(在JDK1.8之后可以定义static静态方法);

              3)、一个类只继承一个直接父类(可能是抽象类),却可以实现多个接口(接口弥补了java的单继承)

              4)、抽象类不是一个完整的类,需要进一步细化,接口是一种行为规范,是更彻底的抽象。

三、1、随机获取验证码:String str=UUID.randomUUID().toString().substring(0, 5);//前5个

    2、String str="abcdefghijklmnopqrstuvwsyz";
        str+=str.toUpperCase();
        //结果:abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWSYZ

       StringBuilder sb= new StringBuilder(5);
        for(int i=0;i<5; i++){
       char c=str.charAt(new Random().nextInt(str.length()));
              sb.append(c);
    }
        System.out .println(sb);
    }//随机生成5位随机数
 
    3、toLocalString()显示当前时间
        Date d = new Date();
        System.out.println(d.toLocaleString());
    4、 DateFormat  df= DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
           System.out.println(df.format(d))
                 
                               2016.11.02
  枚举:构造器只能用private修饰
      可以通过类名.values()来的到类中的枚举;
如:for(Person p:Person.values()){
   System.out.println(p);
}

一、异常
          ArithmeticException 算术异常

          NullPointerException  空指针异常

          ClassCastException   类型强转异常

          NumberFormatException  数字格式化异常

           IndexOutOfBoundsException    索引越界

          ArrayindexOutOfBoundsException   数组越界

              

  1、try{}catch{}    

     try{}finally{}  没有catch捕获,抛出异常,自己不做处理

     try{}catch{}finally{}自身需要处理资源,但最终还是要关闭资源

  2、throw:使用于方法内部,throw new 异常类(异常信息);终止方法

    throws
     

二、内部类
  1、类的成员:属性、构造器、方法、内部类,包含内部类的类为外部类(为顶级类的成员)

  2、内部类和外部类的定义一样,并且内部类的类名可以用private,非静态内部类可以调用外部类的

     成员变量(因为寄存了一个外部类的对象),因为内部类为外部类的一部分,可以被同级的方法调用

  3、外部类的静态变量,静态代码块不能访问非静态内部类,包括内部类中的变量,创建实例

     静态和非静态成员可以访问静态成员,静态内部类不能访问外部类非静态成员

   //静态内部类可以调用外部类静态成员变量吗?可以

  4、匿名内部类: 类名 a=new 父类构造器("形参声明")|接口{

               类体部分    
              (对于接口)实现抽象方法

}    和类创建对象很相似,但是new 构造器()跟了花括号{}形成了匿名内部类
    
 


                                2016.11.03
一、枚举:
    1、枚举类:这个类有若干个固定对象,有自己的方法和属性,可以实现一个或者

       多个接口,也有自己的构造器,经常用switch(){}判断  foreach 循环


    2、enum:继承java.lang.Enum

    3、枚举类可以有构造器,但必须用private修饰

二、集合:通常当做存储对象的容器
   1、数组和集合的区别:数组可以存放基本数据类型和对象,集合只能存储对象

   2、两个根接口:Collection、Map
   3、访问List元素根据元素索引访问,访问Set集合元素根据访问元素本身(Set集合中元素不能重复)

      访问Map元素通过每项元素的key来访问value。

   4、List list= new ArrayList();

      list.add();向集合中添加数据;例如:list.add("大头");list.add("小头");list.add("平头");

      list.size();求集合的长度;    例如:System.out.pritnln(list.size());//3

      list.get(i);得到集合索引为i对应的值 ;  System.out.println(list.get(0));//大头

      list.remove();删除集合的元素;

      list.contains(element);是否包含某一个元素

      list.clear();删除所有元素

   5、 Collection cal= new ArrayList();

       Collection的子类是List和Set,Collection类中没有size()、get()、remove(index)的方法,所以不能用

       cal.get()和cal.remove(index)方法

   6、toArray()方法可以把集合转换成数组

   7、iterator循环迭代器,创建的对象cal和iterator绑定后,不能增加元素

      iterator it= cal.iterator

        while(it.hasNext){

         String str=(String)it.next();

        //如果要移除其中一个元素可以用Iterator中的一个方法remove();

        if(str.equal("某个元素")){

             it.remove();
}
      System.out.prtinln(str);
      }
   8、foreach循环中也不能添加和减少元素。

   9、集合转成数组是哈希码值吗?不是

                                2016.11.04



   
一、 有序集合: List list=new ArrayList();
      形式为:[  ]

 1、如果要改写一个类的方法,只需要继承这个类

 2、list.remove(index); 用索引删除元素,返回的是该删除的值,即:Object o= list.remove(2);

    list.remove(element); 删除元素,返回的是boolean,即:boolean b= list.remove(2);

    list.set(index,element); 添加一个索引值为index的element;

    List l=list.subList(1,list.size()-1); 打印从索引值为1到长度-1的数据

 3、循环遍历中迭代器和foreach过程中不能改变这个集合,但是for、while循环中可以添加,删除元素
 
 4、ArrayList 以数组的形式来保存元素,访问、查询的性能较高
    LinkedList  内部是链表式的,插入数据、删除数据性能较高
 

二、 无序集合: Set set = new HashSet();
     形式为:[  ]

 1、无序集合中元素不能重复

 2、HashSet不能保证元素的排列顺序
 
 3、HashSet线程不安全

 4、集合元素可以为null
 
 5、当向HashSet中存入一个元素时,HashSet首先会调用这个对象的HashCode来得到对应的哈希码值,然后根据哈希码值来决定这个元素的位置

   ,若不存在与之相同的哈希码值,就把这个元素添加到这个无序集合中,如果相同就用equals()方法进行比较,如果为true则不添加,如果为
     false,则添加。
 
     哈希码值不同,对象必定不同;  hascode是增强查找效率的

     哈希码值相同,但是对象不一定相同,要用equals比较

     重写equals值:对象相等,返回true; 返回类型(obj.getClass==类名.class)相同,强转类型;返回的值相同,返回true,否则返回false

     重写hashcode:return name.hashCode;
     

三、Map继承体系   HashMap  Hashtable  属于无序集合,不能添加相同的元素

    功能:存储具有一一映射关系的数据(key,value)  value最好加上引号""
 
    形式为{"","","","",""}

     Map map= new HashMap();
 
  1、添加数据 put();
    map.put("语文",110);
    
    map.put("数学",150);

    map.put("英语",110);
   
    key 不能相等,通过key可以得到value的值

  2、 Set key=map.keySet();返回值为Set

      Set  keySet(): 返回Map中所有key所组成的Set集合
 
    System.out.println(key); 打印出["语文","数学","英语"]

  3、containskey(key);是否被包含某一个key,返回值为boolean类型

  4、Map不能像Collection通过foreach for等方式来循环遍历每个值,但可以通过得到key值,key.get(value);再得到value值
     Map没有iterator()方法,只能将求出key的值再用iterator循环遍历

  5、Set<Map.entry<String,String>> entry= map.entrySet();
   
      Set entrySet():返回Map所有key-value对所组成的Set集合
 
  6、Hashtable  ht = new  Hashtable();

     key值和value值都不能为null,否则在运行时会报错

  7、数组扩容:

        (如果只需要复制数组中一部分元素,我们指定复制的长度,Arrays.copyOf(数组,长度))

            if(size==arry.length){
          Integer arry=Array.copyOf(arry,arry.length*2);  


     
              int[] arr=new int[3];
        arr[0]=1;
        arr[1]=2;
        arr[2]=3;
        for(int x=0;x<arr.length;x++){
            System.out.println(arr[x]);//1,2,3
        }
    
         arr=Arrays.copyOf(arr, arr.length*2);//原来的长度的2倍
        
         for(int x=0;x<arr.length;x++){
                System.out.println(arr[x]);//1,2,3,0,0,0
            }
     把一个数组装进另外一个数组
     public class Arr_List {

    public static void main(String[] args) {
        int[] arr01={1,2,3,6,5,4,7};
        int[] arr03=new int[2];
        arrcopy(arr01,arr03);
        
        
    }  
     public static void arrcopy(int[]arr01,int[] arr02){

    
      for(int x=0;x<arr01.length;x++){
         if(x<arr02.length){
            
             arr02[x]=arr01[x];
         }else{
            
             arr02=Arrays.copyOf(arr02, arr02.length*2);
              arr02[x]=arr01[x];
            
         }
         System.out.print(arr02[x]+",");
    
        
        
        
    }

    System.out.println("扩大后的数组长度为:"+arr02.length);
    
    
     }

}




  8、将数组转化成集合:Arrays.asList()方法
     int[] i={1,2,3,6,5,4,7};
     List list=Arrays.asList(i);
     System.out.println(list.size()+","+list) //打印结果为1,[[I@15db9742],原因:基本数据类型会被当成个一个变量,而且打印出来的是
                                                  哈希码值
   Integer[] ii={1,2,3,4,5};
   List list=Arrays.asList(ii);
   System.out.println(list.size()+","+list);  //打印结果为5,,[1, 2, 3, 4, 5],引用类型就是输出里面的元素

    这个方法不能add和remove,因为底层是数组,数组长度是不能变的
 

  9、数组、list、set、Map之间互转
    private static void testMap2List() {  
        
        Map<String, String> map = new HashMap<String, String>();    
        map.put("A", "ABC");    
        map.put("K", "KK");    
        map.put("L", "LV");    
          
        // 将Map Key 转化为List      
        List<String> mapKeyList = new ArrayList<String>(map.keySet());    
        System.out.println("mapKeyList:"+mapKeyList);  
          
        // 将Map value 转化为List      
        List<String> mapValuesList = new ArrayList<String>(map.values());    
        System.out.println("mapValuesList:"+mapValuesList);  
          
    }  
 
    private static void testMap2Set() {  
          
        Map<String, String> map = new HashMap<String, String>();    
        map.put("A", "ABC");    
        map.put("K", "KK");    
        map.put("L", "LV");    
          
        // 将Map 的键转化为Set      
        Set<String> mapKeySet = map.keySet(); 或者
      Set<String> mapValuesSet = new HashSet<String>(map.keySet());      
        System.out.println("mapKeySet:"+mapKeySet);  
          
        // 将Map 的值转化为Set      
        Set<String> mapValuesSet = new HashSet<String>(map.values());    
        System.out.println("mapValuesSet:"+mapValuesSet);  
    }  
 
    private static void testArray2Set() {  
          
        String[] arr = {"AA","BB","DD","CC","BB"};    
          
        //数组-->Set    
        Set<String> set = new HashSet<String>(Arrays.asList(arr));    
        System.out.println(set);    
    }  
 
    private static void testSet2Array() {  
        Set<String> set = new HashSet<String>();  
        set.add("AA");  
        set.add("BB");  
        set.add("CC");  
          
        String[] arr = new String[set.size()];    
        //Set-->数组    
        set.toArray(arr);   
        System.out.println(Arrays.toString(arr));    
    }  
 
    private static void testList2Set() {  
            
        List<String> list = new ArrayList<String>();  
        list.add("ABC");  
        list.add("EFG");  
        list.add("LMN");  
        list.add("LMN");  
          
        //List-->Set  
        Set<String> listSet = new HashSet<String>(list);  
        System.out.println(listSet);  
    }  
 
    private static void testSet2List() {  
           
        Set<String> set = new HashSet<String>();  
        set.add("AA");  
        set.add("BB");  
        set.add("CC");  
          
        //Set --> List  
        List<String> setList = new ArrayList<String>(set);  
        System.out.println(setList);    
    }  
 
    private static void testList2Array() {  
        //List-->数组    
        List<String> list = new ArrayList<String>();    
        list.add("AA");    
        list.add("BB");    
        list.add("CC");    
        Object[] objects = list.toArray();//返回Object数组,需要遍历才能得到里面的值    
        System.out.println("objects:"+Arrays.toString(objects));    
          
        String[] arr = new String[list.size()];    
        list.toArray(arr);//将转化后的数组放入已经创建好的对象中    
        System.out.println("strings1:"+Arrays.toString(arr));    
    }  
      
    private static void testArray2List() {  
        //数组-->List    
        String[] ss = {"JJ","KK"};    
        List<String> list1 = Arrays.asList(ss);    
        List<String> list2 = Arrays.asList("AAA","BBB");    
        System.out.println(list1);    
        System.out.println(list2);    
    }  
         
   Collection用for循环:先把Collection转换成list
       Collection<String> c= new ArrayList();
                  c.add("你妹");
                  c.add("干嘛");
                  c.add("喊你");
                  c.add("你啥");
                  c.add("呵呵");
                  c.add("逗");
 List<String> list= new ArrayList<String>(c);
                 for(int i=0;i<c.size();i++){
                    System.out.println(list.get(i));
                 }




  public class Sort {//可以把set集合排序

    public static void main(String[] args) {
    
        Set<Integer> ll= new HashSet<Integer>();
        
        ll.add(11);
        ll.add(33);
        ll.add(2);
        ll.add(44);
        SortedSet<Integer> st= new TreeSet<Integer>(ll);
        System.out.println(st);
            }  

    }//[2, 11, 33, 44]


                                        2016.11.07
 
一、泛型:<>
     规定向集合里添加什么类型的元素  

二、异常处理:

  1、异常处理可以提高程序的健壮性       

  2、分为两种:Error      Exception  -->RuntimeException    运行时异常
                                    -->IOException         输出流异常(编译异常)
                                    -->SQLException        数据库异常(编译异常)

    1)、Error:这种错指的是系统崩溃、虚拟机出错、动态链接失败,这种错误不可恢复不可以捕获
    2)、Exception: 语法错误或者语义错误,程序员能够处理
  3、try{..}catch(){..}       printStackTrace()              get.message()

  4、捕获后不影响后面程序的执行

  5、Exception对应catch应该放在所有catch块后面,小异常在前面,大异常在后面
 
  6、finally比return的优先级更高,会先执行finally里面的代码再执行return
 
  7、System.exit();关闭虚拟机  在finally前面可以让finally不执行

  8、使用throws一般在方法名后面抛出,但是在main方法中必须解决,否则会直接抛给虚拟机导致程序崩溃
 
  9、手动抛异常throw

                                     2016.11.08
 
                                 }

  一、IO流    input output  

     1)、字节流、字符流

     2)、数据都是存放在文件中,操作数据之前得学习操作文件和文件夹,在java中操作文件和文件夹是类File,

     File是java.io包下的,代表与平台无关的操作文件和文件夹的一个类
   
     3)、通过一个文件或者一个文件夹的真实路径(相对路径和绝对路径)来创建抽象路径File对象,优点是可以调用File的方法
 
     4)、可以用“\\”“/”“separator”

     "E:\\e.text"    "E:/e.text"   "E:"+ File.separator+"e.text"(这种方法可以跨平台)

       得到当前路径的方法:getAbsolutePath()
     
        判断这个路径的文件是否存在: exists();返回值为boolean类型
           是文件夹isDirectrory()          是文件isFile()

        创建文件:对象.creatNewFile();

     5)、返回最后一个子目录的父目录   对象.getParent(),对象.getName():得到最后一个目录
 
     6)、对象.delete(),删除的文件下面没有子文件可以删除,如果有就无法删除

     7)、对象1.renameTo(对象2);        用对象2中的路径替代对象1的路径

     8)、list()返回值类型为String[]类型的数组
           
         listFiles()  返回抽象路径名数组,这些路径名全是这个抽象路径中的文件和目录
        
         listFiles(FilenameFilter filter)  满足指定过滤器要求的文件和目录
                                    
              
                                   2016.11.09
一、java IO流
  1)、输入流(进入内存)、输出流(出内存)
 
  2)、InputStream (基类,字节输入流)   Reader(基类,字符输入流)
       OutputStream(基类,字节输出流)   Writer(基类,字符输出流)
       注:记忆方法,想象成大脑,    Reader就是在读取,进入大脑,即输入;
                                Writer就是写出来,从大脑出来,即输出。

  3)、图片、音频、视频通过字节流操作,文本通过字符流操作

  4)、FileWriter(String fileName)          FileWriter(File file)
       FileWriter   节点流,低级流
                 1、如果路径下没有操作文件可以自动创建文件
                 2、文件字符输出流

   5)、FileWriter file = new FileWrite("E:\\works");
 
        file.write("在文本中写东西")  
       // file.flush();  因为流关闭之前会刷新,所以flush可以不要
        file.close();关闭流,关闭之前会刷新。如果要关闭两个以上的流要分开关闭

   6)、用FileWriter ,必须保证父目录存在
 
   7)、字符转换成字符串的方法:
        char[] c = {'1','2','3','4','5','6'};
        for(int i=0;i<c.length;i++){
            //System.out.print(c[i]+"");
        }
        //String str= new String(c);

   8)、fa.write(aa);
 
   
   总结:如果要创建文件夹和文件,创建的方法需要两个形参;例如:test("E:\\work02\\test","a.txt");
        
        一定要记得关闭资源close(),这样才能写入或者输出

                           2016.11.10
一、1、bufferedReader(Reader in);创建一个使用默认大小输入缓存区字符输入流
      bufferedReader(Reader in,int size);创建一个使用指定大小输入缓存区字符输入流
      BufferedWriter(Writer out);创建一个使用默认大小输出缓存区字符输出流
      BufferedWriter(Writer out,int size);创建一个使用指定大小输出缓存区字符输出流

   2、把一个路径下的文件复制到另外一个路径下:
     1)、判断原文件是否存在,如果不存在,直接终止程序  
     2)、判断新路径下的文件的父目录是否存在,如果不存在新建文件夹
     3)、新路径下的文件后缀名是否满足要求,不满足要求不能复制
     
   3、OutputStreamWriter           FileOutputStream
 
   4、GBK 、UTF-8、  NASI(字节、字符串默认)
     GBK一个汉字两个字节、UTF-8一个汉字3个字节
     
     GB2312 默认的是ANSI
 
  5 、ASCII码是美国的自己弄得,一个一节对应一个字符(针对英语);
      ANSI代表两个字节表示一个字符,是不同国家自行弄得编码的统称,如GB2312是中国的,JIS是日本人的,但是都统称ANSI,但是不同编码之间不能通用。
    
   
 
                          2016.11.11
 
  一、1、字节流:FileInputStream  FileOutputStream

             FileOutputStream   fo= new FileOutputStream (String path,String content);
              
             方法:fo.write(content.getByte("UTF-8"));得到字节编码转换的方法
      2、available() 返回可读字节数数目,返回值为int,如果available()>0,说明里面还有字节,用于读剩余字节
 
      3、PrintStream ps= new PrintStream(new FileOutputStream(path));
         ps.println(...);
        
         PrintStream和PrintWriter分别属于字节打印流和字符打印流


                         2016.11.14
 一、IO

 1、RandomAccessFile读写文件任意位置
    用法:RandomAccessFile raf= new RandomAccessFile(路径名,模式)
    模式:r:只读  rw,读和写
   
   ;创建其对象raf,然后调用其方法

   getFilePointer();读取字节数
   seek(0);设置文件指针为0
   SkipBytes(12);跳过12个字节,来到12个字节后面
   setLength(long newlength);拿来做文件的断点下载
   RandomAccessFile经常拿来做文件的多线程断点下载

2、管道流:实现两个线程之间的数据交互
   PipeInputStream
   PipeOutputStream
   PipeReader
   PipeWriter
3、复制文件及里面的内容,快捷的方法(Files类):
        (直接在main里面用就行了)
        String path1 = "E:\\work07\\test\\1.java";
        String path2 = "E:\\work07\\1.java";
  (1)、Files.copy(source,out);//先有原文件,再写到一个新的路径
       Files.copy(Paths.get(path1), new FileOutputStream(path2));
  (2)、Files.copy(in,target);//先读原文件,再到一个新的路径
        Files.copy( new FileInputStream(path1),Paths.get(path2));
    
 IO流的总结:
     文件流(重点):FileInputStream   FileOutputStream    
           FileReader        FileWriter
     缓冲流(重点):BufferedInputStream   BufferedOutputStream
           BufferedReader      BufferedWriter
     转换流:把字节转换成字符
           InputStreamReader    OutputStreamWriter   
     内存流、顺序流(合并流)
     对象流:(序列化和反序列化Serializable)
           ObjectInputStream
           ObjectFileOutputStream    
     打印流:
            PrintStream
            PrintWriter
     数据流:
            DataInputStream;
            DataOutputStream;
     管道流:实现两个线程之间的数据交互
            PipeInputStream
            PipeOutputStream
            PipeReader
            PipeWriter

 二、网络编程
     计算机网路:地理位置不同、多台计算机、用通信线路连接,实现资源共享和信息传递的计算机系统
     
     网络分层:减少网络设计的复杂性,不同机器上的同等功能层之间采用相同的协议
     
     OSI参考模型(7层): 1、物理层
                         2、数据链路层
                         3、网络层
                         4、传输层
                         5、会话层
                         6、表示层
                         7、应用层
     TCP/IP分层模型(4层):
                         1、网络接口
                         2、网络层
                         3、传输层
                         4、应用层

     2、网络编程全部在java.net包里面
     3、网络编程三要素:
       (1)、IP地址
            用InetAddress来表示IP地址:Inet4Address   Inet6Address
         1)、得到IP的方法getByname(IP地址)
            InetAddress ip=InetAddress.getByName("stusd026");
            System.out.println(ip);//stusd026/172.31.83.39
         
               System.out.println(ia.getHostName());//stusd026
           System.out.println(ia.getHostAddress());//172.31.83.39
       (2)、端口(port):物理端口、协议端口
     
        (3)、URI:统一资源标识符
               URL:统一资源定位符
               都表示资源路径,URL范围比URI小

     (4)、encode是编码,decoder是解码
          String str="编码";
 //       使用UTF-8编码
      String urle=URLEncoder.encode(str, "UTF-8");
      System.out.println(urle);
//      使用UTF-8解码
      String urld=URLDecoder.decode(urle, "UTF-8");
      System.out.println(urld);
            
     (5)、传输层协议:TCP UDP
          TCP:面向连接(经历3次握手),传输可靠(保证数据的正确性和先后顺序),用于传输大量数据,速度慢,建立连接需要更多的时间和资源
          UDP:面向非连接,传输不可靠(数据丢失),用于传输少量数据,速度快。
 
      (6)、ServerSocket服务端   Socket客服端

三、反射

 
      Class:类的反射类
      Filed:属性的反射类
      Constructor:构造器的反射类
      Method:方法的反射类


  1、 获得java.util.Date类对象的方法
   1)、使用class属性
            Class<java.util.Date>  claz=java.util.Date.class

   2)、通过对象的getClass的方法来获取,getClass是Object中的方法
            java.util.Date   date=new java.util.Date();
            Class<?> claz2=date.getClass();  

  3)、通过Class类中的静态方法forName(String className)
            Class<?> claz3=Class.forName("java.util.Date");
  注:反射中一般用第三种方法





  2、获得构造器和对象的方法
   
        Person p= new Person();  //其中属性有name,age  构造器有无形参和有形参两种,方法有setName(String name);getName();
                                                                                        setAge(int age);getAge();
                                   
        
    Class<Person>    clz=Person.class;//获得类对象字节码
        Constructor<Person> cp=clz.getConstructor();//获得构造器字节码
        cp.newInstance();//获得对象

        Constructor<Person> cp=clz.getConstructor(String.class,int.class);//获得构造器字节码/有参数
        cp.newInstance("黄圣依",23); //获得对象/有参数



   3、获得方法的方法
    
    Method[] md=clz.getMethods();   //获得所有的方法、包括父类
    System.out.println(md.length);    //获得方法的长度
    for(Method mm:md){
        System.out.println(mm);
    }


         Method[] md=clz.getDeclaredMethods();//获得自己的方法,不包括父类
    System.out.println(md.length);
         for(Method mm:md){
        System.out.println(mm);
    }
        
        Method md1=clz.getDeclaredMethod("getAge"); //获得其中一个方法
      System.out.println(md1);

        Method md2=clz.getDeclaredMethod("setName",String.class); //获得由一个String类型的形参的方法
    System.out.println(md2);

        Object pp=md1.invoke(clz.newInstance());//得到方法里面的内容,getAge//对象无形参
    System.out.println(pp);
        Object  pp2=md2.invoke(clz.newInstance(),"黄圣依");得到setName()方法里面的内容,setName//对象有形参
    System.out.println(pp2);


        Method md3=clz.getDeclaredMethod("test",String.class,int.class);//得到test(String name,int age)方法里面的内容

    md3.setAccessible(true);//若test()方法是private修饰的就用这个方法判断,设置为可访问!
        
          这个setAccessible()很变态的,不管用任何权限修饰符或者用什么方式封装的,只要通过反射机制,调用这个方法,可以访问
           类里面的属性、构造器、方法,但是这个方法确实是需要的,有时需要内部的是怎么样来实现的,总之利大于弊

    Object  pp3=md3.invoke(clz.newInstance(),"黄圣依",22);<= =>Object  pp3=md3.invoke(clz.newInstance(),new  Object{"黄圣依",22)};

        注意:如果方法为静态,需要把clz.newInstance()改为null


    4、获得数组方法里面的内容:

           public void arr(String[] arr){
        System.out.println("这是数组"+Arrays.toString(arr));//Arrays.toString(arr)可以打印出数组
    }
   
 
         1)、基本数据类型的数组:
          Class<Recfectaa>  claz=Recfectaa.class;//Recfectaa为创建的一个类,里面创建的是一个arr的方法,形参为(int[] arr){}
          Method md=claz.getMethod("arr", int[].class);
      System.out.println(md);
      md.invoke(claz.newInstance(),new int[]{22,33,44});

         2)、引用数据类型的数组:new Object{形参},对应所有类型的形参都可以用
          Method md=claz.getMethod("arr", String[].class);
      System.out.println(md);
      md.invoke(claz.newInstance(),new Object[] {new String[]{"a","b","c"}});//调用方法把实际参数作为Object数组的元素即可


四、多线程
 1)、main方法就是主线程的执行体
 2)、Runable的线程类是Thread;Runable可以让线程实现共享变量,可以让多个线程共享一个数据,只有run方法才能成为线程执行体
 3)、进程:就是正在运行的程序,特点:
                    a.独立性,不允许其他进程进入
                    b.动态性,是活动的指令集合
                    c.并发性,可以和多个进程在单个处理器上并发运行
 4)、线程:每个进程里面有很多执行流,每个执行流都是一条线程,线程是进程的组成部分

                                            2016.12.5
 补充:
1、Random random=new Random();
   int ra=random.nextInt(20);
   System.out.println(ra);
//每次生成的随机数都不一样
                                   
2、Random random=new Random(47);//一个特定的种子,已某个元素为参照
   int ra=random.nextInt(20);
   System.out.println(ra);
//每次生成的随机数都是18,但是再调用一次nextInt(),生成的随机数又不一样

3、四舍五入:Math.round(变量);
    double d=5.8923;
    d=Math.round(d);
    System.out.println(d);




                                       2016.12.09
 



1、Hashtable 不含任何的final方法
  现代java容器库HashMap替代了Hashtable

2、继承和组合都能从现有类型生成新类型,组合一般是将现有类型作为新类型底层实现的一部分加以复用,而继承复用的是接口

3、数组运行速度比集合快

4、abstrac不能和static final private共同存在


5、Dothis ds= new Dothis();   Dothis是外部类 Inner是内部类
        //创建内部类对象的两种方式
  Dothis.Inner in=ds.inner();  //inner 是Dothis的一个方法  public Inner inner(){
                                                         return new Inner();
                                                                   }
        
  Dothis.Inner in2=ds.new Inner();
 
6、String常用的方法:

                     charAt(index):找到指定索引对应的元素
                     toCharArray():将字符串转换成字符数组


                    subString(startIndex,endIndex);截取一段字符串
                    split(String regex):拆分字符串
                    concat(String str):把str字符串连接到指定字符串的尾部

                    endsWith(String suffix):检查字符串是否已指定后缀结束
                    startWith(String suffix):检查字符串是否已指定后缀开始

                    hascode():返回此字符串的哈希码值
                    equals(Object anobject):比较两对象是否相等

                    
                    toLowerCase():把字符串转成小写
                    toUpperCase():将字符串转成大写
                    

                    isEmpty():length为0是返回true
                    length():字符串长度
                    replace(old,new):字符串替换
                    trim():消除空格
                    format():格式化字符串
                   

                    

                   

                    


                                           2016.12.10
  
1、内部类隐式的创建了一个指向外部类的对象,所以我们可以直接调用外部类的对象(重要)。但是有static修饰的内部类就不能调用外部类的对象了

2、如果不需要内部类对象和外部类对象有联系,就把内部类声明为static,这通常称为嵌套类,
  创建嵌套类后的特点(即用static修饰的):
   1)、要创建嵌套类对象不需要外围类的对象
   2)、不能从嵌套类中访问外部类中非静态对象(即静态不能访问非静态)
3、 如果是普通内部类,那么它里面不能有静态方法和对象

4、为什么要创建内部类?
   因为可以通过内部类来实现多继承,每个内部类都是独立的,不管外围类是否已经继承了某个接口或者实现,对内部类都没有影响
   内部类的特性:
   1)、内部类可以有多个实例,每个实例都有自己的信息,并且其外围类对象的信息相互独立;
   2)、在单个外围类中,内部类可以以不同的方式实现同一个接口,或者继承同一个类;
   3)、创建内部类的对象并不依赖外部类的对象的创建;
   4)外部类是一个独立的个体。
5、Anny$1.class匿名内部类
  A$B.class 内部类

6、queue是按排队顺序来确定对象产生的顺序


7、正则表达式: api文档查找Pattern

                                                       2016.12.12
       
debug调试:
1、设置断点
2、debug as
3、点中要看到的数据,点击右键的wathch
4、f5、f6测试,调试完成之后,按f8,若断点后面没有断点,会跳到下一个断点

JUnit测试:
JUnit称为单元测试,测试对象是项目中类的 方法,用来为程序写测试用例的,
JUnit是一个专业的测试工具(架包),不是javase的一部分,若需要使用,需要导入架包,MyEclipse自带
 
 
@注解--test after     
 public void 方法名(){//没有返回值,不能有形参
 
     调用要测试的方法
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值