容器
List接口
LinkedList
LinkedList 是一种可以在任何位置进行高效地插入和删除操作的有序序列。
LinkedList list = new LinkedList();
list.add("杜乐乐");
list.add("郑南杰");
list.add("张万利");
System.out.println(list);
list.addFirst("GG");
System.out.println(list);
list.addLast("11");
System.out.println(list);
LinkedList:底层用双向链表实现的 List。特点:查询效率低,增删效率高,线程不安全。 ArrayList:底层用数组实现的 List。特点:查询效率高,增删效率低,线程不安全。
Set接口
Set 接口中的元素无序不可重复:不包含重复元素,最多包含一个 null,元素没有顺序 。
//内部去重
Set<String> set =new HashSet<String>();
set.add("斗鱼tv");
set.add("熊猫tv");
set.add("战旗tv");
set.add("熊猫tv");//相同元素不会加入
System.out.println(set.size());
HashSet
HashSet 是 Set 接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散 列的存储方法,所以没有
顺序。这里所说的没有顺序是指:元素插入的顺序与输出的顺序不 一致。 使用重写 equals 和 hashcode 来实现自
定义的类型的去重。
Java 中规定,两个内容 相同的对象应该具有相等的 hashcode
public class HashSetDemo {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add(new Person("张三",18,80));
set.add(new Person("李四",19,100));
set.add(new Person("二狗子",18,180));
set.add(new Person("二狗子",19,180));
System.out.println(set);
}
}
class Person{
private String name;
private int age;
private int wight;
public Person() {
super();
}
public Person(String name, int age, int wight) {
super();
this.name = name;
this.age = age;
this.wight = wight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getWight() {
return wight;
}
public void setWight(int wight) {
this.wight = wight;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + wight;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (wight != other.wight)
return false;
return true;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", wight=" + wight + "]";
}
}
Collection 类对象是否相等对象在调用 remove、contains 等方法时需要比较,这会涉及 到对象类型的 equals 方
法和 hashCode 方法;对于自定义的类型,需要重写 equals 和 hashCode 方法以实现自定义的对象相等规则。
TreeSet
底层:->是由TreeMap的key维护的
实现结构:红黑树
特点: 有序(默认升序)
compare比较器
定制比较规则:
1.内部比较器|自然排序要当前比较的类型实现一个借口Comparable接口,重写compareTo方法,方法的内部制定比较规则
硬编码习惯,不够灵活,每次修改源代码
2.外部比较器|自定义排序
使用任何一个实现类实现一个接口Comparator,重写compare方法,方法的内部制定比较规则
public static void main(String[] args) {
//默认使用内部比较器
//TreeSet set1 = new TreeSet();
//指定使用参数比较器
//Lambda
Comparator<Student> com ;
com = (Student s1,Student s2)->{
return s1.getName().compareTo(s2.getName());
};
TreeSet set = new TreeSet(com);
set.add(new Student("zs",20));
set.add(new Student("ls",21));
set.add(new Student("zsf",22));
System.out.println(set);
}
Map接口
实现Map接口的类用来存储键(key)-值(value) 对。
Map 接口的实现类有HashMap和TreeMap等。
Map类中存储的键-值对通过键来标识,所以键值不能重复。
HashMap: 线程不安全,效率高. 允许key或value为null
**HashTable:**线程安全,效率低. 不允许key或value为null
Properties: HashTable的子类,key和value都是string
Object put(Object key,Object value);
Object get(Object key);
Object remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
void putAll(Map t);
void clear();
HashMap例子
public static void main(String[] args) {
Map<String,Integer> map =new HashMap();
map.put("张三", 20);
map.put("李四", 20);
map.put("王五", 20);
System.out.println(map);
//通过key获取value
System.out.println(map.get("王五"));
//通过key删除 返回value
System.out.println(map.remove("李四"));
//长度
System.out.println(map);
System.out.println(map.size());
//遍历
System.out.println("------keyset-------");
Set<String> keyset =map.keySet();
for(String str:keyset) {
System.out.println(str + "----" + map.get(str));
}
System.out.println("------values-------");
Collection<Integer> coll = map.values();
for(Integer inte:coll) {
System.out.println(inte);
}
System.out.println("--------entrySet--------");
Set<Map.Entry<String, Integer>> set = map.entrySet();
for(Map.Entry<String, Integer> entry:set) {
System.out.println(entry.getKey() + "------" + entry.getValue());
}
//包含
System.out.println(map.containsKey("王五"));
System.out.println(map.containsValue(20));
}