集合(部分):
1. Set
存储元素的特点:无序不可重复
说明:
- 无序性:不等于随机性。存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的。
- 不可重复性:保证添加的元素照equals()判断时,不能返回true.即:相同的元素只能添加一个。
当新的元素放入Set中时,会先与Set中所有的元素相比较,先比较元素的HashCode,如果HashCode相同,再使用equals方法比较,所以加入Set中的对象元素需要重写equals方法和hashCode两个方法
2. HashSet:
-
继承自Set
-
底层的数据结构是链表
-
没有添加额外的方法(继承Collection)
-
是线程不安全的
3. TreeSet
TreeSet底层数据结构是红黑树,是自然排序的,要求数据是同一类型
自然排序中,比较两个对象是否相同的标准为:compareTo()返回0.不再是equals().
自定义排序中,比较两个对象是否相同的标准为:compare()返回0.不再是equals().
如果要自定义TreeSet中元素的顺序,有两个方法:
- 给要排序的类实现Comparable接口,重写comparaTo(Object o)方法
public class Person implements Comparable<Person>{
@Override
public int compareTo(Person o) {
// 要规定的排序方式
return 0;
}
}
- 构造一个compareTo()的匿名内部类对象,重写compare()方法,将该对象放入TreeSet的构造器中
public class Test {
public static void main(String[] args) {
Comparator<Person> com = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
//默认第一个形参是自身对象的属性
// 要规定的排序方式
return 0;
}
};
}
}
结果大于0:正序
结果小于0:逆序
结果等于0:两个值相等,不插入后一个值
Map(映射):
说明:
-
Map与Collection并列存在,用于存放具有映射关系的数据:Key-Value
-
Map中的Key使用Set存放,不能重复,Map对象所对应的类,都应该重写hashCode和equals方法
一些相关的操作方法:
- 添加、删除、修改操作:
- Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
- void putAll(Map m):将m中的所有key-value对存放到当前map中
- Object remove(Object key):移除指定key的key-value对,并返回value
- void clear():清空当前map中的所有数据
- 元素查询的操作:
- Object get(Object key):获取指定key对应的value
- boolean containsKey(Object key):是否包含指定的key
- boolean containsValue(Object value):是否包含指定的value
- int size():返回map中key-value对的个数
- boolean isEmpty():判断当前map是否为空
- boolean equals(Object obj):判断当前map和参数对象obj是否相等
- 元视图操作的方法:
- Set keySet():返回所有key构成的Set集合
- Collection values():返回所有value构成的Collection集合
- Set entrySet():返回所有key-value对构成的Set集合
- entrySet()
- 返回此Map中包含映射的Set视图
- 返回值类型:Set<Map.Entry<K,V>>
以遍历为例:
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
for (Entry<String, String> entry : map.entrySet() ) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}
1. TreeMap:
TreeMap与TreeSet相似,区别是前者为映射后者为集
二者的排序方式都遵循自然排序和定制排序的法则
不同的是,TreeMap只需要区别Key的值是否相同
2. HashMap
-
Map 接口使用频率最高的实现类
-
允许使用null键和null值,与HashSet一样,不保证映射的顺序
-
所有的key构成的集合是Set:无序的、不可重复的。所以,key所在的类要重写:equals()和hashCode()
-
一个key-value构成一个entry
-
所有的entry构成的集合是entrySet:无序的、不可重复的
-
HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,
hashCode 值也相等。 -
在jdk8之前,HashMap的内部存储结构是数组和链表的结合
在jdk8之后,HashMap的内部存储结构是数组+链表+树的结合
haspMap底层的扩容方式:
hashMap的初始化容量为16,负载因子为0.75,也就是说,当hashMap中储存的元素个数超过(16*0.75)=12时,底层就会扩容志原来的两倍
3. properties
properties是继承自HashTable的一个类,是专门用来处理项目中的配置文件的
配置文件,用于存放数据的key-value,格式为:key=value,这种类型的配置文件名通常以.properties结尾
比如说这里就有个配置文件:
注意:name的乱码部分是输入进去的中文,输入时自动会转码,获取后会再转码回中文
可以通过以下代码获取到配置文件的信息并且打印下来:
//使用输入流获取配置文件,参数是文件的路径,可以是绝对路径也可以是相对路径
InputStream is = new FileInputStream(new File("./src/user.properties"));
Properties ps = new Properties();
ps.load(is);//加载配置文件
String age = ps.getProperty("age");
System.out.println(age);
is.close(); //关闭输入流
也可以这样:
//使用ResourceBundle 获取配置文件
//ResourceBundle 会将配置文件当作一个类来处理
//所以配置文件要放到和类的同级目录下并且使用该配置文件的全限定名称,不需要后缀
ResourceBundle myBundle = ResourceBundle.getBundle("com.gec.Map.user");
String age = myBundle.getString("age");
System.out.println();
运行的结果都是: