JAVASE基础
			Contents
		
			 陷阱 1. 2016/1/29 18:57:16 
		
		
		
		- 1. 2015/11/18 15:03:43
- 2. 2015/11/19 10:56:14
- 3. 2015/11/23 9:36:28
- 4. 2016/1/22 19:02:35
- 5. 2015/11/23 9:44:36
- 6. 2015/11/23 10:51:00
- 7. 2015/11/6 10:49:42
2015/11/18 15:03:43
回调函数Callback的理解
- 一段程序代码块中,可设定一部分代码,该代码块在未来才实现。
- 回调函数分成3部分 - 回调接口 —— 提供数据的人编写
- 提供数据的人 - 预留接口给他人实现(定义接口、创建接口引用)
- 提供注册接口的方法(注册接口)
- 在给数据的地方调用接口的方法(通过接口引用调用方法)
 
 
* 获取返回数据的人
    - (实现回调接口) implements Callback
    -  注册回调函数
2015/11/19 10:56:14
特征
[A做了一半任务,需要等待B完成任务并返回数据(预留接口引用,给别人调用),然后再完成自己的接下来的任务]
示例:
帮你教机构详情的数据需要到机构简介Fragment里请求,然后返回更新数据
示例:
员工A 完成任务后 告知老板B
- 回调接口 - interface Callback{ //接口返回something time等参数 void execute(String something ,long time); }
- (员工) - class A{ private Callback callback; //预留回调接口,方便他人调用 private doSomething(){ . . //工作数小时 . callback.execute(work,144000055); //告知老板 } private setUser(Callback callback){//提供注册回调函数的方法、还可以考虑通过构造函数注册 this.callback = callback; } }
- (老板) - class B implements Callback{ //实现回调接口 @Override public void execute(String something ,long time){ System.out.println("员工在"+time+"做了"+something); } }
- 测试 - class Test{ public static void main (String args[]){ A a = new A(); a.setUser(new B());//注册接口 a.doSomething(); } }
2015/11/23 9:36:28
文件(目录)操作File的理解
- 理解 —— File是一个工具类,通过其对象来操作文件的增删改查
- 创建文件 - File file = new File(路径,文件名);
- 创建文件夹 - File file = new File(路径,文件名); file.mkdirs();
- 删除文件 - file.delete();
2016/1/22 19:02:35
文件流的理解
- 理解 —— 在程序中要操作文件(读写),必须先将文件转换成流,然后从流中读取(写入)数据。 - 字符流(Reader、Writer) —— 读取(写入)相关的字符(String),不需要缓冲区。 
- 字节流(InputStream、OutputStream) —— 读取(写入)相关的字节,需要先将数据读入(写入)缓冲区,然后再将缓冲区读入(写入)流中。 
 
- 下面通过一个示例来讲述字符流跟字节流的区别。 - 示例: 对一个md文件写入Hello World语句 - File file = new File("B:/Erintrus.md"); if(file.exists()){ println("This file already exists"); }else{ file.createNewFile(); } //上述代码创建一个md文件 ------------------------------------------- **********字符流************* FileWriter fw = new FileWriter(file); String msg = "Hello World";//需要写入的信息 fw.write(msg);//直接将数据写入字符流 **********字节流************* FileOutputStream fos = new FileOutputStream(file); String msg = "Hello World"; byte[] bytes = msg.getBytes();//将数据写入缓冲区 fos.write(bytes); //将缓冲区写入字节流 ***********进阶 —— 高级流************ BufferReader、BufferWriter
 
* InputStream示例
        ************InputStream的缺陷,需要提前设置缓存区大小***************
        File file = new File("B:/Erintrus.md");
        FileInputStream fis = new FileInputStream(file);
        byte[] bytes = new byte[10240]; //文件过大,还是无法读取到完整的数据    
        fis.read(bytes);
* <font color ="red">推荐示例 —— BufferReader(必须加\n)</font>
         ***********FileReader跟BufferReader的结合使用********
        FileReader r = new FileReader(file);
        BufferedReader br = new BufferedReader(r);
        StringBuffer msg = new StringBuffer();
        String s;
        while ((s = br.readLine()) != null) {
            msg = msg.append(s+“\n”); //必须要加\n 否则全部数据变成一行
        }
* <font color="red">推荐示例 —— BufferWriter(必须要关闭流)</font>
        *********FileWriter跟BufferWriter的结合使用
        FileWriter fw = new FileWriter(decFile);
        BufferedWriter bw = new BufferedWriter(fw); //可以不用BufferWriter
        bw.write(msg.toString());
        bw.close();//必须要关闭,不然写不了数据
        fw.close();必须要关闭,不然写不了数据
* <font color = "red">推荐示例 —— FileChanel与FileInputStream、FileOutputStream结合</font>
        FileInputStream fis = new FileInputStream(file);
        FileOutputStream fos = new FileOutputStream(desFile);
        FileChanel fcIn = new FileChanel(fis); //将输入流放到输入管道中
        FileChanel fcOut = new FileChanel(fos);//将输出流放到输出管道中
        ******************输入管道调用transferTo()方法传输数据************
        fcIn.transferTo(0,fcIn.size(),fcOut);
        .
        .
        .
        关闭流
- 总结: - 字符流比字节流简便。
- 不推荐使用FileInputStream、FileInputStream,要用就结合FileChannel来用。
 

示例 —— 写一个用文件保存数据的方法
//参数依次是上下文、待保存数据、文件名、折叠器(用于判断是否在当前文件夹下创建文件)
public void saveData(Context context , Object data , String name , String folder){
    if(context ==null) return ;
    File file;
    if(folder.isEmpty){ //如果没有折叠器,则在当前目录创建文件
        file = new File(context.getFilesDir(),name);
    }else{ //否则,创建一个文件夹
        File filesDir = new File(context.getFilesDir(),folder);
        if(!filesDir.exists()||!filesDir.isDirectory()){//如果文件夹不存在,则创建该文件夹
        {
            fileDir.mkdir();
        }
        file = new File(filesDir,name);//在该目录下创建文件            
    }
    if (file.exists()) {
        file.delete();
    }
*************************保存数据
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(data);
oos.close();
}
总结 —— 创建一个文件的过程
- 判断是否需要创建折叠器(文件夹) - 不要 ——> 直接创建文件
- 需要 ——> 判断文件的目录是否存在 && 判断是否文件夹 ——> 如果不存在,则在该路径下创建文件
 
- 判断文件是否存在 - 存在 —— >删除
 
2015/11/23 9:44:36
文件的读写
- getCacheDir()方法用于获取/data/data//cache目录 
- getFilesDir()方法用于获取/data/data//files目录 
- 写入内容(writeObject、ObjectOutputStream方法) - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); oos.writeObject(data); oos.close();
- 读取内容(readObject、ObjectInputStream方法) - ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); ois.readObject(); ois.close();
2015/11/23 10:51:00
通过文件保存、读取数据需要序列化
2015/11/6 10:49:42
关于String的subString方法
- subString(int start,int end)中的start、end指的是第几位(从start开始,不算strat到end的字符)
String date =20151106
year = date.subString(0,4);
month = date.subString(4,6);
day = date.subString(6,8);
陷阱
集合删除元素
- 比较两段代码的不同
示例一:Iterator删除
Iterator<ShowInfo> iterator = showList.iterator();
if (iterator.hasNext()) {
   ShowInfo delShow = iterator.next();
    if (delShow.isCheck() == true) {
                iterator.remove();
    }
}
示例二: for循环删除
for(int i =0;i<list.size();i++){
    list.remove(i);
    i--;
}
静态成员只初始化一次(创建第一个对象时)
必须同时重写equal跟hashCode方法
- 如何重写equal方法? - 1. 判断两个对象是否相等 if(this==obj) 2. 判断是否本类实例化的对象 if(obj instanceof Test) 3. 判断各种属性(将obj强转成本类)
public class Test{
    private String name;
    @Override
    public boolean equals(Object obj) { //此处必须是Object对象
        if(this == obj){return true;}
        if(!obj instanceof Test){return false} //obj不是Test实例化的对象
        Test test = (Test)obj;
        //判断各种属性
        if(name.equal(obj.getName())){return true;}
    }
}
- 如何重写hashCode方法 - 1. 定义常量基数prime = 31 2. 定义存放散列值的变量 result = 1 3. 散码值通过属性判断,属性为空,则为0,否则调用hashCode方法获取散列值 4. 结果= 基数 * 散列码变量 +散列值
@Override
public int hashCode() {    
    final int prime = 31;
    int result = 1;
    result = prime * result + (name==?0:name.hashCode());
    return result;
}
2016/1/29 18:57:16
集合按某个属性(时间)排序
- 使用Collections的排序方法sort()
- 对象需要实现Comparable接口、重写compareTo方法 - 下面是重写compareTo方法的过程 - @Override public int compareTo(Object another) { if (another instanceof User) { return ((Long) ((User) another).getLastContentTime()).compareTo((Long) this.getLastContentTime()); } else { return 0; } }
 
总结:使用不了compareTo方法需要将其属性强转。

