Java基础(八):遍历和泛型

本文介绍了Java中ArrayList的遍历方法,包括for循环、foreach、迭代器、lambda表达式和Stream流,并详细讲解了泛型的基本概念、语法、使用方法和注意事项,帮助读者理解和应用Java泛型。
摘要由CSDN通过智能技术生成


前言

在 Java 编程中,ArrayList 是一种常用的数据结构,它提供了动态数组的功能,可以动态的增加或删除元素,是一个非常灵活的容器。在使用 ArrayList 时,遍历和泛型也是非常重要的知识点,本篇文章主要介绍 ArrayList 的遍历和泛型相关的知识。


一、遍历

Java中的遍历是指对集合、数组等数据结构中的元素进行遍历操作,即按照一定的顺序依次访问其中的每个元素。Java中常用的遍历方式包括for循环遍历、for-each循环遍历、迭代器遍历、lambda表达式遍历和Stream流遍历。

1.for 循环遍历

for 循环遍历是最常用的遍历方式,它通过下标来获取 ArrayList 中的元素,代码如下:

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

2.foreach 循环遍历

foreach 循环遍历是一种简单方便的遍历方式,它可以直接遍历 ArrayList 中的元素,代码如下:

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for (Integer i : list) {
    System.out.println(i);
}

上述两种遍历方式都可以遍历 ArrayList 中的元素,但是 foreach 循环遍历更加简单方便,代码可读性更高。

3.迭代器遍历

迭代器是Java集合框架中的一个接口,用于遍历集合中的元素。ArrayList实现了迭代器接口,可以使用迭代器遍历ArrayList。其语法格式如下:

Iterator<Integer> iterator = arrayList.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

其中,iterator()方法返回一个迭代器对象,hasNext()方法用于判断是否还有下一个元素,next()方法用于获取下一个元素。
示例代码:

ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
Iterator<Integer> iterator = arrayList.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

输出结果:

1
2
3

4.lambda表达式遍历

lambda表达式是Java 8中引入的一个新特性,可以简化代码并提高代码的可读性。可以使用lambda表达式遍历ArrayList。其语法格式如下:

arrayList.forEach(element -> System.out.println(element));

其中,forEach()方法接收一个Lambda表达式作为参数,用于遍历ArrayList中的每个元素。Lambda表达式的参数是当前遍历到的元素,箭头后面的代码块用于处理当前元素。
示例代码:

ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.forEach(element -> System.out.println(element));

输出结果:

1
2
3

5.Stream流遍历

Stream是Java 8中引入的一个新特性,可以处理集合中的元素并生成新的集合。可以使用Stream流遍历ArrayList。其语法格式如下:

arrayList.stream().forEach(System.out::println);

其中,stream()方法返回一个Stream流对象,forEach()方法接收一个Lambda表达式作为参数,用于遍历Stream流中的每个元素。Lambda表达式的参数是当前遍历到的元素,System.out::println表示调用System.out.println()方法输出当前元素。
示例代码:

ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.stream().forEach(System.out::println);

输出结果:

1
2
3

6.总结

本篇文章介绍了ArrayList遍历的几种方法,包括for循环遍历、for-each循环遍历、迭代器遍历、lambda表达式遍历和Stream流遍历。不同的遍历方法各有优缺点,需要根据具体情况选择合适的方法。在实际开发中,我们经常需要对集合进行遍历操作,掌握ArrayList的遍历方法是Java开发的基础知识。


二、泛型

1.基本概念

泛型的基本概念是参数化类型,也就是说我们可以将一种数据类型作为参数传递给类、接口或方法,在使用时再确定具体的数据类型。这样可以避免类型转换和运行时错误,并提高程序的可读性和可维护性。


2.语法

Java泛型的语法主要包括泛型类、泛型接口、泛型方法和通配符等。

(1) 泛型类和泛型接口

泛型类和泛型接口是指在类或接口定义时使用泛型,其语法格式如下:

public class ClassName<T> { ... }
public interface InterfaceName<T> { ... }

其中,T表示类型参数,可以是任意标识符,通常使用大写字母表示。在实例化时,需要指定具体的类型参数,例如:

ClassName<Integer> obj = new ClassName<>();
InterfaceName<String> obj = new InterfaceName<>();

(2)泛型方法

泛型方法是指在方法定义时使用泛型,其语法格式如下:

public <T> void methodName(T t) { ... }

其中,表示类型参数列表,可以有多个类型参数。在调用时,需要指定具体的类型参数,例如:

methodName("hello");
methodName(123);

(3)通配符

通配符是指在泛型中使用“?”来表示任意类型,其语法格式如下:

public void methodName(List<?> list) { ... }

其中,List<?>表示List集合中可以是任意类型的元素。在使用时,可以传递任意类型的List集合,例如:

List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
methodName(list1);
methodName(list2);

3.使用方法

Java泛型的使用方法主要包括类型限定、类型推断、上界和下界等。

(1)类型限定

类型限定是指在定义泛型时,限定数据类型的范围,可以使用extends和super关键字来进行限定。其中,extends表示上界,super表示下界。
例如:

public class ClassName<T extends Number> { ... }
public void methodName(List<? super Integer> list) { ... }

其中,ClassName类中的T参数表示传入的类型必须是Number或其子类,methodName方法中的List参数表示传入的List集合中的元素必须是Integer或其父类。

(2)类型推断

类型推断是指在使用泛型时,根据上下文自动推断类型参数的具体类型,例如:

List<Integer> list = new ArrayList<>();

在这个例子中,由于定义了List类型的变量,所以编译器会自动推断出ArrayList的类型参数为Integer。

(3)上界和下界

上界和下界是指在定义泛型时,限定数据类型的上界和下界。其中,上界表示泛型类型必须是某个类或其子类,下界表示泛型类型必须是某个类或其父类。
例如:

public <T extends Number> void methodName(T t) { ... }
public void methodName(List<? super Integer> list) { ... }

4.注意事项

在使用Java泛型时,需要注意以下几点。
1.泛型类型擦除
Java泛型在编译时会将泛型类型擦除,即将泛型类型转换为原始类型,这可能会导致一些类型安全问题。
2.不能使用基本数据类型
由于泛型在编译时会将类型转换为Object类型,所以不能使用基本数据类型作为泛型参数,只能使用其对应的包装类。
3.不能创建泛型数组
由于泛型在编译时会将泛型类型擦除,所以不能创建泛型数组,只能创建通配符数组或使用ArrayList等集合类。


5.总结

Java泛型是Java 5中引入的一个重要特性,它可以提高程序的可读性和可维护性,同时还可以在编译时检查类型安全。在使用Java泛型时,需要了解其基本概念、语法、使用方法和注意事项等方面的知识点,才能更好地应用于实际开发中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值