这是我当作为小组长的一次培训,在此先列个提纲
1.首先 循环 JAVA里中的的循环有while for 和增强for循环 这里先不讲增强for循环了
增强for循环确实遍历数组比较容易,但不能获取其下标来进行其他操作 所以不建议初学者常用增强for循环
而且增强for循环有一些坑,我们来看一下它的原理
Integer i; 定义一个临时变量i
Iterator iterator = list.iterator(); 获取List的迭代器
iterator.hasNext(); 判断迭代器中是否有未遍历过的元素
i = (Integer)iterator.next(); 获取第一个未遍历的元素,赋值给临时变量i
System.out.println(i) 输出临时变量i的值
增强for循环通过迭代器实现,那么必然有迭代器的特性
Java中有fail-fast机制。在使用迭代器遍历元素的时候,在对集合进行删除的时候一定要注意,使用不当有可能发生ConcurrentModificationException,这是一种运行时异常,编译期并不会发生。只有在程序真正运行时才会爆发。
在这里Iterator是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。
但你可以使用 Iterator 本身的方法 remove() 来删除对象,Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
正确的在遍历的同时删除元素的姿势:
Iterator
只要while中的表达式成立 就会不断地循环执行
//打印0到4
int i = 0;
while(i<5){
System.out.println(i);
i++;
}
而do while循环
与while的区别是,无论是否成立,先执行一次,再进行判断
//打印0到4
//与while的区别是,无论是否成立,先执行一次,再进行判断
int i = 0;
do{
System.out.println(i);
i++;
} while(i<5);
普通for循环
//使用for打印0到4
for (int j = 0; j < 5; j++) {
System.out.println("for 循环输出的"+j);
}
来看一下for循环的结构
for(单次表达式;条件表达式;末尾循环体)
{
中间循环体;
}
其中,表示式皆可以省略,但分号不可省略,因为“;”可以代表一个空语句,省略了之后语句减少,即为语句格式发生变化,则编译器不能识别而无法进行编译。
单次表达式是一个不参与循环的表达式。
一般作为某一变量的初始化赋值语句
而第二个表达式即关系表达式 作为循环的正是开端
当条件表达式成立时执行中间循环体
中间循环体只有一个语句的时候可以省略大括号
不过不建议这么做,只是看别人代码的时候要知道
最后再执行第三个表达式 再进入到第二个表达式来进行判断
JAVA中与C不同 在JAVA中 可以在for循环的第一个表达式中带着声明和赋值。而C必须要先在循环外赋值。
直接在c中声明会报错
“for”循环初始声明只允许在c99或c11模式下使用
这一般和编译器的版本有关。
数组是一个固定长度的,包含了相同类型数据的 容器
//声明一个引用
int[] a;
//创建一个长度是5的数组,并且使用引用a指向该数组
a = new int[5];
int[] b = new int[5]; //声明的同时,指向一个数组
数组是基零的
a[0]= 1; //下标0,代表数组里的第一个数
a[1]= 2;
a[2]= 3;
a[3]= 4;
a[4]= 5;
其范围是0到长度-1
分配空间同时赋值
//写法一: 分配空间同时赋值
int[] a = new int[]{100,102,444,836,3236};
//写法二: 省略了new int[],效果一样
int[] b = {100,102,444,836,3236};
3.排序
冒泡排序法
(获取数组长度的方法 数组名.length)
for (int j = 0; j < a.length; j++) {
for (int i = 0; i < a.length-j-1; i++) {
if(a[i]>a[i+1]){
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
思路:
冒泡法排序的思路:
第一步:从第一位开始,把相邻两位进行比较
如果发现前面的比后面的大,就把大的数据交换在后面,循环比较完毕后,最后一位就是最大的
第二步: 再来一次,只不过不用比较最后一位