第三周 Java API
2019.8.12
学习多看源码
System
- System.curremtTimeMillis(),可以用来计算程序运行时间,t2-t1
- arraycopy(src, srcPos, dest, destPos, length)
Stirng
- string中有一个final char[] value 数组储存字符,不可变
- 字符串转码构造方法,String(byte[], String Charset),string.getBytes(),“UTF-8”
- String.format()格式化
- equals(),equalsIgnoreCase() 忽略大小写
- startWith()、endWith()
- indexOf,找不到返回-1;lastIndexOf:从后向前找
- length()
- replace、replaceAll、split、subString(begin)/(begin,end)不包括end
- toUpperCase、toLowerCase,trim前后两端的空格
- Character.isDigit()数字,isLetter()字母
StringBuffer、StringBuilder
- append(),拼接比较快,String不可变效率低
- StringBuffer,加锁,线程安全,使用多线程环境
Arrays
- sort;binarySearch:对一个已排序的数字,二分查找;asList,stream
Math
- floor向下取整,ceil向上取整,round四舍五入
- max,min,sqrt开方,pow幂
- random,double型
Random
- nextInt(int bound),bound范围[0,bound),nextInt() 不带参生成的数有负数
- Random(seed)有seed参数构造的,每次生成规律都一样,不带参以时间为seed更随机
UUID
- UUID.randomUUID().toString() 不知道为什么很慢,一秒多
- 空的00: new UUID(0,0)
Date、Calender
- Date已弃用
- get(Calender.YEAR)。。。,月从0开始,set()year。month。。。
接口,集合
2019.8.13
Iterable
-
实现迭代接口,对集合foreach循环,lang包
-
实现 public Itereaor iterator()方法,util包
- Iterator 得实现 public boolean hasNext():有没有下一个
- public <T> next():获取下一个
-
设计模式中的迭代器模式
foreach遍历时候,删除会报错,迭代器实现,或者集合的removeIf()方法
// 迭代器 遍历删除 Iterator<String> iterator=list.iterator(); while (iterator.hasNext()) { String name=iterator.next(); if(name.startsWith("t")) iterator.remove(); } //// removeIf(t->t.startWith("t")) 实现
-
Collection的遍历
/** * Student实体类,重写了toString * Klass班级,内有个student数组 * */ Klass impelements Iterable<Student>{ //。。。add(),count计数 students[] @Override public Iterator iterator<Student>() { return new Iterator<Student>(){ int index=0; @Override public boolean hasNext(){ return index<count; } public Student next() { return studens[index++]; } }; } } //lambda遍历klass1.forEach( System.out::println );
Comparable
- 可比较接口,有比较能力的实体直接实现
- compareTo(T t),小于t 返回负数,等于0,大于整数
- stu1.compareTo(stu2)
Compartor
- 提供比较策略,单独写个比较器类实现接口——>匿名内部类——>lambda
- compare(T t1,T t2);t1>t2 返回整数,等于返回0,小于返回负数
- equals()默认被父类Object实现了
- 策略模式
- 在需要保证顺序的集合中,存储的元素是具有比较能力
Cloneable,克隆
- 表示克隆能力,实体类中实现,不需要实现方法
- 重写Object父类 clone(),扩大范围为public,super.clone(),抛异常直接调用;native 方法效率更高?
-
浅拷贝,深拷贝
- 浅拷贝:简单类型(数值型,String)直接拷贝值,引用类型拷贝地址
- 深拷贝:全拷贝值,拷贝出独立的
- 所有 引用属性 都需要实现接口,改变
- 设计模式之原型模式
集合框架
-
处理若干元素(单个,键值对),也称容器
-
泛型JDK1.7提供钻石语法,前面写了<T>,后面就不用写<>中的内容
-
Collection:add、contians()调用equals比较判断、size、isEmpty、remove()删除所有和对象equals的元素、retain(保留,删除剩余)、Object[] toArray()、T[] toArray()
- List:ArrayList、LinkedList、Vector<—Stack
- ordered有序,索引定位,search,允许重复
- add(index,element),get(index),indexOf(),lastIndexOf(),remove(index),remove(obj)多个相同元素只会删一个,set(index,elment)修改,default void sort(Comparator<t> c),subList(fromIndex,toIndex)
- index不能越界
- Set:HashSet、TreeSet...
- Queue
- Deque
- List:ArrayList、LinkedList、Vector<—Stack
-
Map
- HashMap:很复杂。。。
- Hashtable...
2019.8.14
LinkedList
- 实现了List,Deque,双向循环链表
。。数到三cut。。。。。。。。。
Vector
- 实现和ArrayList差不多
- 加锁,线程安全
区别
- ArrayList、Vector数组实现,连续存储;LinkedList双向循环链表
- 数组查询快,增删链表快
- Vector线程安全,效率低,有其它替代方案(JDK1.5)
HashSet
- 数学集合;不可重复;无序
- hashMap实现
- equals 和 hash比较重复,重复添加返回false
- 重写equals()时,同时重写hashCode()
- 快速去重 HashSet(Collection c)
TreeSet
- 基于TreeMap实现,红黑树,自平衡二叉查找树,左边小右边大
- 保证顺序,元素实现了Comparable,或者构造时传入Comparator
Map
-
put(key,value),get(key)
-
put key相同(hash和equals),会更新value
-
Collection values(),获取所有值,Set keySet()所有键
-
Set< Map.Entry<K,V> > entrySet()所有获取键值,遍历
for(Map.Entry<K,V> m: map.entrySet) { System.out.print(m.getKey()+":"+m.getValue()); } for(K key:map.keySet()) { System.out.print(key+":"+map.get(key)); } // lambda遍历 map.forEach((key, value) -> { System.out.println(key + ":" + value); });
-
Hashtable,和HashMap区别
- Hashtable 加锁线程安全,效率低
- Hashtable的 键值 都不能为null,HashMap可以,会对hash值赋0
- HashTable继承了Dictioary类(已遗弃),HashMap继承AbstractMap
- HashMap的初始容量为16,Hashtable为11,负载因子都为0.75
- 迭代器不同,Map为Iterator,table为Enumerator,map迭代是修改元素会报错,table不会
-
Properties
-
Hashtable的子类;键值都是String
-
Store(oStream):存入文件;load(iStream,String 注释 ):载入配置
-
文件采用 .properties 格式
-
它是唯一一个能与IO流交互的集合,load(InputStream in)。。。
Properties prop=new Properties(); prop.setProperty("key","value"); // ... // 创建流 FileWriter out=new FileWriter("prop.properties"); prop.store(out,"注释信息");// 存入文件 out.close();// 关闭流 /* * 载入 */ // 创建流对象 FileInputStream in = new FileInputStream("prop.properties"); // FileReader in = new FileReader("prop.properties"); prop.load(in);// 载入文件 in.close();// 关闭流 System.out.println(prop);
-
-
Collections
-
void reverse(List list):反转
-
void shuffle(List list):随机排序,洗牌
for (int i=size; i>1; i--) swap(list, i-1, rnd.nextInt(i));//
-
swap(list,int,int):交换list两个位置的元素
-
void sort(List list):按自然排序的升序排序,void sort(List list, Comparator c)
-
void swap(List list, int i , int j):交换两个索引位置的元素
-
void rotate(List list, int distance):旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面
-
异常
2019.8.15
Throwable父类 :Exception,Error
Exception:
-
RuntimeException,IOException,SQLException...
-
可以捕获处理的
-
RuntimeException:
-
属于运行时异常(非受检unchecked异常)
其他异常为受检异常(checked),必须处理
-
IndexOutOfBoundsException、ClassCaseException,NullPointerException...
-
关键字
-
try catch finally
- 可以多重catch,按顺序catch
- finally 正常异常都会执行,一般用于关闭资源(File,DateBase)
try{ } catch(ArrayIndexOutOfBoundsException e){ // e.printStackTrace(); 定位错误 }catch(ClassCaseException e){ }catch(Exception e){ }finally{ } // JDK7 一个catch里多个异常时候 try{ }catch(IOException|ClassNotFoundException e){ } // 也可以只有try finally try{ }finally{ }
-
throw 一般在方法中,发生异常时,抛出一个异常实例
-
throws 用户方法声明时,表示该方法可能抛出异常,可以抛出多个
受检异常于非受检异常区别
- 受检异常,必须处理或者抛出
- 非受检异常,语法上可以不处理
自定义异常
- 继承Exception 或者RunTimeException
- 实现所有父类构造方法
try catch的坑
- 如果程序是从try代码块或者catch代码块中返回时,finally中的代码总会执行。而且finally语句 在return语句执行之后** ,return返回之前 执行的。
- finally 中有返回的时候,会返回finally中的,编译器会警告
function1()
{
try{
return 1; // 1/0
}catch{
return 2;
}finally{
return 3;
}
//都会返回3;
}
- 如果try和catch的return是一个变量时且函数的是从其中一个返回时,后面finally中语句即使有对返回的变量进行赋值的操作时,也不会影响返回的值。
function2()
{
int x=1; // Object obj=new Object();
try{
return x;
}catch{
return x+1;
}finally{
++x; // obj=null;
}
return x; // 返回1; 返回obj不为空
}
try-with-resources
try(
InputStream is = new FileInputStream("...");
OutputStream os = new FileOutputStream("...");
){
// ...
}catch(Exception e){
}
// 自动关闭
- try块退出时,会自动调用res.close()方法,关闭资源。
- 语法:try()的括号中可以写多行声明,每个声明的变量类型都必须是Closeable的子类,用分号 ’ ; ‘ 隔开。就不需要finally了
- Java 7 的编译器和运行环境支持新的 try-with-resources 语句,称为 ARM 块(Automatic Resource Management) ,自动资源管理。带有resources的try语句声明一个或多个resources。resources是在程序结束后必须关闭的对象。try-with-resources语句确保在语句末尾关闭每个resources。任何实现java.lang.AutoCloseable,包括实现了java.io.Closeable的类,都可以作为resources使用
BigDecimal
- 构造用String更精确,double还是不精确
Eclipse
- 选中代码,右键重构(refactor),生成方法(extract method)
- Ctrl+Shift+T,查找类,包括源码
IO
2019.8.16
操作文件系统;操作流:文件内容,网络编程
File类
-
File.separator,分割符常量,目录的 ’ \ ‘ 或者 ‘ / ’
-
相对路径,相对java项目根目录的路径
-
isFile,isDirectory
-
String[] list():得到文件夹里的文件名 ,目录名
-
File[] listFiles():获取文件,和目录
-
mkdir(),已存在返回false,只能创建单层目录;mkdirs()创建多层次目录
-
createNewFile() ;deleteOnExit()程序退出时删除
-
打开本地文件夹弹窗
Runtime.getRuntime().exec("cmd /c start explorer D:\\");
InputStream,OutputStream
-
FileInputStream:read(byte[] data,int start,int length),读
-
FileOutputStream:write(byte[] data,int start,int length),写
-
close也会异常
File file=new File("E:\\FileTest\\1.txt"); File file2=new File("E:\\FileTest\\1.txt"); Byte[] data=new Byte[1024]; int len=0; try( // 构造也可以是string InputStream is=new FileInputStream(file); // 执行这句话就会创建文件 OutputStream os=new FileOutputStream(file2); ){ // 写入 流,流过就没了,read会从刚才位置开始,读入data while( (len=is.read(data,0,data.length)) !=-1 ) { os.write(data,0,len); } }catch(Exception e){ e.printStackTrace(); }
Reader,Writer
- BufferReader(Reader r),BufferWriter(Writer w)字符独写,兄弟类FileWriter,FileReader,去构造
- 装饰器模式
Serializable
-
可持续化接口:内存对象持久化,RMI远程方法调用
-
对象写入硬盘,从硬盘读取对象
-
transient ,瞬时 标记后不能持久化
-
priavte static final long seriVersionUID,版本号,不加版本号,有默认版本号,修改class之后,两次版本号不同,反序列化会出错。保证反序列化版本一致。
-
ObjectOutputStream ( FileOutputStream(String)).writeObject(obj)
ObjectInputStream ( FileInputStream(String)).redaObj()
TODO
excel独写,断点续传
2019.8.17
Runtime
-
查看内存,硬盘,系统监控
-
exec 调用命令行
RandomAccessFile
- 随机访问文件,从文件任意位置访问
网友评论