Java : java基础(2) 集合&正则&异常&File类
Obj 方法: hashCode() 返回内存地址值, getClass() 返回的时运行时类, getName() 返回类名, toString() 把名字和
hashCode() 合在一起返回,如果直接输出对象,返回的就是这个东西, equals() 比较两个对象的地址值是否相等.
== 比较基本数据类型比较的是值,比较引用数据类型比较的是地址值,如果不重写equals方法,那么==和equals是一样的,但是有的类比如String重写了equals方法,那么比较的就是里面的值而不是地址值了.(String 类型无论==和equals都是比较值,因为如果常量池中存在了这个字符串,那么如果再次使用的话就直接用,String 类型的字符串是无法改变的)
-127 -- +128 是byte 的取值范围,如果 Integer 类型包装的int值在这个范围内,那么就不会新创建对象,而是直接从常量池获取.
如果一个字符串作为正则表达式的时候,那么转义. 或者 d 这种匹配符号要用两个 \\ 因为首先编译器会转义一次,把 \\转义为\
正则表达式引擎会再转义一次,把\. 转义为. 表示任意字符
Pattern p = Pattern.compile(regex); //p是一个正则表达式
Matcher m = p.matcher(s); // m 是一个编译器,用p去匹配s字符串
while (m.find()) {m.group()} // 先用find()方法寻找,如果找到了,可以用m.group() 把匹配到的字符串提取出来 这样可以循环取出所有匹配的的字符串(m.find()寻找的是子序列,即不是完全匹配.字符串的matches()方法是完全匹配,即整个字符串要完全匹配整个正则表达式)
BigDecimal,可以用它来进行精确的小数计算,前提是构造的时候必须要在构造方法中传入字符串类型的小数,不能直接传入float和double.如果非要传入小数类型的话,那么可以用 BigDecimal.valueOf() 这种方法构建一个BigDecimal数
如果想要获得年或者月或者日之类的时间,那么建议使用Calendar类,里面取代了Date类大部分关于年月日的方法.
java的集合(Collection)框架下的类如ArrayList只能存放引用数据类型,基本数据类型在直接往里面存的时候会先包装成包装类然后存进去.
泛型里面只能写引用数据类型,不能写基本数据类型.
泛型可以加在类的定义上,如 public class Stu<E> 这样的话,如果类里面的方法是 public E getxxx() 这种类型的话,那么创建类的时候给E泛型赋了什么类型,方法就返回什么类型,也可以用在方法的形参里面.
如果类里面的某个方法需要单独加泛型那么可以用 public<T> void show(T t) 这种方法声明方法的泛型,这样调用这个方法传递参数的时候,传递的参数是什么类型,T就是什么类型.静态方法必须要用这种方式声明泛型,因为类的泛型的类型0是在创建类的对象的时候进行声明,而静态方法不需要创建对象就能调用.
<?> 是泛型通配符,他可以表示任意类型,如在创建数组时 : List<?> list = newArratList<String> 当右边的泛型不确定时,可以在左边的泛型里面填入?, <? extends E> 表示E及其子类, <? super E> 表示E及其父类
增强型for循环可以简化数组和Collection集合的遍历,用迭代器实现.
对于遍历list想删除里面的元素,如果用普通for循环可以用i--的方式来处理如果相邻两个元素都要删除的情况,迭代器可以用本身的remove()方法,增强for循环则不能删除,会出现并发修改异常,还有一种更简单的方式 list.removeIf()里面传入一个lambda表达式返回boolean类型的返回值就可以,会一次性清除集合或列表里面所有lambda返回true的元素.
如果必须要使用强制类型转换,可以先判断一下字节码文件是否相同,如一个对象为 Object obj,强制转换成Person类型,可以这样判断 if (obj.getClass() == Person.class) 或者是 if(obj instanceof Person)
在Set集合里面存自定义对象时,需要重写hashCode()和equals()方法,一般可以用IDE自动生成.
TreeSet可以让集合拥有排序的功能,如果需要存储自定义对象的话,那么对象的类需要实现Comparable接口,重写compareTo()方法,如果compareTo返回0,那么集合中只有一个元素,返回正数集合怎么存怎么取,返回负数则倒叙存储. 这种特性和TreeSet的底层存储是有关系的,底层存储用的是二叉树,如果比根小就存在左边,如果比根大就存在右边,取的时候从小往大取,就出现了这一特性. 取出的时候按照二叉树的中序遍历即可按顺序取出.
Map遍历可以用 map.keySet()获取所有键的Set集合,然后遍历取出值,也可以用map.entrySet() 获取一个里面的对象是Map.Entry类型的Set集合,里面的每一个对象都是实现了Map.Entry接口的对象,可以用getKey() 和 getValue()取出键值对
如果要抛出(throw)编译时异常,那么必须要对它进行处理,要么catch处理,要么throws往上一层抛出,而RuntimeException则可以处理也可以不用处理.
throws表示抛出异常,用在方法声明后面,由该方法的调用者处理,throw表示抛出异常,用在方法体内,由方法体内语句处理.
finally是无论是否有异常,都会执行的,而且如果catch里面有return语句,那么return之前也会执行finally里面的语句(确切的说应该是在return建立返回路径之后,还未完全return之前执行finally,所以如果这时候在finally里面修改返回的值,那么是无效的),如果catch里面退出了jvm虚拟机,则finally不会执行.
如果需要自定义异常,只需要继承Exception然后重写有参无参构造方法就可以了.
新建文件路径用File类 创建文件用 createNewFile()方法,创建目录用mkdir()方法.重命名或者剪切文件用renameTo()方法,删除文件或目录用delete()方法,isDirectory判断是否是目录,isFile判断是否是文件,exists判断是否存在,canRead判断是否可读,canWrite判断是否可写,isHidden判断是否隐藏(Windows文件不能用setReadable设置不可读,但是可以用setWritable设置是否可写),用getAbsolutePath获取绝对路径,getPath获取路径,getName获取名称,length长度,lastModified最后修改时间,list获取目录下所有文件和文件夹.