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方法需要将其属性强转。