JAVASE核心之集合

概念:
集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集 合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。

java集合容器结构:
这里写图片描述
对象的存储:①数组(基本数据类型 & 引用数据类型) ②集合(引用数据类型)>数组存储数据的弊端:长度一旦初始化以后,就不可变;真正给数组元素赋值的个数没有现成的方法可用。
2.集合框架
Collection接口 :方法:①add(Object obj),addAll(Collection
②remove(Object obj),removeAll(Collection coll),retainAll(Collection coll),equals(Object obj),contains(Object obj)
containsAll(Collection coll),hashCode()
③ iterator(),toArray();
* |——List接口:存储有序的,可以重复的元素.—相当于“动态”数组

新增的方法:删除remove(int index) 修改set(int index,Object obj) 获取get(int index)插入add(int index,Object obj)
添加进List集合中的元素(或对象)所在的类一定要重写equals()方法
* |——ArrayList(主要的实现类)
|——LinkedList(更适用于频繁的插入、删除操作)
|——Vector(古老的实现类、线程安全的,但效率要低于ArrayList)
* |——Set接口:存储无序的,不可重复的元素。—相当于高中的“集合”概念
Set使用的方法基本上都是Collection接口下定义的。
添加进Set集合中的元素所在的类一定要重写equals() 和 hashCode()。要求重写equals() 和 hashCode()方法保持一致。
1.无序性:无序性!= 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。
2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
* |——HashSet(主要的实现类)
|——LinkedHashSet(是HashSet的子类,当我们遍历集合元素时,是按照添加进去的顺序实现的;频繁的遍历,较少的添加、插入操作建议选择此)
|——TreeSet(可以按照添加进集合中的元素的指定属性进行排序)
要求TreeSet添加进的元素必须是同一个类的!
两种排序方式:自然排序:①要求添加进TreeSet中的元素所在的类implements Comparable接口
②重写compareTo(Object obj),在此方法内指明按照元素的哪个属性进行排序
③向TreeSet中添加元素即可。若不实现此接口,会报运行时异常
定制排序:①创建一个实现Comparator接口的实现类的对象。在实现类中重写Comparator的compare(Object o1,Object o2)方法
②在此compare()方法中指明按照元素所在类的哪个属性进行排序
③将此实现Comparator接口的实现类的对象作为形参传递给TreeSet的构造器中
④向TreeSet中添加元素即可。若不实现此接口,会报运行时异常
要求重写的compareTo()或者compare()方法与equals()和hashCode()方法保持一致。
Map接口:存储“键-值”对的数据 —-相当于高中的“函数y = f(x)” (x1,y1) (x2,y2)
key是不可重复的,使用Set存放。value可以重复的,使用Collection来存放的。一个key-value对构成一个entry(Map.Entry),entry使用Set来存放。
添加、修改 put(Object key,Object value) 删除remove(Object key) 获取get(Object key) size() / keySet() values() entrySet()
* |—–HashMap:主要的实现类,可以添加null键,null值
|—–LinkedHashMap:是HashMap的子类,可以按照添加进Map的顺序实现遍历
|—–TreeMap:需要按照key所在类的指定属性进行排序。要求key是同一个类的对象。对key考虑使用自然排序 或 定制排序
|—–Hashtable:是一个古老的实现类,线程安全的,不可以添加null键,null值不建议使用。
|—–子类:Properties:常用来处理属性文件

Iterator接口:用来遍历集合Collection元素

Collections工具类:操作Collection及Map的工具类,大部分为static的方法。

附:Properties的使用
Properties pros = new Properties();
pros.load(new FileInputStream(new File(“jdbc.properties”)));
String user = pros.getProperty(“user”);
System.out.println(user);
String password = pros.getProperty(“password”);
System.out.println(password);
总结:
1.当向 ArrayList 添加一个对象时,实际上就是将该对象放置到了 ArrayList 底层所维护的数组当中;当向 LinkedList 中添加一个对象时,实际上 LinkedList 内部会生成一个
Entry 对象,该 Entry 对象的结构为:
Entry
{
Entry previous;
Object element;
Entry next;
}

其中的 Object 类型的元素 element 就是我们向 LinkedList 中所添加的元素,然后 Entry 又构造好了向前与向后的引用 previous、next,最后将生成的这个 Entry 对象加入到了链表当中。换句话说,LinkedList 中所维护的是一个个的 Entry 对象。
2.关于 Object 类的 equals 方法的特点
a)自反性:x.equals(x)应该返回 true
b)对称性:x.equals(y)为 true,那么y.equals(x)也为 true。
c)传递性:x.equals(y)为 true 并且y.equals(z)为 true,那么 x.equals(z)也应该为 true。
d)一致性:x.equals(y)的第一次调用为 true,那么 x.equals(y)的第二次、第三次、第 n
次调用也应该为true,前提条件是在比较之间没有修改 x 也没有修改 y。
e)对于非空引用 x,x.equals(null)返回 false。
3.关于 Object 类的 hashCode()方法的特点:
a)在 Java 应用的一次执行过程当中,对于同一个对象的 hashCode 方法的多次调用, 他们应该返回同样的值(前提是该对象的信息没有发生变化)。
b)对于两个对象来说,如果使用 equals 方法比较返回true,那么这两个对象的 hashCode
值一定是相同的。
c)对于两个对象来说,如果使用equals 方法比较返回false,那么这两个对象的hashCode
值不要求一定不同(可以相同,可以不同),但是如果不同则可以提高应用的性能。
d)对于Object 类来说,不同的Object 对象的hashCode 值是不同的(Object 类的hashCode
值表示的是对象的地址)。
4.当使用 HashSet 时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code 值是否与增加的对象的 hash code 值一致;如果不一致,直接加进去;如果一致,再进行 equals 方法的比较,equals 方法如果返回 true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。
5.如果我们重写 equals 方法,那么也要重写 hashCode 方法,反之亦然。
6.Map(映射):Map 的keySet()方法会返回key 的集合,因为 Map 的键是不能重复的,因此 keySet()方法的返回类型是 Set;而 Map 的值是可以重复的,因此 values()方法的返回类型是 Collection,可以容纳重复的元素。

面试常见点(见后续更新中。。。)

猜你喜欢

转载自blog.csdn.net/qq_37779333/article/details/82343408