数组的长度是不可变的,集合的长度是可变的。
数组可以存基本数据类型和引用数据类型。
集合只能存引用数据类型。如果要存基本数据类型,需要存对应的包装类。
1.Collection
Collection 是单例集合的顶层接口,它表示一组对象,这些对象也称为 Collection 的元素。
JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如 Set 和 List)实现。
1.1 常用成员方法
package com.qdu.mycollectiondemo1;
import java.util.ArrayList;
import java.util.Collection;
public class MyCollectonDemo2 {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("aaa");
collection.add("bbb");
collection.add("ccc");
collection.add("dddd");
System.out.println(collection);
boolean result1 = collection.remove("aaa");
boolean result2 = collection.remove("ddd");
System.out.println(result1);
System.out.println(result2);
System.out.println(collection);
}
}
package com.qdu.mycollectiondemo1;
import java.util.ArrayList;
import java.util.Collection;
public class MyCollectonDemo2 {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("aaa");
collection.add("bbb");
collection.add("ccc");
collection.add("dddd");
System.out.println(collection);
collection.removeIf(
(String s)->{
return s.length() == 3;
}
);
System.out.println(collection);
}
}
package com.qdu.mycollectiondemo1;
import java.util.ArrayList;
import java.util.Collection;
public class MyCollectonDemo2 {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("aaa");
collection.add("bbb");
collection.add("ccc");
collection.add("dddd");
System.out.println(collection);
int size = collection.size();
System.out.println(size);
boolean result1 = collection.contains("a");
System.out.println(result1);
boolean result2 = collection.contains("aaa");
System.out.println(result2);
boolean result = collection.isEmpty();
System.out.println(result);
collection.clear();
System.out.println(collection);
result = collection.isEmpty();
System.out.println(result);
}
}
1.2 迭代器
Iterator:迭代器,集合的专用遍历方式。
Iterator<E> iterator() :返回集合中的迭代器对象,该迭代器对象默认指向当前集合的 0 索引。
boolean hasNext() :判断当前位置是否有元素可以被取出。
E next() :获取当前位置的元素,将迭代器对象移向下一个索引位置。
package com.qdu.mycollectiondemo1;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class MyCollectonDemo3 {
public static void main(String[] args) {
Collection<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
Iterator<String> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
示例:创建一个集合 a b b c d,使用循环遍历这个集合,判断当前获取到的元素是否为 b,如果是就删除。
package com.qdu.mycollectiondemo1;
import java.util.ArrayList;
public class MyCollectonDemo4 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if("b".equals(s)){
list.remove(i);
i--;
}
}
System.out.println(list);
}
}
package com.qdu.mycollectiondemo1;
import java.util.ArrayList;
import java.util.Iterator;
public class MyCollectonDemo5 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
if("b".equals(s)){
it.remove();
}
}
System.out.println(list);
}
}
1.3 增强 for 循环
增强 for:简化数组和 Collection 集合的遍历。
它是 JDK5 之后出现的,其内部原理是一个 Iterator 迭代器。
只有实现 Iterable 接口的类才可以使用迭代器和增强 for。
格式:for(元素数据类型 变量名 : 数组或者Collection集合) { }
list.for 可以快速生成增强 for 循环。
package com.qdu.mycollectiondemo1;
import java.util.ArrayList;
public class MyCollectonDemo6 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
for(String str : list){
System.out.println(str);
}
}
}
package com.qdu.mycollectiondemo1;
import java.util.ArrayList;
public class MyCollectonDemo7 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
for(String str : list){
str = "q";
System.out.println(str);
}
System.out.println(list);
}
}
2.List
List 集合特点:
- 有序:存储和取出的元素顺序一致
- 有索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
package com.qdu.mylistdemo1;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class MyListDemo1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
for (String s : list) {
System.out.println(s);
}
}
}
List 特有方法:
package com.qdu.mylistdemo1;
import java.util.ArrayList;
import java.util.List;
public class MyListDemo2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add(0,"qqq");
System.out.println(list);
String s = list.remove(0);
System.out.println(s);
System.out.println(list);
String result = list.set(0, "qqq");
System.out.println(result);
System.out.println(list);
s = list.get(0);
System.out.println(s);
}
}
3.LinkedList
List 集合常用子类:ArrayList, LinkedList
- ArrayList:底层数据结构是数组,查询快,增删慢
- LinkedList:底层数据结构是链表,查询慢,增删快
package com.qdu.mylistdemo1;
import java.util.Iterator;
import java.util.LinkedList;
public class MyLinkedListDemo3 {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("-------------------------");
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
System.out.println("--------------------------");
for (String s : list) {
System.out.println(s);
}
}
}
LinkedList 特有方法:
package com.qdu.mylistdemo1;
import java.util.LinkedList;
public class MyLinkedListDemo4 {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.addFirst("qqq");
System.out.println(list);
list.addLast("www");
System.out.println(list);
String first = list.getFirst();
System.out.println(first);
String last = list.getLast();
System.out.println(last);
first = list.removeFirst();
System.out.println(first);
last = list.removeLast();
System.out.println(last);
System.out.println(list);
}
}
4.泛型
泛型:是 JDK5 中引入的特性,它提供了编译时类型安全检测机制。
泛型的好处:把运行期的问题提前到了编译期;避免了强制类型转换。
package com.qdu.genericitysummarize;
import java.util.ArrayList;
import java.util.Iterator;
public class GenericitySummarize {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add(123);
Iterator it = list.iterator();
while(it.hasNext()){
String next = (String) it.next();
int len = next.length();
System.out.println(len);
}
}
}
4.1 泛型类
如果一个类的后面有 <E> ,表示这个类是一个泛型类。
创建泛型类的对象时,必须要给这个泛型确定具体的数据类型。
泛型的定义格式:
<类型> :指定一种类型的格式。尖括号里面可以任意书写,按照变量的定义规则即可。一般只写一个字母,比如 <E> <T> <Q> <M> 。<类型1, 类型2...> :指定多种类型的格式,多种类型之间用逗号隔开,比如 <E,T> <Q,M> <K,V> 。
泛型类的定义格式:修饰符 class 类名<类型> { }
package com.qdu.genericityclass;
public class Box<E> {
private E element;
public E getElement() {
return element;
}
public void setElement(E element) {
this.element = element;
}
}
package com.qdu.genericityclass;
public class MyGenericityClass {
public static void main(String[] args) {
Box<String> box1 = new Box<>();
box1.setElement("hello");
String element1 = box1.getElement();
System.out.println(element1);
Box<Integer> box2 = new Box<>();
box2.setElement(19);
Integer element2 = box2.getElement();
System.out.println(element2);
}
}
4.2 泛型方法
如果泛型定义在方法声明上,表示这个方法是一个泛型方法。
package com.qdu.genericitymethod;
import java.util.ArrayList;
import java.util.Arrays;
public class GenericityMethod1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("hello");
list.add("hi");
list.add("world");
Object[] objects = list.toArray();
System.out.println(Arrays.toString(objects));
String[] strings = list.toArray(new String[list.size()]);
System.out.println(Arrays.toString(strings));
}
}
泛型方法的定义格式:修饰符 <类型> 返回值类型 方法名(类型 变量名) { }
示例:定义一个泛型方法,传递一个集合和四个元素,将元素添加到集合中并返回。
package com.qdu.genericitymethod;
import java.util.ArrayList;
public class GenericityMethod2 {
public static void main(String[] args) {
ArrayList<String> list1 = addElement(new ArrayList<String>(), "a", "b", "c", "d");
System.out.println(list1);
ArrayList<Integer> list2 = addElement(new ArrayList<Integer>(), 1, 2, 3, 4);
System.out.println(list2);
}
public static <T> ArrayList<T> addElement(ArrayList<T> list , T t1 ,T t2 ,T t3 ,T t4) {
list.add(t1);
list.add(t2);
list.add(t3);
list.add(t4);
return list;
}
}
4.3 泛型接口
如果泛型定义在接口后面,表示这个接口是一个泛型接口。
泛型接口的使用方式:
- 实现类也不给泛型。
- 实现类确定具体的数据类型。
泛型接口的定义格式:修饰符 interface 接口名<类型> { }
package com.qdu.genericityinterface;
public class GenericityInterface {
public static void main(String[] args) {
GenericityImpl1<String> genericity = new GenericityImpl1<>();
genericity.method("hello");
GenericityImpl2 genericityImpl2 = new GenericityImpl2();
genericityImpl2.method(19);
}
}
interface Genericity<E> {
public abstract void method(E e);
}
class GenericityImpl2 implements Genericity<Integer> {
@Override
public void method(Integer integer) {
System.out.println(integer);
}
}
class GenericityImpl1<E> implements Genericity<E> {
@Override
public void method(E e) {
System.out.println(e);
}
}
4.4 类型通配符
类型通配符:<?>
ArrayList<?> :表示元素类型未知的 ArrayList,它的元素可以匹配任何的类型。但是并不能把元素添加到 ArrayList 中了,获取出来的也是父类类型。
类型通配符上限:<? extends 类型>
ArrayList<? extends Number> :它表示的类型是 Number 或者其子类型。
类型通配符下限:<? super 类型>
ArrayList<? super Number> :它表示的类型是 Number 或者其父类型。
package com.qdu.genericityglobbing;
import java.util.ArrayList;
public class genericityglobbing1 {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>();
printList(list1);
printList(list2);
}
private static void printList(ArrayList<?> list) {
}
}
package com.qdu.genericityglobbing;
import java.util.ArrayList;
public class genericityglobbing1 {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Number> list2 = new ArrayList<>();
ArrayList<Object> list3 = new ArrayList<>();
method1(list1);
method1(list2);
method2(list2);
method2(list3);
}
private static void method1(ArrayList<? extends Number> list) {
}
private static void method2(ArrayList<? super Number> list) {
}
}
|