1.增强for循环
A 好处:简化数组和Collection集合的遍历
B 格式:
for(元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}
C 底层:增强for循环底层依赖的是迭代器(Iterator)
D 迭代的几种方法
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("cat");
arrayList.add("dog");
arrayList.add("tiger");
arrayList.add("monkey");
arrayList.add("octopus");
(1)简单for循环
for (int i = 0; i < arrayList.size(); i++) {
if ("cat".equals(arrayList.get(i))) {
System.out.println(arrayList.remove(i--)); //通过索引删除元素
}
}
System.out.println(arrayList);
注意:remove的时候索引要--
(2)利用迭代器
Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()) {
String string = (String) iterator.next();
if ("cat".equals(string)) {
iterator.remove();
}
}
System.out.println(arrayList);
注意:需要迭代器remove
(3)利用增强for循环(foreach)
for (String string : arrayList) {
if ("cat".equals(string)) {
arrayList.remove("cat");
}
}
System.out.println(arrayList);
①数组利用foreach遍历
int [] arr= {1,2,3,4,5};
for (int i : arr) {
System.out.print(i+" ");
}
②对象利用foreach遍历
ArrayList<Person> arrayList2 = new ArrayList<Person>();
arrayList2.add(new Person("zansan", 10));
arrayList2.add(new Person("wangwu", 10));
arrayList2.add(new Person("lisi", 10));
arrayList2.add(new Person("zhaoliu", 10));
for (Person person : arrayList2) {
System.out.println(person);
}
③ String类型利用foreach遍历
ArrayList<String> arrayList3 = new ArrayList<String>();
arrayList3.add("zs");
arrayList3.add("lisi");
arrayList3.add("wangwu");
for (String string : arrayList3) {
System.out.println(string);
}
2.集合和数组相互转化
①集合转化为数组
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("zy");
arrayList.add("zs");
arrayList.add("ls");
String[] array = arrayList.toArray(new String[0]);//利用集合.toArray()方法
//当集合转换数组时,数组长度如果是小于等于集合的size时,转换后的数组长度等于集合的size
//如果数组的长度大于了size,分配的数组长度就和你指定的长度一样
for (String string : array) {
System.out.println(string);
}
注意:
1.利用集合.toArray()方法,将集合转化为数组
2.集合转化为数组的时候,数组的长度需要指定
②数组转化为集合
Integer [] arr= {1,2,4,3,5};
List<Integer> asList = Arrays.asList(arr); //将数组转换成集合,数组必须是引用数据类型
//利用Arrays.asList()将数组转换为集合
for (Integer is : asList) {
System.out.println(is);
}
注意:
①将数组转换成集合,数组必须是引用数据类型
②利用Arrays.asList()将数组转换为集合
3.ArrayList和LinkedList区别
从使用方法的角度分析
ArrayList属于非线程安全,而Vector则属于线程安全。如果是开发中没有线程同步的需求,推荐优先使用ArrayList。因此其内部没有synchronized,执行效率会比Vector快很多。
从数据结构的角度分析
ArrayList是一个数组结构(Vector同理),数组在内存中是一片连续存在的片段,在查找元素的时候数组能够很方便的通过内存计算直接找到对应的元素内存。但是它也有很大的缺点。我们假设需要往数组插入或删除数据的位置为i,数组元素长度为n,则需要搬运数据n-i次才能完成插入、删除操作,导致其效率不如LinkedList。
LinkedList的底层是一个双向链表结构,在进行查找操作的时候需要花费非常非常多的时间来遍历整个链表(哪怕只遍历一半),这就是LinkedList在查找效率不如ArrayList快的原因。但是由于其链表结构的特殊性,在插入、删除数据的时候,只需要修改链表节点的前后指针就可以完成操作,其的效率远远高于ArrayList。
LinkedList类特有功能
public void addFirst(E e)及addLast(E e)
public E getFirst()及getLast()
public E removeFirst()及public E removeLast()
public E get(int index);
4.泛型
A:泛型好处
1.提高安全性(将运行期的错误转换到编译期) 2.省去强转的麻烦
B:泛型基本使用
<>中放的必须是引用数据类型
C:泛型使用注意事项
前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
D:
把泛型定义在类上
定义格式:public class 类名<泛型类型1,…>
把泛型定义在方法上
定义格式:public <泛型类型> 返回类型 方法名(泛型类型 变量名)
把泛型定义在接口上
定义格式:public interface 接口名<泛型类型>
E:泛型通配符
<?> 任意类型,如果没有明确,那么就是Object以及任意的Java类了
? extends E 向下限定,E及其子类
? super E 向上限定,E及其父类
5.静态导入
格式:import static 包名….类名.方法名; 可以直接导入到方法的级别
注意事项:方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂
6.可变参数
定义方法的时候不知道该定义多少个参数
格式:修饰符 返回值类型 方法名(数据类型… 变量名){}
注意事项:
这里的变量其实是一个数组
如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
7.ArrayList嵌套ArrayList
ArrayList<ArrayList<Person>> personArrayList=new ArrayList<>();
ArrayList<Person> first1=new ArrayList<>();
first1.add(new Person("zy",11));
first1.add(new Person("zs",22));
first1.add(new Person("zr",33));
first1.add(new Person("zj",44));
ArrayList<Person> first2=new ArrayList<>();
first1.add(new Person("zy1",11));
first1.add(new Person("zs1",22));
first1.add(new Person("zr1",33));
first1.add(new Person("zj1",44));
personArrayList.add(first1);
personArrayList.add(first2);
//利用foreach遍历
for (ArrayList<Person> p : personArrayList) {
for (Person l : p) {
System.out.println(l);
}
}
}
其中ArrayList和LinkedList的区别摘自:https://blog.csdn.net/u012814441/article/details/80671604
网友评论