集合:
集合就是一个容器。
对于集合内的各个对象很容易将其存放到集合中,也很容易将其从集合中取出来,还可以按照一定的顺序放入。
对集合可以进行遍历、添加、删除以及查找制定的对象。集合的体系结构如下图。
Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。1此接口1通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
1、 Collection
//Collection集合
Collection c = new ArrayList();
String s = new String("hello");
Student s11 = new Student(21,"张三",'m');
Date d = new Date();
//添加一个元素
c.add(s);
c.add(s11);
c.add(d);
// 删除
c.remove("hello");
//迭代器
Iterator iter = c.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
//集合的元素个数
System.out.println(c.size());
//清除集合中的元素
c.clear();
System.out.println(c.size());//求元素交集
Collection c1 = new ArrayList();
Collection c2 = new ArrayList();
//2.添加元素。
c1.add("abc1");
c1.add("abc2");
c1.add("abc3");
c1.add("abc4");
c2.add("abc2");
c2.add("abc3");
c2.add("abc5");
//将c1中和c2中不同元素剔除,剩余元素为c1,c2中共有的元素,交集。
c1.retainAll(c2);
System.out.println(c1);
2、List |--List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引,允许重复元素。
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。列表通常允许重复的元素。
List<Student> collection = new ArrayList<Student>();
//添加
collection.add(new Student(21,"张三",'M'));
collection.add(new Student(22,"李四",'M'));
collection.add(new Student(23,"王麻子",'W'));
collection.add(new Student(23,"王麻子",'W'));
//删除
collection.remove(new Student(22,"李四",'M'));
//修改
collection.set(0,new Student(28,"李四",'M') );
//查
Student s = collection.get(2);
//迭代器
Iterator< Student> iter = collection.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
3 、Set |--Set:无序(存入和取出顺序有可能不一致),不允许重复元素,必须保证元素的唯一性。
Set<Student> coll = new HashSet<Student>();
Student s1 = new Student(24,"张三",'M');
Student s2 =new Student(24,"张三",'M');
coll.add(s1);
coll.add(s2);
// System.out.println(s1==s2);
System.out.println(s1.equals(s2));
System.out.println(coll.size());
Iterator< Student> iter = coll.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
Set方法不允许重复,所以就要有判断重复的方法,就要在添加实体类里面重写equals和hashcode方法来判断重复。
转载 相关知识点equals方法详细介绍:https://blog.csdn.net/javazejian/article/details/51348320
总结:默认情况下也就是从超类Object继承而来的equals方法与‘==’是完全等价的,比较的都是对象的内存地址,但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了equals方法,使其比较的是字符的序列,而不再是内存地址。
转载hashSet原理分析:https://blog.csdn.net/w3045872817/article/details/73294491
* 因此使用HashSet 的add()方法插入元素的时候:
|- HashSet会自动调用元素的hashCode()方法。
|- 然后根据hashCode()方法的返回值 来决定元素要插入的位置。
|- 如果该位置上已经存在元素了 则会调用该元素equals()方法进行比较。
|- 如果两个元素相等 则丢掉欲插入的元素。
|- 如果两个元素不相等 则新元素会被加入到另一个位置(通过冲突检测来决定哪一个位置),这样就消除了重复。
TreeSet
Collection<Student> coll = new TreeSet<Student>();
coll.add(new Student(24,"张三",'M'));
coll.add(new Student(22,"李四",'M'));
coll.add(new Student(23,"王麻子",'W'));
Iterator< Student> iter = coll.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
对于TreeSet集合 ,比较顺序的时候要在改实体类里面实现compareTo接口。
4、Map 有关于map的详细介绍 https://blog.csdn.net/modaiairen524/article/details/79484060
取键值图解
Map<String, Student> map = new HashMap<String,Student>();
map.put("aaa",new Student(21,"张三",'M'));
map.put("bbb", new Student(21,"张三",'M'));
//取实体,迭代
Set<Entry<String, Student>> entry = map.entrySet();
Iterator<Entry<String, Student>> enty= entry.iterator();
Entry<String, Student> tt = enty.next();
System.out.println( tt.getKey() + tt.getValue());
System.out.println(map);
取键集:图解
Map<String, Student> map = new HashMap<String,Student>();
map.put("aaa",new Student(21,"张三",'M'));
map.put("bbb", new Student(21,"张三",'M'));
//取键集,迭代
Set<String> keys = map.keySet();
Iterator<String> iter = keys.iterator();
while(iter.hasNext()) {
System.out.println( iter.next());
}
取值集:
Map<String, Student> map = new HashMap<String,Student>();
map.put("aaa",new Student(21,"张三",'M'));
map.put("bbb", new Student(21,"张三",'M'));
//取值迭代
Collection<Student> studes = map.values();
Iterator<Student> iter = studes.iterator();
while(iter.hasNext()) {
System.out.println( iter.next());
1. 用到hashSet或HashMap就要想到哈希表,就要想到哈希就要想到 hashCode () 与equals()让元素具备可比较性
2. 用到treeSet , TreeMap就要想到二叉树,就要想到实现Comparable接口,重写compareTo()让元素具备可比较性
3. 算数值尽量拿==比较,String类型的和对象类型的拿equals比较.