在开发中一般很少用Collection接口进行开发,基本上使用其子接口。子接口有List、Set、Queue、SortedSet。
List是Collection的子接口,其中可以保存各个重复的内容。
public interface List<E> extends Collection<E>
序号 | 方法 | 描述 |
---|---|---|
1 | List.add() | 在指定位置增加元素 |
2 | List.addAll() | 在指定位置增加一组元素 |
3 | List.get() | 返回指定元素的位置 |
4 | List.index() | 查找指定元素的位置 |
5 | List.lastIndexOf() | 从后向前查找指定元素的位置 |
6 | List.ListIterator | 为ListIterator接口实例化 |
7 | List.remove | 按指定的位置删除元素 |
8 | List.subList() | 取出集合中的子集合 |
9 | List.set() | 替换指定位置的元素 |
向集合添加元素
public class OverrideDemo01 {
public static void main(String[] args) {
List<String> allList=null;
allList=new ArrayList<>();
allList.add("hello");
allList.add("hello");
allList.add("hello");
allList.add("hello");
System.out.println(allList);
}
}
删除元素
public class OverrideDemo01 {
public static void main(String[] args) {
List<String> allList=null;
allList=new ArrayList<>();
allList.add("hello1");
allList.add("hello2");
allList.add("hello3");
allList.add("hello4");
System.out.println("------------");
allList.remove("hello1");
System.out.println(allList);
}
}
输出全部元素
public class OverrideDemo01 {
public static void main(String[] args) {
List<String> allList=null;
allList=new ArrayList<>();
allList.add("hello1");
allList.add("hello2");
allList.add(0,"helloF");
allList.add("hello4");
for (int i = 0; i < allList.size(); i++) {
System.out.print(allList.get(i)+",");
}
}
}
总结:
平常用ArrayList比较多,ArrayList的性能更高,采用异步处理的方式,属于非线程安全的操作类,只能用Iterator、foreach输出。
LinkdList表示的是一个链表的操作类。
方法 | 描述 |
---|---|
addFirst() | 在链表的开头增加元素 |
addLast() | 在链表的尾部增加元素 |
offer() | 将指定元素增加到链表的结尾 |
removeFirst() | 删除链表的第一个元素 |
removeLast() | 删除链表的最后一个元素 |
为链表增加数据
public class OverrideDemo01 {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<String>();
link.addFirst("A");
link.addFirst("B");
link.addFirst("C");
link.addFirst("D");
link.addFirst("E");
System.out.println(link);
System.out.println("--------");
link.addLast("O");
System.out.println(link);
}
}
其他的方法不在演示。
set接口也是Collection接口的子接口,但是与Collection或List接口不同,Set接口不能加入重复的元素。
HashSet是Set接口中的一个子类,特点是里面不能存放重复的元素,而且采用散列的存储方式,所有没有顺序。
验证HashSet类
public class OverrideDemo01 {
public static void main(String[] args) {
HashSet<String> se = new HashSet<String>();
se.add("A");
se.add("B");
se.add("C");
se.add("C");
se.add("C");
System.out.println(se);
}
}
对于重复的元素只会增加一次,而且程序运行时向集合中加入的顺序并不是集合中的保存顺序。证明HashSet类是无序的。
如果想对输入的数据进行有序的排列可以用TreeSet。
public class OverrideDemo01 {
public static void main(String[] args) {
TreeSet<String> se = new TreeSet<String>();
se.add("C");
se.add("A");
se.add("C");
se.add("B");
se.add("C");
System.out.println(se);
}
}
在插入数据是没有顺序的,但是输出之后数据据是有序的,所以TreeSet是可以排序的子类。
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj){
if(this==obj){
return true;
}
if (obj instanceof Person){
return true;
}
Person p=(Person) obj;
if(this.equals(p.name)&&this.age==p.age){
return true;
}else{
return false;
}
}
@Override
public int hashCode(){
return this.name.hashCode() * this.age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class OverrideDemo01 {
public static void main(String[] args) {
Set<Person> allSet = new HashSet<Person>();
allSet.add(new Person("张三", 66));
allSet.add(new Person("张三", 66));
allSet.add(new Person("张三", 66));
allSet.add(new Person("张三", 66));
allSet.add(new Person("李四", 66));
System.out.println(allSet);
}
}
消除重复的Person ,正是因为equals和hashCode共同作用的结果。
在集合中提供一下4中常见的输出方式。
方法 | 描述 |
---|---|
hasNext() | 判断是否有下一个值 |
next() | 取出当前元素 |
remove() | 移出当前元素 |
输出元素
public class OverrideDemo01 {
public static void main(String[] args) {
List<String> all = new ArrayList<>();
all.add("hello");
all.add("--");
all.add("world");
Iterator<String> iter = all.iterator();
while (iter.hasNext()){
System.out.print(iter.next()+",");
}
}
}
删除元素
public class OverrideDemo01 {
public static void main(String[] args) {
List<String> all = new ArrayList<>();
all.add("hello");
all.add("-");
all.add("world");
Iterator<String> iter = all.iterator();
while (iter.hasNext()){
String next = iter.next();
if("-".equals(next)){
iter.remove();
}
}
System.out.println(all);
}
}
使用foreach输出数组,同样也支持集合的输出。
使用foreach输出
public class OverrideDemo01 {
public static void main(String[] args) {
List<String> all = new ArrayList<>();
all.add("hello");
all.add("-");
all.add("world");
for (String s : all) {
System.out.println(s);
}
}
}
Map中每对key—>value都表示一个完整的内容,是一个二元偶对象。
Map<K,V>
方法 | 描述 |
---|---|
clear() | 清空Map集合 |
containsKey() | 判断指定的key是否存在 |
containsValue() | 判断指定的value是否存在 |
equals() | 对象的比较 |
get() | 根据key取得value |
hashCode() | 返回哈希码 |
isEmpty() | 判断集合是否为空 |
put() | 向集合加入元素 |
… | … |
增加和取得内容
public class OverrideDemo01 {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
map.put("k4", "v4");
System.out.println(map.get("k1"));
System.out.println(map.get("k2"));
System.out.println(map.get("k3"));
}
}
判断指定内容是否存在
public class OverrideDemo01 {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
map.put("k4", "v4");
System.out.println(map.containsKey("k1"));
System.out.println(map.containsValue("v2"));
System.out.println(map.containsValue("v11"));
System.out.println(map.containsValue("v22"));
}
}
输出全部Key与value
public class OverrideDemo01 {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
map.put("k4", "v4");
Set<String> strings = map.keySet();
Collection<String> list = map.values();
Iterator<String> iter = strings.iterator();
while (iter.hasNext()){
System.out.println(iter.next());
}
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}