Java学习第十五天

1.Map:独立的接口

    ---HashMap:使用的是哈希表,保证键不重复依据: int hashCode() boolean equals(Object obj)

    ---TreeMap:使用的是二叉树,根据键排序,Comparable<E> int compareTo(E e) Comparator<E> int compare(E e1,E e2)

    注意:compareTo()或compare方法返回值为0则认为是相同的键

2.数组转字符串:
  Arrays.toString()
  例:int[] arr={2,4,5,6,7,8};
  String ss = Arrays.toString(arr);

3.数组转集合:

  Arrays.asList()
  缺点:数组转成的集合不能添加或删除数据,不能扩容
  例:String[] arr2 = {"hello","haha","hehe"};
  List<String> list=Arrays.asList(arr2);

  目的:可以利用集合集合的丰富的方法


4.集合转数组

  Object[] toArray()
  <T> T[] toArray(T[] a)

  注意:
    1.给定的数组长度大于集合大小,使用给定的数组
    2.给定的数组长度小于集合大小,会创建一个新的数组并返回
    3.给定的数组长度最好和集合的size相同
    例:String[] arr=list.toArray(new String[list.size()]);
  目的:当不希望对数据进行随意增删时

 5.集合的工具类:

  <T extends Comparable<? super T>> void Collections.sort(List<T> t)

Collections.sort(List<T> t)
Collections.sort(List<T> t,Comparator c)
Comparator Collections.reverseOrder()
Collections.max(Collection list)
Collections.reverse(List list);

 1 例子:
 2 import java.util.*;
 3 
 4 class ComByLeng implements Comparator<String>
 5 {
 6 public int compare(String s1,String s2){
 7 int n = s1.length()-s2.length();
 8 return n==0?s1.compareTo(s2):n;
 9 }
10 }
11 class Demo6 
12 {
13 public static void main(String[] args) 
14 {
15 //使用list集合,还要排序
16 //static <T extends Comparable<? super T>> void sort(List<T> list) 
17 
18 List<Student> list = new ArrayList<>();
19 list.add(new Student("lisi",21));
20 list.add(new Student("zhaosi",20));
21 list.add(new Student("wangsi",18));
22 
23 Collections.sort(list);
24 sop(list);
25 
26 List<String> list = new ArrayList<>(); //String implements Comparable
27 list.add("zwoieurowie"); 
28 list.add("wlksjioerwerwreserere");
29 list.add("alks");
30 
31 //Collections.sort(list);//用的是集合中对象默认的排序规则
32 //Collections.sort(list,Collections.reverseOrder()); //按字符串从大到小排序
33 //sop(list);
34 
35 //Collections.sort(list,new ComByLeng());//使用自定义的排序方式排序,按照字符串长度排序
36 //Collections.sort(list,Collections.reverseOrder(new ComByLeng())); //按字符串长度从长到短排序
37 //sop(list);
38 
39 //static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) 
40 //String max = Collections.max(list);//求集合中的最大值
41 //sop(max);
42 
43 Collections.reverse(list);//反转集合
44 sop(list);
45 }
46 public static void sop(Object obj){
47 System.out.println(obj);
48 }
49 }

6.集合中的对象不重复,有序:

  LinkedHashSet : Collections.synchronizedSet(new LinkedHashSet())

  LinkedHashMap : Collections.syncharonizedMap(new LinkedHashMap())
  注意:本身都是线程不安全的,但是可以Collections.synchronizedMap()方法定义线程安全的

 

例:
import java.util.*;
class Demo7 
{
public static void main(String[] args) 
{
//希望集合中的对象不重复,还希望有序

//使用了两种数据结构,为了实现数据的有序 123 123
//线程不安全的
LinkedHashSet<String> lhs = new LinkedHashSet<>();
lhs.add("java01");
lhs.add("java02");
lhs.add("java03");

//sop(lhs);

//创建线程安全的LinkedHashSet对象
Set<String> set=Collections.synchronizedSet(new LinkedHashSet<String>());
set.add("java05");
set.add("java06");
set.add("java07");

//sop(set);



LinkedHashMap<String,String> lhm = new LinkedHashMap<>();
lhm.put("name","lisi");
lhm.put("age","20");
lhm.put("address","shanghai");

//sop(lhm);

//创建线程安全的LinkedHashMap对象
Map<String,String> map = Collections.synchronizedMap(new LinkedHashMap<String,String>());
map.put("name","lisi");
map.put("age","20");
map.put("address","shanghai");

sop(map);


//SortedSet----TreeSet SortedMap----TreeMap
}


public static void sop(Object obj){
System.out.println(obj);
}
}

7.SortedSet ---TreeSet
 SortedMap ---TreeMap

8.增强的for循环:

  for(数据类型 变量名:被遍历的Collection集合或数组){}
  注意:对数组使用增强的for循环,不能操作下标


9.可变参数:数组的原理
  定义:void show(int ... a){}
  List<T> asList(T... a)

  注意:可变参数必须位于参数列表的最后

 


10.静态导入: import static java.util.Arrays;
  作用:可以省略类名不写,例如:import static java.util.Arrays;在调用Arrays的静态方法时,可以直接写方法名,不写Arrays
  注意:有相同的方法名,类名不能省略,
     方法名相同了,类名不能省
     类名相同了,包名不能省略,通过包名来区分


  

Properties:是一个Map集合类,默认的键和值必须是String类型,存储属性
Properties pro = System.getProperties();//得到的是系统属性集

Set<String> keys=pro.stringPropertyNames();//得到集合中所有的键的集合

for(String key:keys)
{
String v=pro.getProperty(key);
System.out.println(key+"="+v);
}

pro.setProperty("line.separator","\r\n");//相当于Map中的put 覆盖集合中同名的键值对,不会修改本来的数据,只是修改集合中的数据

 

 

11.IO流:(input output)输入输出流,用来实现设备之间的数据传输

  IO流的分类:
    按照方向分:输入流,输出流(相对于内存的)

    按照操作的数据分:
      字节流:可以操作任何类型的数据,文本,图片,音频,视频

      字符流:只能操作文本类型的数据,字符流是在字节流的基础上融入了编码,
          所以说字符流是基于字节流的

    常见编码:ASCII,ISO8859-1(欧洲编码表),gb2312,gbk,UTF-8


12.字节流(输入,输出)
  InputStream 字节输入流的父类
  OutputStream 字节输出流的父类

13.字符流(输入,输出)
  Reader 字符输入流的父类
  Writer 字符输出流的父类

14字符流:设备:硬盘
  使用FileWriter
    1.创建文件输出流对象和文件相关联 ,文件可以事先存在,也可以不存在,如果不存在就会自动创建

    FileWriter fileWriter=ewn FileWriter("temp.txt");
    2.使用文件输出流对象向文件中写入数据(要抛出异常)
    fileWriter.write("abc");//因为需要一个查表的过程,数据先写入到流对象内部的缓冲区了

    3.把缓冲区中的数据刷到文件中
    fileWriter.flush()

    4.关闭流(关闭后不能再写入数据,并且关闭流时会先刷新,即flush())
    fileWriter.close()

posted on 2019-08-25 22:19  small_slag  阅读(192)  评论(0编辑  收藏  举报

导航