JavaSE基础07(集合,IO流)
- 集合collection
数组存放数据的弊端:- 数组定义后长度不可变;
- 定义数组的类型不能变,数据只能存放指定类型的对象;
- 解决数组存放的弊端方法:
- 摒弃小数组,换一个更大的来存放(动态数组扩容);
- 数组定义成Object,可以存放所有的类型;
- 集合扩容 在原来的基础上+>>1;
- 摒弃小数组,换一个更大的来存放(动态数组扩容);
- System.arraycopy(Object src,int srcPos,Object dre,int destPos,int length);
- 数组的复制参数: (原数组 原数组开始复制的位置 目标数组 从哪个位置开始粘贴到目标数组 复制数组的个数);
-

- ArrayList
- ArrayList list=new ArrayList(); 首先创建ArrayList对象;
- list.add() ,往集合里添加元素或 list.add(要添入的位置,添入数组);
- list.set(要修改的位置,修改的值); 修改数据
- list.remove(要删除元素的下标)或list.remove(要删除的元素);
- list.get(下标值)查数据;
- 有序集合,进出数据是一样的;
- 扩容:默认容量是10, 当已经达到了最大值的大小,扩容原来的1.5倍;
- 遍历集合方法
- 迭代器
ArrayList list=init();//init()方法返回的ArrayList //迭代器 用于遍历集合的每一个元素 Iterator it=list.iterator(); //是否有下一个数据 while (it.hasNext()){ //获取下一个数据 Object obj=it.next(); System.out.print(obj+","); }
-
把集合放在数组里,然后遍历数组;
Object[] arr=list.toArray();//把集合放在Object数组里 System.out.println(Arrays.toString(arr));//打印数组
- 迭代器
- LinkedList
- LinkedList是双向链表;
- 查找ArrayList更优;
- 插入和删除LinkedList更优;
- Set集合
- 无序集合,不能存在重复的数据;
- 使用equals方法验证数据是否相等;
- Set的底层就是Map;
- 遍历set集合;
for(Object obj:set) {//把每一个都赋给obj System.out.println(obj); }
- 验证set里面有没有这个元素 返回的是布尔值;
boolean b =set.contains("张三");//验证set里面有没有这个元素 返回布尔类型 System.out.println(b);
- HashSet
- 可以存储null值,只能存储一个;
- 主要用于安全验证上;
- TreeSet
- 排序集合,但是也是无序集合;
- 不可以存储null值,null不可以比较;
- 存的数据都是可比较的,尽量存同类数据;
- 数据结构是红黑树;
- Hashtable
- 是一个线程安全的键值对集合 不能存key和value都不能是null值;
- Map集合(有键值对)
- HashTable (线程安全) 效率慢:锁的颗粒度大
- concurrentHashMap (线程安全)效率较快:锁的颗粒度较小
- HashMap (线程不安全)
- 存储过程
- HashMap使用数组+链表以及红黑树的方式存储数据;
- HashMap的数组默认长度16,需要根据key算出节点存放的下标位置index;
- 判断index位置已经有对象:如果没有,直接把要存放的key和value放到这个位置上;
- 如果已经有元素存在,就在这个链表上查找和要存储的key相同的节点;
- 如果没有找到,就把key和value组成节点放到链表最后;
- 如果找到,就替换;
- 扩容机制
- HashMap的初始容量是16;
- 扩容阈值是0.75;
- 何时扩容:
- HashMap中存储的数据个数超过数组长度*0.75,就要扩容;
- 如果单个链表的长度超过8,但是数组的长度没有超过64,就扩容;
- 何时树化:
- 单链长度超过8,数组长度超过64(包含)才进行树化;
- 哪个链超过了阈值就哪个链树化;
- 如果树化后的节点数小于6,就退树化,变成链表;
- 用数组和链表存储数值;
- 要用时要实例化Map对象; Map map = new HashMap();
- 添加数据 map.put(key,value);
- 删除数据 map.remove(key); Object obj1=map.get(2001); 返回删除值;
boolean b=map.remove(2001, "张三");//防止误删
- Map中的key不能重复,如果重复就把原来的值替换了;
- map的遍历
- 获取所有的key
Set keys=map.keySet(); for(Object item:keys) { System.out.println(item+"="+map.get(item));//get获取集合的value }
- 获取所有的value
Collection con=map.values(); for(Object val:con) { System.out.println(val); }
- 获取所有的key
- 泛型
-
在定义类方法时,声明一个泛型,比如<E>开代表任意的一个类型;
- 在类中声明的泛型,在整个类中都可以直接使用;
- 保证数据类型安全 避免出现ClassCastException;
- 方法泛型的 类型:
-
E obj; public E getObj(E e) { return obj; }
-
public static <R> R getInstace(R r) { return r; }
-
- 泛型的使用:
public static <R> R getInstace(R r) { return r; } public static void main(String[] args) { // ArrayList getInstace(12); List<Integer> list =new ArrayList<Integer>();//规范使用Integer类型,不然添加不进去,保证数据类型安全,在编译时起到作用 for(int i=0;i<100;i++) { int item=(int)(Math.random()*80+10); list.add(item); } // list.add("123"); int sum=0; for(Object obj:list) { Integer i =(Integer)obj; sum+=i; }System.out.println(list); System.out.println(sum); }
- IO流
文件
- File 新建文件File file=new File("文件路径 ");
- 判断文件是否存在
boolean b=file.exists();//判断文件是否存在 if(b==true) { System.out.println("文件存在"); }else { System.out.println("文件不存在"); }
- 创建文件夹
File file1=new File("D:\\hello"); boolean b1=file1.mkdir();//只能创建一级文件夹 mkdirs()可以创建多级文件夹 if(b1) { System.out.println("创建成功"); }else { System.out.println("创建失败"); }
- 创建文件
try { boolean b1=file.createNewFile(); } catch (IOException e) { System.out.println("创建文件中断"); e.printStackTrace(); }
- 删除文件或文件夹
file.delete();// 删除文件或删除文件夹
//递归删除if(file.isDirectory()){//判断file是不是文件夹
File[] arr=file.listFiles();//把文件夹下的目录赋给文件夹数组
for(File f:arr){//遍历数组,把每个元素赋给f
delete(f);//把f再传入delete方法,一直到文件夹下不包括文件
}
}
file.delete();//当遇到空元素跳出if
} -
获取文件夹的文件
- IO流
- 创建流对象 FileReader();
- 字节流:
- InputStream is; //字节输入流;
- OutputStream od; //字节输出流;
- 字符流只能读取文本文件,或文本内容 txt html java propertis css js xml yml ;
- InputStream is; //字节输入流;
- 字符流:
- Reader r; //字符输入流;
- Writer w; //字符输出流;
- 字节流可以读取任何数据 word jpeg 图片 音频 视频文件;
- Reader r; //字符输入流;
- 读取文件中的数据
File src=new File("c:\\java\\java.txt");//源文件 //输入流 FileReader fr=null; try { fr=new FileReader(src);//创建流对象 char[] arr=new char[64];//读取数据的容器 int length=fr.read(arr);//读取一次数据 读到的数据放到arr数组中 System.out.println(Arrays.toString(arr)); String str =new String(arr,0,length);//将读取到的数据转成字符串 System.out.println(str);
- 最后要关流,在finally中
try { fr.close(); } catch (IOException e) { e.printStackTrace(); }
- 读取文件中的大量数据(while循环);
File file=new File("c:\\java\\java.txt"); FileReader fr=null; try { fr=new FileReader(file); int length=0;//每次读取数据的个数 char[] arr=new char[18]; while((length=fr.read(arr))!=-1) { String str=new String(arr,0,length); System.out.println(str); }
- 把数据写入到文件中;
String str="作者是李白"; //将str内容写出到d:\java\easy.txt文件中 //声明文件对象 File file =new File("d:\\java2\\java.txt"); //使用文件字符输入流 ,将内容写出 FileWriter fw=null; try{ fw=new FileWriter(file,true);//true是否追加 fw.write(str);//把str写入fw }catch(Exception e) { e.printStackTrace(); }finally { //关闭流
- 文件复制,(先读取再写入) ,(读入用于读入数据和将数据读取到容器的次数),(length用于判断是否读完和为写入数据提供参数);
//复制文件 public static void main(String[] args) { File src=new File("c:\\java\\java.txt"); File dest=new File("d:\\java2\\java.txt"); //将src的内容复制到dest中 char[] arr=new char[64];//使用arr存放每次读取的内容 int length=0;//每次读取数据的个数 FileReader fr=null; FileWriter fw=null; try { //将src中的内容读入程序 输入流 fr=new FileReader(src); //将读到的内容写进dest文件 输出流 fw=new FileWriter(dest); //每次读取的数据长度赋值给length 读取完毕返回-1 while((length = fr.read(arr))!=-1) { fw.write(arr,0,length); } }catch(Exception e){ e.printStackTrace(); }finally {// 关流 先关读流再关写流
- 图片的复制,(用到字节流,容器用byte[ ]);
// InputStream is;//字节输入流 // OutputStream os;//字节输出流 public static void main(String[] args) { File src=new File("c:\\java\\123.jpeg"); File dest=new File("d:\\java2\\3.jpeg"); byte[] b=new byte[64]; int length=0; FileInputStream is=null; FileOutputStream os=null; try { is=new FileInputStream(src); os=new FileOutputStream(dest); while((length=is.read(b))!=-1) { os.write(b,0,length); } }catch(Exception e) { e.printStackTrace(); }finally {
- 缓冲读入文件(先在缓冲区多行读入,再用while循环把每一行数据复制给String str ,判断条件是str是否为null)
File file =new File("c:\\java\\java.txt"); FileReader fr=null; BufferedReader br=null; // BufferedInputStream try { fr=new FileReader(file); br=new BufferedReader(fr);//缓冲区 String str=null; while(true) { str=br.readLine(); if(str==null) { break; } System.out.println(str); }//捕获异常 再关流
- 缓冲写出文件,(先把数据写到缓冲区,当缓冲区写满时或读到最后刷新到文件上);
BufferedWriter bw=null; FileWriter fw=null; File file =new File("d:\\java2\\java.txt"); try { fw=new FileWriter(file); bw=new BufferedWriter(fw); bw.write(str); //缓冲输出流,执行完毕之后需要执行flush方法 bw.flush(); }catch(Exception e){ e.printStackTrace(); }finally { //关流 先关bw流再关fw流
-
序列化,(将对象转换成有效序列(二进制)的过程) Student必须实现序列化接口 (文件输出流,序列化流,oos.writeObject(stu))
Student stu=new Student(12,"张三","男"); String filename="d:\\java2\\obj.txt"; FileOutputStream fos=null; ObjectOutputStream oos=null; try { fos=new FileOutputStream(filename); oos=new ObjectOutputStream(fos); oos.writeObject(stu); }catch(Exception e){ e.printStackTrace(); }finally {//关流 先关oos流再关fos流
Student implements Serializable //Student必须实现序列化接口 - 反序列化, (反序列化:将有效序列转化成对象的过程),和序列化对应的是Object obj=ois.readObject(); 然后再判断Object是不是Student,如果是再强制转换;
String filename="d:\\java2\\obj.txt"; FileInputStream fis=null; ObjectInputStream ois=null; try { fis =new FileInputStream(filename); ois=new ObjectInputStream(fis); Object obj=ois.readObject(); if(obj instanceof Student){ Student student=(Student)obj; System.out.println(student); }//捕获异常 再关流
浙公网安备 33010602011771号