二分法
- 1、
public static <T extends Comparable<T>> int binerySearch(T[] array,T key){
int start = 0;
int end = array.length - 1;
while (start<=end) {
int mid = (end - start)/2 + start;//(end + start)/2有溢出的风险
if (array[mid].equals(key)) {
return mid;
}else if (array[mid].compareTo(key)>0) {
end = mid - 1;
}else {
start = mid + 1;
}
}
return -1;
}
- 2、
public static <T> int binerySearch(T[] array,T key,Comparator<T>comp){
//start end 指的是下标;
int start = 0;
int end = array.length - 1;
while (start<=end) {
//int mid = (end - start)/2 + start;
int mid = (start + end)>>>1;//逻辑右移
if (array[mid].equals(key)) {
return mid;
}else if (comp.compare(array[mid], key)>0) {
end = mid - 1;
}else {
start = mid + 1;
}
}
return -1;
}
遗留容器
遗留容器 (自己写代码不要用但是可能在项目的早期版本中可能遇到的容器)-->在新版本已经被淘汰的容器
设计烂、效率低、使用麻烦
BitSet - 二进制位集合
Vector - Arraylist的线程安全版本
Stack - 栈 - FILO的容器
Dectionary - 字典 - 键值对容器
Hashtable - HashMap 的线程安全版本
Properties - 键和值的类型都是String的HashMap(映射)
Enumeration - 枚举器(对遗留容器进行迭代的迭代器)
不要继承工具类
IO
Unix - IO操作被简化成文件 C++ /Java IO操作被抽成了流
读数据 - 输入流 - read()
写数据 - 输出来 - write()
只有一个方向一个维度
try 把运行时可能出状况的代码放到try块中保护起来执行,如果出现了异常状况,就同过后面的catch来捕获异常对象并进行相应处理。
FileInputStream的构造器用throws关键字声明FileNotFoundException异常
而且该构造器的代码中判定如果文件无效就用throw关键字抛出异常对象。
一个try块可以抓多个catch用于捕获不同异常类型但是在书写上要保证先捕获子类型异常再捕获父类型异常
如果捕获的异常之间没有父子关系,那么捕获顺序呢随意
从Java7 开始如果多个catch代码是一致的可以合并为一个catch (中间用竖线|连接)
Finally - 总是执行代码块 - 不管程序正常异常此处都要执行
此处最适合释放程序中打开的各种外部资源(文件、数据库、网络)
twr - try-with-resourse
从Java7 开始可以使用TWR语法将需要释放放外部资源直接放在try后的圆括号中
这样的话不管正常离开还是异常离开try块,外部资源会自动关闭
实现了AutoCloseable接口的外部资源对象可以使用TWR语法自动关闭
如果频繁的进行I/O操作会使得CPU的利用率非常低下
因为I/O操作会导致CPU产生I/O中断。CPU不能满负荷工作
创建一个字节数组作为输入缓冲区 将文件中的数据直接读入缓冲区
这种做法可以减少I/O中断的次数从而保证CPU能够不被频繁中断
try (InputStream in = new FileInputStream("c:/Java.txt")) {
byte[] buffer = new byte[1024];
int totalBytes;// 记录read操作总共度了多少个字节
while ((totalBytes = in.read(buffer)) != -1) {
System.out.println(new String(buffer, 0,totalBytes));
}
} catch (IOException e) {
e.printStackTrace();
InputStream - 字节流(以字节单位进行读取) - 二进制文件
Reader - 字符流(以字符单位进行读取)- 文本文件
File file = new File("c:/java.txt");
try(Reader reader = new FileReader(file)){
System.out.println(file.length());
char[]buffer = new char[512];
int totalChars;
while((totalChars = reader.read(buffer))!=-1){
System.out.println(new String(buffer, 0,totalChars));
}
}
catch (IOException e) {
e.printStackTrace();
}
public static void main(String[] args) {
String s1 = "hello,world";
String s2 = "你好,世界";
//FileWriter 构造器的第一个参数是文件名或者File对象
//第二个参数用来指定是否启动追加模式(在原来文件的末尾输出新的内容)
try (Writer writer = new FileWriter("d:/abc.txt",true)){
writer.write(s1);
writer.write("\r\n");
writer.write(s2);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("程序结束");
}