@Override
public int lastIndexOf(Object o) {
//必须考虑元素为空的情况。因为空不空比较的方法不一样。
if(o==null){
for (int i = size-1; i >=0; i--) {
if (data[i] == null) {
return i;
}
}
}else {
for (int i = size-1; i >=0; i++) {
if (data[i].equals(o)) {
return i;
}
}
}
return -1;
}
系统登录实例
系统登录
1 根据用户名找到用户对象
2 比较用户对象的密码与当前密码是否一致
散列表概念
1 容量: 散列表中散列数组大小.
2 散列运算: key->散列值(散列数组下标)的算法,
如: "mm".hashCode()%10->8
3 散列桶: 散列值相同的元素的"线性集合"
4 加载因子: 就是散列数组加载率, 一般小于75%性能比较理想
就是:元素数量/散列数组大小, 如: 7/10=70%
5 散列查找: 根据Key计算散列值, 根据散列值(下标)找到
散列桶,在散列桶中顺序比较Key, 如果一样, 就返回value
6 散列表中Key不同, Value可以重复
/**
在方法中不能随便写一个throw 。。。。因为如果真的出错,它一定会使整个软件停止运行。
这样是不好的,所以我们通常的做法都是先捕获异常,然后根据具体的业务逻辑,再进行
处理。
*/
异常
1 行为的意外结果
2 一个方法如果抛出了异常,这个方法就必须声明异常的抛出.
异常的声明:在方法上声明方法的意外结果,如:
User reg(String name, String pwd, String email)
throws UserExistException;
User login(String name, String pwd)
throws NameOrPwdException;
3 异常类一般继承于Exception
4 调用抛出异常的方法,必须处理异常
4.1 使用try catch finally 捕获
4.2 直接再抛出异常
4.3 捕获 再抛出.
处理方式,依赖于具体业务逻辑,很灵活。
5 如果代码有异常发生,异常以后的代码将不再执行。
6 try catch finally
try 是尝试运程代码块,如果有异常会被随后的catch捕获
异常发生以后代码不执行
catch代码块是异常处理代码。需要提供合理的处理,异常的处理
是与具体业务逻辑有关。可以写多个catch处理一系列异常,但是
要注意:异常的大小关系,大类型的放到后面处理。因为大的异常放到前面后面的代码根本不会执行,
例如在每一个catch里面写上Exception那么后面的谁也不可能捕捉的到。不过,我们的编译器
中也不允许大家这样写,会出错 。
有的时候 catch(Exception) 粗粒度处理异常,代码简洁
语义含糊. 根据业务逻辑适当选用。
finally 代码块,不管是否出现异常,总会执行的代码块。
经常用来处理现场的清理,比如:可靠的数据库连接关闭。
7 异常有一个基本原则:能够底层处理的尽量处理,但是
如果不能处理,必须抛出到调用者(方法)。不应该简单的
抛弃。
8 异常捕获再抛出, 是一种把底层异常进行封装,转换为另外
一种异常类型。
9 *建议在捕获到异常时候使用e.printStackTrace(),打印到
控制台,输出内容是:出现异常时候的方法调用堆栈.
一般情况下,凡是捕获异常代码都输出:e.printStackTrace()
10 异常的分类(异常的继承分类。)
Throwable(是所有根,有两个子类,Error和Exception)
|--Error 是系统不可恢复的错误,由JVM发生
| |--OutOfMemoryError 堆内存溢出
| |--StackOverflowError 栈内存溢出(死递归会出现这种情况,因为所有的变量都在栈内存中碰到的,一般64M或者128M)
|--Exception 程序可以检查处理的异常,常见的异常继承根
|--java.text.ParseException format解析对象时候发生
| 如:Date d = dateformat.parse("2010-5-5");
|--RuntimeException(以下都是它的子类) 非检查异常,Javac忽略对
| 这类异常的语法检查,如:异常抛出,异常处理等。
|--IllegalArgumentException
|--NullPointerException *
|--ArrayIndexOutOfBoundsException *
|--ClassCastException *
|--NumberFormatException * Integer.parseInt()
11 软件中会大量使用自定义异常,一般从Exception继承。
异常类命名要有实际意义。
面试中会问:请至少说出八种异常
IO 输入与输出(Input/Output)
1 在包:java.io
1 File 类, 代表文件/文件夹(目录) file不仅代表demo也代表文件夹
a 查看文件/目录属性
目录: 相对目录: 是JavaVM启动的目录, Eclipse中
默认的相对目录是: 项目文件夹!
System.out.println("得到文件或者文件夹绝对路径:"+bin.getAbsolutePath());
System.out.println("是否是目录:"+bin.isDirectory());
System.out.println("是否是文件:"+bin.isFile());
System.out.println("是否可读:"+bin.canRead());
System.out.println("是否可写:"+bin.canWrite());
System.out.println("是否可执行:"+bin.canExecute());
File file = new File("src\\day16\\FileDemo.java");
// File file = new File("src/day16/FileDemo.java");
java中的路径反正都行,是为了跨平台。
b 创建文件/目录
//管理文件/目录
File dir = new File("demo");//此时demo表示一个文件或者文件夹
System.out.println(dir.exists());
if(!dir.exists()){
dir.mkdir();
try {
dir.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(dir.exists());
File test = new File("tt");
dir.renameTo(test);
dir.delete();
test.delete();
c 访问文件系统(目录系统), 列文件/列目录/过滤列目录
//访问文件系统(目录系统)
File work = new File(".");
String[] list = work.list();
System.out.println("Content in "+work.getAbsolutePath());
for (int i = 0; i < list.length; i++) {
String name = list[i];
System.out.println(name);
}
寻找符合某条件的某个目录下的所有文件:
public static void main(String[] args) {
File file = new File("src/day16");
final String string = ".java";
String[] list = file.list(new FilenameFilter() {
/**
* 参数:
dir - 被找到的文件所在的目录。
name - 文件的名称。
返回:
当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
内部类不能够重写它的构造方法
*/
@Override
public boolean accept(File dir, String name) {
if (name.endsWith(string)) {
return true;
}
return false;
}
});
// return 想要可以跟任何表达式,但它要与这个方法的返回值,相匹配。
// return name.endsWith(string)返回是boolean类型
// 更加强大的类是列出子目录下的所有文件:ListAllDemo(用递归做的)
package day16;
import java.io.File;
import java.io.FilenameFilter;
public class ListAllDemo {
/**
* @param args
*/
public static void main(String[] args) {
File file = new File("src");
list(file, ".java");
}
/**
* 显示指定文件夹的指定类型的文件
* 递归处理子文件夹
* @param dir
* @param ext
*/
public static void list(File dir,String filterString){
System.out.println("-------");
System.out.println(dir.getAbsolutePath());
System.out.println("-------");
listFiles2(dir, filterString);
//获得当前目录下的所有文件或者子目录
File[] allFiles = dir.listFiles();
for (int i = 0; i < allFiles.length; i++) {
File d = allFiles[i];
//如果是目录的话,则把这个目录下的文件迭代一下。
if(d.isDirectory()){
list(d, filterString);
}
}
}
public static void listFiles2(File dir,final String filterString){
String[] allFiles = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(filterString);
}
});
for (int i = 0; i < allFiles.length; i++) {
System.out.println(allFiles[i]);
}
}
}
// files.listFiles()//列出该目录下的所有文件和子目录。
预习: Java 输入与输出流 InputStream/OutputStream