千峰教育2218期2202.11.11

[TOC]

复习

String 字符串
	字符串是一个常量,调用和执行过程中,数据不可修改,并且 Java 中规定, 英文双引号包含的字符串内容,内容一致,
	在整个程序运行过程中,当前字符串常量有且只有一个。
	
	【要求】
		字符串内容不允许使用 == ,有且只能使用 equals
		字符串方法:
			获取
				int length();
				char charAt(int index);
				int indexOf(int ch);
				int lastIndexOf(int ch);
				int indexOf(String str);
				int lastIndexOf(String str);
				String substring(int begin);
				String substring(int begin,i nt end);
			判断
				boolean endsWith(String str);
				boolean startsWith(String str);
				booleam isEmpty();
				boolean contains(String str);
				boolean equals(Object obj);//Override equals in Type Object;
				boolean equalsIgnoreCase(String str);
			
			
			转换
				String(char[] arr);
				String(char[] arr, int offset, int length);
				public static String valueOf(char[] arr);
				public static String valueOf(char[] arr, int offser, int length);
				char[] toCharArray();
			
			其他
				String replace(char oldChar, char newChar);
				String[] split(String str);
				String toUpperCase();
				String toLowerCase();
				String trim();
			

集合
	为什么要用集合,主要解决的是数据的能力问题
	数组弊端
		1. 容量受限,数组一旦确定容量不能修改
		2. 数组类型支持单一,一旦明确支持的数据类型,无法修改
		3. 配套方法少,复用价值低
		4. 因数据类型单一,配套方法无法复用其他类型
	集合解决的问题
		1. 容量问题不需要程序员考虑,集合自行处理
		2. 集合支持数据类型多样化,同时在约束之后,满足数据类型一致化要求
		3. 集合配套方法,工具类,特殊操作众多
		4. 类型支持多样,方法支持复用,效率高
		
	interface  Collection
	--| interface List 有序,可重复
	----| class ArrayList<E>  可变长数组结构
	----| class LinkedList<E> 双项链表结构
	----| class Vector<E> 线程安全的,效率较低的,可变长数组结构
	
	--|interface Set 无序,不可重复
	----| class HashSet<E> 底层为哈希表结构
	----| class TreeSet<E> 底层为二叉树结构
	
	Collection 常用方法
	增
		add(E e);
		addAll(Collection<? extends E> c);
	删
		remove(Object obj);
		removeAll(Collection<?> c);
		retainAll(Collection<?> c);
		clear();
	查
		int size();
		boolean isEmpty();
		boolean contains(Object obj);
		boolean contains(Collection<?> c);
		Object[] toArray();

	List 集合
		有序 添加顺序和数据存储顺序一致,默认采用【尾插法】
		可重复 List 集合运行出现相同元素
		List 集合相较于 Collection 集合最大的特征就是引入的【下标操作】
		
		增
			add(E e);
			addAll(Collection<? extends E> c);
			add(int index, E e);
			addAll(int index, Collection<? extneds E> c);
		删
			E remove(int index);
			remove(Object obj);
			removeAll(Collection<?> c);
			retainAl(Collecttion<?> c);
			clear();
		改
			E set(int index, E e);
		查
			int size();
			boolean isEmpty();
			boolean contains(Object obj);
			boolean containsAll(Collection<?> c);
			Object[] toArray();
			E get(int index);
			List<E> subList(int fromIndex, int toIndex);
		int indexOf(Object obj);
		int lastIndexOf(Obejct obj);
		

List集合对比和Set集合

1. List 集合

1.1 List 集合概述
List 集合特征:
	1. 有序
	2. 可重复
	3. 存在下标相关操作
	
	
List 集合实现类:
	ArrayList
	 	底层是可变长数组结构 特征:增删慢,查询快
	LinkedList
		底层是双向链表结构   特征: 增删快,查询慢
	Vertor
		线程安全,性能较低的,可变长数据结构
	
