目录
七、ArrayList、LinkedList和Vector的区别
UML(Unified Modeling Language)是一种用于软件系统设计和建模的标准化语言。它提供了一种统一的方法来描述系统的结构和行为,以便于开发人员、设计师和其他利益相关者之间的沟通和理解。
UML包括多种图形符号,如用例图、类图、时序图、活动图等,每种图形符号都用于表示系统的不同方面和视图。通过使用这些图形符号,开发人员可以更好地理解系统的需求、结构和行为,从而更好地进行系统设计和开发。
有序:List集合数据存进去的顺序和取出来的顺序一致
- List lst=new ArrayList();
- lst.add(2);
- lst.add(1);
- lst.add(5);
- lst.add(8);
- System.out.println(lst);
不唯一:List集合数据允许添加重复数据
- List lst=new ArrayList();
- lst.add(2);
- lst.add(1);
- lst.add(5);
- lst.add(8);
- lst.add(8);
- System.out.println(lst);
for
- List lst=new ArrayList();
- lst.add("zs");
- lst.add("ls");
- lst.add("ww");
- for (int i = 0; i < lst.size(); i++) {
- System.out.println(lst.get(i));
- }
foreach
- List lst=new ArrayList();
- lst.add("zs");
- lst.add("ls");
- lst.add("ww");
- for (String str : lst) {
- System.out.println(str);
- }
迭代器
- List lst=new ArrayList();
- lst.add("zs");
- lst.add("ls");
- lst.add("ww");
- Iterator iterator = lst.iterator();
- while(iterator.hasNext())
- System.out.println(iterator.next());
for正向删除
- List lst=new ArrayList<>();
- lst.add(12);
- lst.add(13);
- lst.add(14);
- lst.forEach(System.out::println);
- System.out.println("删除之前集合大小:"+lst.size());
- int size = lst.size();
- for (int i = 0; i
- lst.remove(0);
- }
- System.out.println("删除之后集合大小:"+lst.size());
-
for逆向删除
- List lst=new ArrayList<>();
- lst.add(12);
- lst.add(13);
- lst.add(14);
- lst.forEach(System.out::println);
- System.out.println("删除之前集合大小:"+lst.size());
- int size = lst.size()-1;
- for (int i = size; i >=0; i--) {
- lst.remove(i);
- }
- System.out.println("删除之后集合大小:"+lst.size());
-
迭代器删除
- List lst=new ArrayList<>();
- lst.add(12);
- lst.add(13);
- lst.add(14);
- lst.forEach(System.out::println);
- System.out.println("删除之前集合大小:"+lst.size());
- Iterator
iterator = lst.iterator(); - //判断下一个元素是否存在
- while(iterator.hasNext()) {
- //若存在,移动到下一个元素位置
- //易出错
- iterator.next();
- //删除元素
- iterator.remove();
- }
- System.out.println("删除之后集合大小:"+lst.size());
4.优化
List集合优化目的在于利用合理的存储空间存下所有元素数据,不多不少,不造成空间浪费。
概念:初始化大小10、负载因子1.5、向下取整
公式:容器大小*1.5倍
例如:10*1.5=15、15*1.5=22、22*1.5=33 ...
- public static void main(String[] args) {
- List lst=new ArrayList<>();
- for (int i = 0; i < 50; i++) {
- lst.add(i);
- System.out.println(i);
- getLen(lst);
- }
- }
-
- public static void getLen(List lst){
- try {
- Class extends List> lstClass = lst.getClass();
- Field field = lstClass.getDeclaredField("elementData");
- field.setAccessible(true);
- Object[] obj = (Object[]) field.get(lst);
- System.out.println("集合的大小是:"+obj.length);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
四、迭代器原理
List集合迭代器是用来遍历List集合中的元素的工具。它可以按顺序访问List中的每个元素,而不需要知道List的内部结构。迭代器通常包含hasNext()和next()两个方法,前者用来判断是否还有下一个元素,后者用来获取下一个元素。
关于List集合迭代器的原理,它通常是基于List的数据结构实现的。在遍历过程中,迭代器会维护一个指向当前元素的指针,每次调用next()方法时,指针会移动到下一个元素。迭代器还会记录遍历的状态,以便正确地返回hasNext()方法的结果。
五、泛型
JDK1.5版本以上才有
- 以类型为参数的类叫做泛型
- 泛型的默认类型为Object
- 作用:提高程序的健壮性、简化代码
使用 List 集合时,可以通过指定泛型来限制集合中存储的元素类型。这样可以在编译时就能发现类型不匹配的错误,提高代码的稳定性和可读性。
例如,我们可以创建一个存储整数类型的 List 集合:
- List
list = new ArrayList<>(); - list.add(1);
- list.add(2);
- list.add(3);
-
- for (Integer num : list) {
- System.out.println(num);
- }
这样就可以确保集合中只能存储整数类型的元素,如果尝试存储其他类型的元素会在编译时报错。
六、装拆箱
当我们将基本数据类型(如int、float等)存储在List集合中时,会发生装箱操作,即将基本数据类型转换为对应的包装类(如Integer、Float等)。而当我们从List集合中取出包装类并转换为基本数据类型时,会发生拆箱操作。
示例:送快递,寄快递时需要对物品进行包裹,收快递后就需要对包裹进行拆包。
-
装箱(值类型到引用类型 )
- int a=10;
- Integer b=new Integer(a);
-
拆箱(引用类型到值类型 )
- Integer c=new Integer(10);
- int d=c.intValue();
七、ArrayList、LinkedList和Vector的区别
ArrayList和Vector的区别
ArrayList和Vector都是实现了List接口的动态数组,它们之间的主要区别在于线程安全性和性能。
- 线程安全性:
- ArrayList是非线程安全的,即在多线程环境下使用ArrayList可能会导致并发访问异常(ConcurrentModificationException)。
- Vector是线程安全的,它的方法都是同步的,可以在多线程环境下安全地使用。
- 性能:
- ArrayList相对于Vector在性能上更好,因为Vector的方法都是同步的,会带来额外的开销。
- 在单线程环境下,ArrayList的性能更优。
代码示例:
- // ArrayList的使用
- List
arrayList = new ArrayList<>(); - arrayList.add("A");
- arrayList.add("B");
- arrayList.add("C");
-
- // Vector的使用
- List
vector = new Vector<>(); - vector.add("X");
- vector.add("Y");
- vector.add("Z");
LinkedList和Vector的区别
LinkedList和Vector都是Java中的集合类,但它们有一些区别:
-
数据结构:LinkedList是基于链表实现的,而Vector是基于数组实现的。
-
线程安全性:Vector是线程安全的,而LinkedList不是线程安全的。
-
扩容机制:Vector在扩容时会增加原数组大小的一半,而LinkedList在插入元素时只需要调整相邻节点的指针。
-
遍历性能:LinkedList在遍历时需要遍历整个链表,而Vector在遍历时可以通过索引直接访问元素。
-
插入和删除操作:LinkedList在任意位置插入和删除元素的性能更好,而Vector在中间插入和删除元素时需要移动其他元素。
代码示例:
- // 创建一个LinkedList
- LinkedList
linkedList = new LinkedList<>(); - linkedList.add("A");
- linkedList.add("B");
- linkedList.add("C");
-
- // 创建一个Vector
- Vector
vector = new Vector<>(); - vector.add("X");
- vector.add("Y");
- vector.add("Z");
-
- // 遍历LinkedList
- for(String str : linkedList) {
- System.out.println(str);
- }
-
- // 遍历Vector
- for(String str : vector) {
- System.out.println(str);
- }