map
Map储存的是键和值,成对存在的,常用的有hashmap和treemap
最基本的操作是put(k,v);
就是添加,值得注意的是,map中键的值不可重复,值得值随意,所以如果将相同的值的键值对put进去则相当于更新操作。
查看指定的键或者值是否存在有相应的containKey()/containValue()
方法
删除使用的是remove()
方法,而参数则传入给一个key,另外也可以使用putall();
插入一组数据。
Treemap除了实现不一样,tree还可以实现排序,和treeset一样,有两种方法,实现comparable接口或者comparator接口,一个是自然排序,一个是定义排序。
然后就是对map的遍历,总共有4种方法分别如下:
1
2
3
4
5
|
<br />
//第一种:普遍使用,二次取值
System.out.println(
"通过Map.keySet遍历key和value:"
);
for
(String key : map.keySet()) {
System.out.println(
"key= "
+ key +
" and value= "
+ map.get(key));
}
|
第一种方法是通过keyset方法返回了一个包含了所有key值的set,然后通过对这个set的遍历,使用get()
方法将值获得。
1
2
3
4
5
6
7
|
//第二种
System.out.println(
"通过Map.entrySet使用iterator遍历key和value:"
);
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while
(it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println(
"key= "
+ entry.getKey() +
" and value= "
+ entry.getValue());
}
|
第二种方法使用的是Map.entrySet()
方法,这个方法获得的返回值为Set<Map.Entry<K,V>>
,
返回此映射所包含的映射关系的 Set 视图。
然后使用返回这个set的迭代器来遍历set,这个entry包含了映射关系,然后使用它的getkey和getvalue方法得到数据。
1
2
3
4
5
|
//第三种:推荐,尤其是容量大时
System.out.println(
"通过Map.entrySet遍历key和value"
);
for
(Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(
"key= "
+ entry.getKey() +
" and value= "
+ entry.getValue());
}
|
第三种方法同样使用了entry方法不过遍历set使用的是增强for循环,似乎效率会高一点,有待研究。
1
2
3
4
5
|
//第四种
System.out.println(
"通过Map.values()遍历所有的value,但不能遍历key"
);
for
(String v : map.values()) {
System.out.println(
"value= "
+ v);
}
|
第四种使用的是map的values方法,这个方法会返回values值的一个集合Collection,然后使用增强for循环遍历,缺点则为上边所说的,只能遍历value,对于key则完全不知。
关于hsahmap的补充:
Hashmap使用来了特殊的值,称为散列码,来加快查询的。
一般来说就是默认的选择
另外的几个map的实现类如下:
Hashmap:map基于散列表的实现,插入和查询键值对的开销是固定的,可以通过构造器,设置容量和负载因子,来调整容器的性能
LinkedHashMap:类似Hashmap,但是迭代遍历它时,取得键值对的顺序是其插入的次序,或者是最近最少使用(LRU)的次序,之比HashMap慢一点,而在迭代访问时更快,因为它使用链表维护内部次序。
Treemao:基于红黑数的实现,查看键,或者键值对的时候,它们会被排序,(次序由Comparable或者comparator决定)。TreeMap的特点在于,所得到的结果是经过排序的,TreeMap是唯一的带有subMap()方法的map,他可以返回一个子树。
weakHashmap :弱键(weak key)映射,允许释放映射所指向的对象,这是为了解决某些特殊问题而特殊设计的,如果映射没有指向引用某个键,则此键可以被垃圾回收器回收。
ConcurrentHashmap:一种线程安全的map,它不涉及同步加锁,并发中讨论。
IdentityHashMap 使用== 来替代equals()进行键的比较的散列映射,同样为了解决某些特殊问题而设计的。
另外,书中提到,重写equals方法时,一个正确的equals方法满足:自反性,对称性,传递性,一致性,对于不是null的x,x.equals(null)返回false
然后就是
I/O
io就是文件的输入输出,一般在网络编程中常用。
这里重要的一个类就是File类
也就是文件类,对文件的操作,都是通过这个类来实现的,下面就是一些基本的操作。
首先来看File的构造函数:
File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(URI uri)
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例
- 另外还定义了一些静态的字符串,供使用
static String pathSeparator
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
static char pathSeparatorChar
与系统有关的路径分隔符。
static String separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
static char separatorChar
与系统有关的默认名称分隔符。
比较常用的是separator
,从安全上来讲不建议直接用/来当作分隔符,而且你在使用的时候还需要加一个/来转义,像这样
1
|
File f=
new
File(
"meng\\JAVAEE"
\\msg.txt");
|
所以一般来讲我们这样做
1
|
File f=
new
File(
"meng"
+File.separator+
"JAVAEE"
+File.separator+
"msg.txt"
);
|
在前面不加盘符的话,默认会在程序的路径下。
另外jdk中提到
File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。
查看文件的相对路径
File.getPath();
查看文件的绝对路径
file.getAbsolutefile
或者
File.getAbsolutepath
两者的返回值不同,一个返回的为file对象,另一个为路径的string
另外可以得到文件的父目录
Getparent()
GetparentFile()
是否可读file.canread();
是否可写file.canWrite();
可以通过file.exists()
判断目录是否存在,然后通过mkdir()
创建,或者mkdirs()
区别在于后者可以同时创建所有不存在的父类文件夹,而前者只能创建一个。
重命名使用的是renameTo()
重点是,我们可以通过这个函数来实现文件的移动。将新的位置传给他即可。
另外List开头的几个方法可以获得目录下的所有文件,分别有几种形式,列举如下
1
2
3
4
5
6
7
8
9
10
11
12
|
String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
String[] list(FilenameFilter filter)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles(FilenameFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
static
File[] listRoots()
列出可用的文件系统根。
|