1.2 ArrayList 可变长数组结构
1.21 ArrayList 概述
	底层是一个可变长数组结构,数组数据类型是 Object 类型,可以存储任意类型元素,同时所有可以给予当前数组进行数据添加操作的方法(add, addAll, set)限制泛型类型,同时集合中所有可以获取底层数组元素的方法也引入泛型约束(get, subList),保证集合存储数据类型一致化和集合数据获取类型一致化。
	底层数组扩容操作由 ArrayList 自行完成,扩容的流程:
		1. 方法参数为最小容量需求 minCapacity = size + 添加元素个数;
		2. 获取数据数组容量 oldCapacity
		3.计算得到新数组容量
			newCapacity = oldCapacity + oldCapacity / 2
			newCapacity = oldCapacity + (oldCapacity >> 1)
			数据右移一位(oldCapacity >> 1) <==> oldCapacity / 2
		4. 判断新数组容量是否满足最小容量需求
		5. 判断新数组容量是否超出 MAX_ARRAY_SIZE
		6. 创建新数组
		7. 从原数组中移动数组到新数组
		8.存储新数组地址
		
	ArrayList 集合因为底层结构为数组结构,所以性能上:增删慢,查询快
	
1.22 ArrayList 增删慢
增加慢:
	1.增加操作有可能会导致数组容量扩容,扩容操作中,数据从原数组移动到新数组中【时间效率低】
	【空间效率低】因为在扩容操作过程中,方法运行所需内存空间是原数组的 2.5 左右【1 + 1.5】,数据空间占用比较高,同时在执行数据复制移动操作之后,原数组数据空间需要收回
	2. 在指定下标位置添加元素,只要不是采用【尾插法】,从添加数据位置开始,之后元素需要整体向后移动,移动过程中【时间效率低】

删除慢:
	1. 指定元素删除操作,除末尾元素删除,其他任意一个位置元素删除之后,从删除位置开始所有数组元素整体向前移动。移动过程非常浪费时间【时间效率低】
	2. 删除操作.有可能会导致有效数据和数组底层容量比例失衡,以及空置的元素空间个数超过【阈值】
	3. 一旦触发缩容操作,同时会导致
		【时间效率低】 数据需要移动
		【空间效率低】 在缩容过程中,方法执行过程中空间占用较大,包括对于原数组空间释放需要时间
1.23 ArrayList 查询快
	ArrayList 底层是一个 Object 类型,同时有下标操作的的方式,可以根据数组首地址 + 下标 快速计算对应元素所在的内存地址,CPU 快速访问,效率极高
	ArrayList 查询快。
分析结构的特征主要为了选择更为合适合理的结构,处理存储对应数据。
1.3 LinkedList 双向链表结构
带有链表头的双向链表结构,整个链表结构有两个数据类型
	1. 链表头 	LinkedList<E>
    2. 结点    Node<E>
    
1.32 LinkedList 特征方法
addFirst(E e);
	在链表头添加符合实例化过程泛型约束元素
addLast(E e);
	在链表尾添加符合实例化过程泛型约束元素
E getFirst();
	获取链表头结点存储元素
E getLast();
	获取链表尾结点存储元素
E removeFrist();
	删除链表头结点,返回值是删除的元素
E removeLast();
	删除链表尾结点,返回值是删除的元素
package com.qfedu.a_list;

import java.util.LinkedList;

public class Demo1 {
	public static void main(String[] args) {
		LinkedList<String> list = new  LinkedList<String>();
		
		list.add("风花雪月");
		list.add("风花雪月");
		list.add("风花雪月");
		list.add("风花雪月");
		list.add("风花雪月");
		
		System.out.println(list);
		
		list.addFirst("沉鱼落雁");
		list.addLast("阴晴圆缺");
		System.out.println(list);
		
		System.out.println(list.getFirst());
		System.out.println(list.getLast());
		
		System.out.println(list.removeFirst());
		System.out.println(list.removeLast());
		
		System.out.println(list);
		
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值