0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

Java基础笔记 - 增强的for循环For each循环 自动装箱拆箱 可变参数

1、For each循环:

JDK5.0中提供的新特性For each循环的加入简化了集合的遍历。

1.1、语法:

1
2
3
4
5
for(type element : array){

System.out.println(element);

}

1.2、For each循环的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void main(String[] args) {
List<String> arrayList = new ArrayList<String>();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");

//普通的循环方式
for(int i=0; i<arrayList.size(); i++){
System.out.println(arrayList.get(i));
}

//使用For each循环
for(String element : arrayList){
System.out.println(element);
}
}

1.3、嵌套For each循环:

1
2
3
4
5
6
int[][] array = { {1,2,3},{1,2}};
for(int[] row : array){
for(int element : row){
System.out.println(element);
}
}

1.4、三种循环遍历集合的列举:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//普通的循环方式
for(int i=0; i<arrayList.size(); i++){
System.out.println(arrayList.get(i));
}

//迭代循环
for(Iterator<String> iter = arrayList.iterator(); iter.hasNext();){
System.out.println(iter.next());
}

//使用For each循环
for(String element : arrayList){
System.out.println(element);
}

1.5、增强的for循环的缺点:

失去了索引信息,不能获取到索引值,只能这样获取:

1
2
3
4
5
6
//使用For each循环
int i = 0;
for(String element : arrayList){
System.out.println(i + element);
i++;
}

因为增强的for循环会丢失下标信息,所以当遍历集合或数组时,如果需要方法集合或数组的下标,最好使用旧式的方式来实现循环或遍历。

2、自动装箱/拆箱(Autoboxing/unboxing):

自动装箱/拆箱打打方便类基本类型数据和它们包装类的使用。

自动装箱:把基本数据类型转换为包装类。

自动拆箱:把包转类型自动转换为基本数据类型。

2.1、自动装箱:

1
2
3
4
5
//自动装箱
Collection<Integer> c = new ArrayList<Integer>();
c.add(1);
c.add(2);
c.add(3);

2.2、自动拆箱:

1
2
3
4
//自动拆箱
for(Integer integer : c){
System.out.println(integer);
}

2.3、Integer类相关的源代码:

2.3.1、valueOf方法:

1
2
3
4
5
6
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}

这里对应-128~127的整数调用了IntegerCache.cache[i + 128];详细代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private static class IntegerCache {
static final int high;
static final Integer cache[];

static {
final int low = -128;

// high value may be configured by property
int h = 127;
if (integerCacheHighPropValue != null) {
// Use Long.decode here to avoid invoking methods that
// require Integer's autoboxing cache to be initialized
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - -low);
}
high = h;

cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}

private IntegerCache() {}
}

其主要的功能就是把-128~127的整数缓存起来,当要使用这些数字时,就从这些缓存中获取。

由此可知下面代码运行的结果为true:

1
2
3
Integer m = 127;
Integer n = 127;
System.out.println(m == n);

而下面的代码则为false:

1
2
3
Integer m = 128;
Integer n = 128;
System.out.println(m == n);

3、可变参数:

可变参数使得可以声明一个接受一个可变数目参数的方法。

可变参数必须是方法声明中的最后一个参数。

3.1、包含可变参数的函数:

1
2
3
4
5
6
7
public static int add(int... arrays){
int sum = 0;
for(Integer integer : arrays){
sum += integer;
}
return sum;
}

可变参数部分相当于数组。

3.2、接收参数:

可以为多个参数或数组:

1
2
3
4
//传递数组
add(new int[]{1,2,3});
//传递参数
add(1,2,3);

3.3、说明:

可变参数本质上是一个数组,声明了可变参数的方法,既可以传递离散的值,也可以传递一个数组对象。

可变参数必须作为方法参数的最后一个参数。

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法