linklist的特有方法
public static void main(String[] args) { Set<String> set = new HashSet<String>(); // 对迭代顺序不做保证 set.add("hello"); set.add("world"); set.add("world"); // 不包含重复元素 set.add("java"); for(String s :set) System.out.println(s); }
插入图片描述](https://www.www.zyiz.net/i/ll/?i=47cda787bed04956b359fb1b8f974434.png)
就是让所属类实现Comparable接口,重写compareTo(T o)方法。
public class Student implements Comparable<Student>{ private String name; private int age; public Student(){ System.out.println("无参构造方法"); } public Student(String name,int age){ this.name = name; this.age = age; System.out.println("有残构造方法"); } public void setName(String nanme) { this.name = name; } public String getName(){ return name; } public int getAge(){return age;} public void setAge(int a) { age = a; } public void show(){ System.out.println(name+"_" + age); } @Override public int compareTo(Student s) { int num = this.getAge() - s.getAge(); int num2 = num == 0?this.getName().compareTo(s.getName()):num; return num2; } }
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { int num = o1.getAge() - o2.getAge(); int num2 = num==0?o1.getName().compareTo(o2.getName()):num; return num2; } });
如果没有传入类型的话,将默认为Object的类型。
public class Generic<T> { private T t; public T getT(){ return t; } public void setT(T t) { this.t = t; } }
主函数使用
Generic<Integer> g2 = new Generic<Integer>(); g2.setT(30); System.out.println(g2.getT());
举个例子
public <T> void show(T t){ System.out.println(t); }
// 接口 public interface GenericInterface<T>{ void show(T t); } //接口实现 public class GenericInterfaceImpl<T> implements GenericInterface<T>{ @Override public void show(T t) { System.out.println(t); } } //测试例中实例对象 GenericInterface<String> gg = new GenericInterfaceImpl<String>(); gg.show("hello");
// 下面这行代码报错,因为他的上限是Number,所以他不能是Number的父类 //List<? extends Number> list4 = new ArrayList<Object>(); List<? extends Number> list5 = new ArrayList<Number>(); List<? extends Number> list6 = new ArrayList<Integer>(); // 限定下限 List<? super Number> list7 = new ArrayList<Object>(); List<? super Number> list8 = new ArrayList<Number>(); // 下面这行代码报错,反正就是报错 //List<?super Number> list9 = new ArrayList<Integer>();
最后一行的意思其实就是:
sum(int b,int... a);
//a其实是个数组:调用方法 sum(10,20,30,40); public static int sum(int... a){ int sum = 0; for(int i:a) sum+=i; return sum; }
List<String> list = Arrays.asList("hello","world","java"); //不能增、删 // list.add("jaa"); // list.remove("world"); list.set(0,"ss"); List<String> list2 = List.of("hello","world","java"); // 注释的是都不能执行的,他们不能增删改 // list2.add("jaksdf"); //list2.remove("asdf"); //list.set(0,"ssa"); Set<String> set = Set.of("hello","world","java"); // 也是不能add remove
public static void main(String[] args) { Map<String,String> map = new HashMap<String,String>(); map.put("aaa","111"); map.put("bbb","222"); map.put("ccc","333"); System.out.println(map); System.out.println(map.remove("aaa")); System.out.println(map.containsKey("bbb")); System.out.println(map.isEmpty()); System.out.println(map.size()); map.clear(); System.out.println(map); }
Map集合的获取功能
//1. 获取所有键的集合 Set<String> keySet = map.keySet(); for(String key:keySet){ String value = map.get(key); System.out.println(key+","+value); } //2.遍历方式2 Set<Map.Entry<String,String>> entrySet = map.entrySet(); for(Map.Entry<String,String> me :entrySet){ String key = me.getKey(); String value = me.getValue(); System.out.println(key+","+value); }
collection是单列集合的顶层结构,collections是具体的类
List<Integer> list = new ArrayList<Integer>(); list.add(30); list.add(20); list.add(10); list.add(40); list.add(50); Collections.sort(list); Collections.reverse(list); //反转 Collections.shuffle(list); // 随机置换 常用于模拟洗牌
对类进行排序
通过使用指定的比较器来进行排序。
List<Student> array = new ArrayList<Student>(); Collections.sort(array, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { int num = o1.getAge() - o2.getAge(); int num2 = num==0?o1.getName().compareTo(o2.getName()):num; return num2; } });
File类的创建功能
File类判断和获取功能
File f1 = new File("/home/usr/Code/JavaCode/test.txt"); System.out.println(f1); File f2 = new File("/home/usr/Code/JavaCode","test.txt"); System.out.println(f2); File f3 = new File("/home/usr/Code/JavaCode"); File f4 = new File(f3, "text.txt"); System.out.println(f4); //创建文件 public static void main(String[] args) throws IOException { File f1 = new File("/home/usr/Code/JavaCode/test1.txt"); System.out.println(f1.createNewFile());//文件若不存在就创建文件并返回true,否则返回false File f2 = new File("/home/usr/Code/JavaCode/mkdirtest"); System.out.println(f2.mkdir());//目录若不存在就创建文件并返回true,否则返回false System.out.println(f2); File f3 = new File("/home/usr/Code/JavaCode/mkdirtest1/mkdirtest2/mkdirtest22"); System.out.println(f3.mkdirs()); File f4 = new File(f3, "text.txt"); System.out.println(f4); System.out.println(f1.mkdir()); // 这个时候将创建一个目录,即使文件名给的是test1.txt } //File类的常见功能 File f1 = new File("test3.txt"); System.out.println(f1.createNewFile()); System.out.println(f1.isDirectory()); System.out.println(f1.isFile()); System.out.println(f1.exists()); System.out.println(f1.getAbsoluteFile()); System.out.println(f1.getPath()); System.out.println(f1.getName()); File f2 = new File("idea_test/src/ArraysPkg"); String[] strArry = f2.list(); for(String str:strArry){ System.out.println(str); } File[] f3 = f2.listFiles(); for(File file:f3){ System.out.println(file);//输出了绝对路径 } //删除文件 File f1 = new File("test1.txt"); System.out.println(f1.createNewFile()); System.out.println(f1.delete()); // 创建目录 File f2 = new File("test"); //System.out.println(f2.mkdir()); File f3 = new File("test/test1.txt"); //System.out.println(f3.createNewFile()); // 若要删除的目录下有内容,应该先把内容给删了,再删目录 System.out.println(f2.delete());
递归遍历文件名
public static void main(String[] args) { File srcFile = new File("idea_test"); getAllFilePath(srcFile); } public static void getAllFilePath(File srcFile){ File[] fileArray = srcFile.listFiles(); if(fileArray !=null){ for(File file:fileArray){ if(file.isDirectory()){ getAllFilePath(file); } else{ System.out.println(file.getAbsolutePath()); } } } }
字节流写数据
// 创建字节输出流对象:1.调用系统功能创建了文件;2.创建了字节输出流对象;3.让字节输出流对象指向文件 FileOutputStream f1 = new FileOutputStream("test.txt"); f1.write(95); f1.close(); // 释放
字节流写数据的三种形式、追加写入、换行
public static void main(String[] args) throws IOException { // 第二个参数为true,可以让文件的每次写入都写入到末尾,而不是开头 FileOutputStream f1 = new FileOutputStream("test2.txt",true); f1.write(97); f1.write(98); f1.write(99); f1.write(100); f1.write(101); byte[] bys = {97,98,99,100,101,102,103}; byte[] bys2 = "abcde".getBytes(StandardCharsets.UTF_8); f1.write(bys); f1.write(bys2,0,3);//从0开始,写入长度为3的数据 f1.write("\n".getBytes(StandardCharsets.UTF_8)); // 实现换行,windows下需要\r\n f1.close(); }
字节流数据异常处理
public static void main(String[] args) { FileOutputStream f1 = null; try { // 创建字节输出流对象:1.调用系统功能创建了文件;2.创建了字节输出流对象;3.让字节输出流对象指向文件 f1 = new FileOutputStream("test.txt"); f1.write(95); f1.close(); // 释放 }catch (IOException e){ e.printStackTrace();; } finally { if(f1 !=null){ // z执行清除操作,防止write异常后,无法成功退出 try{ f1.close(); }catch (IOException e){ e.printStackTrace(); } }}
字节读数据(单字节读入和循环读入)
FileInputStream f1 = new FileInputStream("test2.txt"); int by = f1.read(); System.out.println(by); System.out.println((char)by); //如果达到文件末尾,输出-1 while((by =f1.read())!=-1){ System.out.println((char)by); } f1.close();
字节读输入2
FileInputStream f1 = new FileInputStream("test2.txt"); byte[] bys = new byte[5]; // 一次读取5个数据,f1.read()返回实际读取的个数 int len = f1.read(bys); System.out.println(len); System.out.println(new String(bys,0,len)); // 循环读取 byte[] bys1 = new byte[1024]; int len2; while ((len2=f1.read(bys))!=-1){ System.out.println(new String(bys,0,len2)); } f1.close();
字节缓冲流读写数据
// FileOutputStream fos = FileOutputStream("test2.txt"); BufferedOutputStream bos= new BufferedOutputStream(new FileOutputStream("test2.txt")); //write data bos.write("hello".getBytes(StandardCharsets.UTF_8)); bos.write("world\r\n".getBytes(StandardCharsets.UTF_8)); bos.close(); BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test2.txt")); int by; while((by=bis.read())!=-1){ System.out.println((char)by); } //第二种方式 byte[] bys = new byte[1024]; int len; while((len=bis.read(bys))!=-1){ System.out.println(new String(bys,0,len)); } bis.close();
String s = "中国"; byte[] bys = s.getBytes(StandardCharsets.UTF_8); // [-28, -72, -83, -27, -101, -67] byte[] bys2 = s.getBytes("GBK"); // [-42, -48, -71, -6] System.out.println(Arrays.toString(bys2)); String ss = new String(bys); // 解码 System.out.println(ss);
注意保证读写流的编码应该相同。
FileOutputStream fos = new FileOutputStream("test.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8"); osw.write("中国!!!!!!!!"); osw.close(); InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8"); int ch; while((ch=isr.read())!=-1){ System.out.println((char)ch); } isr.close();
字符流写数据的5中方式
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("test.txt")); osw.write(97); // osw.flush(); //刷新流 刷新到文件里,或者等到close执行完,close执行先刷新再关闭的 char[] chs = {'a','b','c','d','e'}; osw.write(chs); osw.write(chs,0,2); osw.write("hello"); osw.write("helllllllo",0,5); osw.close();
字符流读数据的两种方式
和字节流读数据的方式是相同的
InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt")); //way 1 int ch; while((ch=isr.read())!=-1){ System.out.println((char)ch); } //way 2 char[] chs=new char[1024]; int len; while((len=isr.read(chs))!=-1){ System.out.println(new String(chs,0,len)); } isr.close();
在P297中还提到了FileReader和FileWriter,不写了。。
FileWriter fw = new FileWriter("test.txt"); BufferedWriter bw = new BufferedWriter(fw); bw.write("hello\r\n"); bw.write("world"); bw.newLine(); bw.close(); BufferedReader br = new BufferedReader(new FileReader("test.txt")); String ss = br.readLine(); char[] chs = new char[1024]; int len; while((len=br.read(chs))!=-1){ System.out.println(new String(chs,0,len)); } br.close();
字符缓冲流的特有功能
String ss = br.readLine(); //读取一行只读内容,不读换行的符号
bw.newLine(); //换行 最好使用这种方式,而不是\r\n
一种新的读取方法
String line; while((line=br.readLine())!=null){ System.out.println(line); }
in,out
InputStream is = System.in; /* int by; while((by=is.read())!=-1){ System.out.println((char)by); }*/ //上面的方法不能读入中文 InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); System.out.println("请输入一个字符串,含中文也行"); String line = br.readLine(); System.out.println("你输入了:" + line); System.out.println("请输入一个整数:"); int i = Integer.parseInt(br.readLine()); System.out.println("你输入的整数是" + i);
out
PrintStream ps = System.out; ps.print("hello"); ps.print(100); ps.println("hello"); ps.print(100); ps.close();