------- android培训、java培训、期待与您交流! ----------
Map
1. 特点:
Map是双列集合, Map的实现类可以存储key和value两个属性
Map中的key和value是映射关系,它们可以是不同的任意类型, key是唯一的, value可以不是
Map接口下的方法
1. public Object put(Object key,Object value)
这个方法法是向Map中添加key与value
注意: 如果key值重复,它会破坏映射关系, 将新的value值传入,原来的value将被返回
2. public void clear()
作用: 清空集合,跟Collection集合中功能一样
3. public int size()
作用: 得到集合长度,跟Collection集合中功能一样
4. containsKey, containsValue
a) public booleancontainsKey(Object key)
判断当前map是否存在指定的key
b) public booleancontainsValue(Object value)
判断房钱map是否存在指定的value
5. public Object get(Object key)
作用: 得到指定的key对应的value
6. public Object remove(Objet key)
根据key删除映射,返回key对应的value
7. ****public Set keyset()
作用: 返回map中key的的set
**这个方法可以用来遍历map
a) 1.得到Set
b) 迭代得到每个key
c) get(key)得到value
8. ****public Map.Entry entrySet()
作用: 返回Map.Entry的对象的Set集合, Map.Entry对象中保存了key和value
Map.Entry接口中有两个属性key和value,提供了getKey(), getValue()方法取出key值和value值
**这个方法可以用来遍历map
1. Map的entrySet得到key-value(Entry类型)映射的Set视图
2. 通过Iterator得到Entry对象
3. 通过EntrySet的getKey(), getValue()获得key和value
9. public Collection values()
作用: 得到map集合中所有value映射的一个Collection集合
10. Map接口方法代码示例
将Student对象和家庭地址分别作为key和value添加进map, Student有三个属性,姓名, 学号,家庭地址
import java.util.*;
class MapDemo {
public static void main(String[] args) {
// 创建studnet对象
Student s1 = new Student("张三", 1, "北京路");
Student s2 = new Student("李四", 2, "上海路");
Student s3 = new Student("王五", 3, "南京路");
// 地址
String addr1 = s1.getAddr();
String addr2 = s2.getAddr();
String addr3 = s3.getAddr();
// 创建Map对象, 将学生作为键, 地址作为value添加进map
Map<Student, String> map = new HashMap<Student, String>();
map.put(s1, addr1);
map.put(s2, addr2);
map.put(s3, addr3);
// keySet()迭代输出
Set<Student> set = map.keySet();
for (Iterator<Student> it = set.iterator(); it.hasNext();) {
Student s = it.next();
System.out.println("key " + s);
System.out.println("key " + map.get(s));
}
// entrySet()迭代输出
Set<Map.Entry<Student, String>> set1 = map.entrySet();
for (Iterator<Map.Entry<Student, String>> it = set1.iterator(); it
.hasNext();) {
Map.Entry entry = it.next();
System.out.println("entry " + entry.getKey());
System.out.println("entry " + entry.getValue());
}
// values()获取map中的全部value
Collection coll = map.values();
System.out.println("获取全部value " + coll);
}
}
// 声明一个学生类
class Student {
// student的三个属性
private String name;
private int id;
private String address;
// 无参构造方法
Student() {
}
// 有参构造
Student(String name, int id, String address) {
this.name = name;
this.id = id;
this.address = address;
}
// 获取属性的方法
public String getName() {
return this.name;
}
public int getId() {
return this.id;
}
public String getAddr() {
return this.address;
}
public String toString() {
StringBuilder s = new StringBuilder();
s.append("姓名: " + this.name);
s.append(" 学号: " + this.id);
s.append(" 地址: " + this.address);
return s.toString();
}
}
Map与Collection区别
1. Map是双列集合,Collection是单列集合
2. Map集合存储是用put方法
Collection存储用add方法
3. Collection遍历用用功Iterator
Map集合使用keySet方法将key值的set取出,然后get(key), 或者使用entrySet获取Entry对象,用get(key)和get(value)
HashMap
1. 特点
HashMap底层是哈希表实现的,无序, 不重复,允许null值和null键,线程不安全
HashTable功能跟HashMap一样,不允许null值和null键,线程安全
2. 唯一性
HashMap使用hashCode()和equals()确定键值唯一的,原理跟HashSet一样
TreeMap
1. 特点
底层是二叉树实现的, 有自然顺序, 或者比较器顺序,线程不安全
2. 唯一性
自然顺序compareTo()和比较器Comparator的实现类确保唯一的
3. Properties(了解)
早期开发中用于配置文件映射的
HashMap, TreeMap代码示例
import java.util.*;
class HashTreeMap {
public static void main(String[] args) {
System.out.println("HashMap.......");
hashDemo();
System.out.println("TreeMap.......");
treeDemo();
}
// 演示HashMap
public static void hashDemo() {
// 创建HashMap对象
HashMap<Integer, String> map = new HashMap<>();
// 添加key和value
map.put(2, "王五");
map.put(1, "李四");
map.put(3, "张三");
// 映射出Entry的Set集合
Set<Map.Entry<Integer, String>> set = map.entrySet();
// 迭代输出
for (Iterator<Map.Entry<Integer, String>> it = set.iterator(); it
.hasNext();) {
Map.Entry<Integer, String> entry = it.next();
int key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " " + value);
}
}
// 演示TreeMap
public static void treeDemo() {
// 创建HashMap对象
TreeMap<String, Integer> map = new TreeMap<>(new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
// 添加key和value
map.put("Tom", 3);
map.put("Alex", 1);
map.put("Tony", 2);
// 映射出key的Set集合
Set<String> set = map.keySet();
// 迭代输出
for (Iterator<String> it = set.iterator(); it.hasNext();) {
String key = it.next();
int value = map.get(key);
System.out.println(key + " " + value);
}
}
}
开发中集合如何选择
1. 单列集合还是双列集合
单列选Collection, 双列选Map
2. Collection中, Map中选哪个
a) 没有要求,选List, 首选ArrayList
要求有不重复的, 选Set, 首选HashSet
对于LinkedList和TreeSet,根据要求的特性选择
b) Map
首选HashMap, 要求有顺序选TreeMap
集合与数组的操作类
1. Collections
a) Collections在java.util包下,是Collection集合的一个工具类,方法都是Static的
b) 常用方法了解
1. public static void sort(Listlist)
根据集合中元素的自然顺序排序
2. public static void sort(Listlist, Comparator c)
根据集合中指定的比较去排序
3. public static Tmax(List<T> list)
返回集合中根据自然顺序的最大值
4. public static voidshuffle(List<T> list)
对指定集合乱序
5. public static void swap(List l,int i, int j)
交换集合中指定位置的两个元素
6. public static int reverse(Listl)
将集合中的元素顺序反转
7. public static intbinarySearch(List<T> list, T key)
返回指定集合中指定key的索引
注意: 这个方法中的list必须是已经排序过的,如果当前集合没有key值,返回
-(插入点) – 1,插入点是这个key应该存在的位置
public static int binarySearch(List<T> list, T key,Comparator c)
指定集合按照比较器的顺序排序查找key,返回key的索引
8. 集合同步线程的的一些方法(了解)
synchronizedCollection(Collection c),synchronizedMap(Map m),
这类方法解决集合线程安全问题, jdk.api详细
2. Collections常用方法代码
import java.util.*;
class Test {
public static void main(String[] args) {
// 创建一个ArrayList对象
ArrayList<Integer> list = new ArrayList<>();
list.add(2);
list.add(6);
list.add(4);
list.add(3);
list.add(5);
// 得到集合中最大的值
int max = Collections.max(list);
System.out.println(max); // 打印结果: 6
// 将集合排序
Collections.sort(list);
System.out.println(list); // 打印结果: [2, 3, 4, 5, 6]
// 二分查5的位置
int index = Collections.binarySearch(list, 5);
System.out.println(index); // 打印结果: 3
// 将集合倒序
Collections.reverse(list);
System.out.println(list); // 打印结果: [6, 5, 4, 3, 2]
}
}
3. Arrays类中的方法
a) 了解的方法
binarySearch(), copyOf(), fill(), sort()
b) public static String toString(数组类型 arr)
将数组中的内容以字符串的形式输出
c) asList(T… a)这里的T… a 是表示可变参数(后面有写)
将当前数组转换为集合
转换的目的是因为List提供了更多的功能
当数组使用asList转换为list,长度不能更改
当数组的元素师基本类型, 是将数组当做一个元素传去
当数组的元素师引用类型, 将每个元素传入集合
扩展: Collection中的toArray()方法,可以返回当前的集合的Object[]
toArray(T[] a)是返回指定的类型数组
4. 代码示例
import java.util.*;
class ArraysTest {
public static void main(String[] args) {
// 创建一个数组
int[] arr = { 3, 5, 1, 2, 4 };
// 给数组排序
Arrays.sort(arr);
// 返回数组转的字符串形式
String s = Arrays.toString(arr);
System.out.println(s); // 打印结果: [1, 2, 3, 4, 5]
// 将数组排序
Arrays.sort(arr);
// 增强for循环输出
for (int i : arr) {
System.out.print(i + " "); // 打印结果: 1 2 3 4 5
}
System.out.println(); // 用于隔行
// 二分查找3的位置
int index = Arrays.binarySearch(arr, 3);
System.out.println(index); // 打印结果: 2
// 将int[]转换成List集合
List list = Arrays.asList(arr);
// 增强for循环输出
for (Object i : list) {
System.out.println(i); // 打印结果: [I@635adc6
}
// 创建一个String[]
String[] str = { "3", "7", "1", "9" };
// 将String[]转换成list集合
List<String> slist = Arrays.asList(str);
// List有toString()方法
System.out.println(slist); // 打印结果: [3, 7, 1, 9]
// 将集合转换为数组
Object[] sArr = slist.toArray();
// 遍历输出sArr
for (Object obj : sArr) {
System.out.print(obj + " "); // 打印结果: 3 7 1 9
}
}
}
增强for循环可变参数(jdk1.5新特性)
1. 语法格式
for (元素类型变量名:集合/数组) {
System.out.println(变量名);
}
2. 功能
其实就是简化迭代的语法, 只能用于遍历, 不能在循环的时候操作,底层是Iterator实现
3. 语法格式
int… arr相当于int[] arr
是数组的一种简化写法
4. 代码示例
class SumTest {
public static void main(String[] args) {
// 定义三个变量用于验证求和方法
int a = 3;
int b = 5;
int c = 4;
int sum1 = sum(a, b);
int sum2 = sum(a, b, c);
System.out.println(a + "+" + b + "=" + sum1); // 打印结果: 3+5=8
System.out.println(a + "+" + b + "+" + c + "=" + sum2); // 打印结果:
// 3+5+4=12
}
// 定义一个接收可变参数的求和的方法
public static int sum(int... a) {
// 定义一个sum用于累计求和
int sum = 0;
// 增强for循环累加可变参数里的值
for (int i : a) {
sum += i;
}
return sum;
}
}
静态导入(jdk1.5新特性)
1. 语法格式
import static 包名.类名.静态方法名;
作用: 在类中导入静态方法,这个类可以像调用类内的方法一样调用导入的静态方法
2. 弊端
方法内静态导入的方法与类内或者其他导入的类方法重名,编译器不知道该使用哪一个
示例代码
package com.itcast;
import java.util.*;
import static java.util.Arrays.sort;
import static java.util.Arrays.toString;
public class ImportStaticTest {
public static void main(String[] args) {
// 创建一个Integer[]
Integer[] arr = { 4, 2, 6, 7, 1, 8 };
// 使用静态导入的方法对数组进行排序
sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}