Java核心技术-泛型、集合

Day10

泛型程序设计

对于Java泛型的转换需要记住一下几个事实:

  1. 虚拟机中没有泛型,只有普通的类和方法
  2. 所有的类型参数都会替换为他们的限定类型
  3. 会合成桥方法来保持多态
  4. 为保持类型安全性,必要时会插入强制类型转换
  5. 泛型不支持基本数据类型

Day11

集合

迭代器

package cn.gyk;
import java.util.ArrayList;
/**
* @author Pickled
* @version V1.0
* @date 2022/6/5 14:11
*/
public class Iterator {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList<Integer>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(4);
java.util.Iterator iterator = arrayList.iterator();
iterator.forEachRemaining(System.out::println);
}
}

集合在remove之前不调用next是不合法的

remove方法将删除刚刚被访问过的元素

package cn.gyk;
import java.util.Iterator;
import java.util.LinkedList;
/**
* @author Pickled
* @version V1.0
* @date 2022/6/6 17:22
*/
public class ListDemo1 {
public static void main(String[] args) {
var staff = new LinkedList<String>();
staff.add("Amy");
staff.add("Bob");
staff.add("Carl");
Iterator<String> iterator = staff.iterator();
String first = iterator.next();
String second = iterator.next();
iterator.remove();;
System.out.println(staff);
}
}

ListIterator接口可以提供反向遍历链表

import org.testng.annotations.Test;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
/**
* @author Pickled
* @version V1.0
* @date 2022/6/6 17:27
*/
public class ListTest {
@Test
public void test1(){
var staff = new LinkedList<String>();
staff.add("Amy");
staff.add("Bob");
staff.add("Carl");
ListIterator<String> iterator = staff.listIterator();
iterator.next();
iterator.add("Juliet");
iterator.add("Tom");
System.out.println(staff);
//多次调用 add 依次把元素添加到该迭代器位置之前
//[Amy, Juliet, Tom, Bob, Carl]
//而iterator接口只是将元素添加到集合的尾部
//链表域泛型集合之间还是有很大区别
}
}

通常需要用整数索引访问元素时,通常不使用链表,但是LinkedList还是有一个get方法,但是这个方法效率极低,是一个一个遍历链表查找的,但是做了一个小小的优化,当n大于size的二分之一时,就从尾部开始遍历。

对于LinkedList可以使用ListIterator类实现从两个方向遍历链表中的元素

import org.testng.annotations.Test;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
/**
* @author Pickled
* @version V1.0
* @date 2022/6/6 17:27
*/
public class ListTest {
@Test
public void test1(){
var staff = new LinkedList<String>();
staff.add("Amy");
staff.add("Bob");
staff.add("Carl");
ListIterator<String> iterator = staff.listIterator();
iterator.next();
iterator.add("Juliet");
iterator.add("Tom");
System.out.println(staff);
iterator.set("AAA");
System.out.println(staff);
//多次调用 add 依次把元素添加到该迭代器位置之前
//[Amy, Juliet, Tom, Bob, Carl]
}
@Test
public void test2(){
var a = new LinkedList<String>();
a.add("Amy");
a.add("Carl");
a.add("Erica");
var b = new LinkedList<String>();
b.add("Bob");
b.add("Doug");
b.add("Frances");
b.add("Gloria");
ListIterator<String> aIter = a.listIterator();
Iterator<String> bIter = b.iterator();
while(bIter.hasNext()){
if(aIter.hasNext()){
aIter.next();
}
aIter.add(bIter.next());
System.out.println(a);
}
bIter = b.iterator();
while(bIter.hasNext()){
bIter.next();
if(bIter.hasNext()){
bIter.next();
bIter.remove();
}
}
System.out.println(b);
a.removeAll(b);
System.out.println(a);
}
}
[Amy, Bob, Carl, Erica]
[Amy, Bob, Carl, Doug, Erica]
[Amy, Bob, Carl, Doug, Erica, Frances]
[Amy, Bob, Carl, Doug, Erica, Frances, Gloria]
[Bob, Frances]
[Amy, Carl, Doug, Erica, Gloria]

ArrayList

相比于ArrayList,Vector所有的方法都是同步的,可以安全的从两个线程访问一个Vector对象。但是ArrayList是不同步的。

装填因子

散列表中所含元素的个数和散列表大小的比值

posted @   破忒头头  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示