JAVA学习第三次记录

1数据结构


队列
数组 :有序的元素序列;长度固定。
链表linked list :每一个Node 包含一个数据源(存储数组),两个指针域(存储地址)
自己的地址 | 数据 | 下一个节点的地址
单向链表:无序
双向链表:有序
红黑树:红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树
特点:趋近于平衡树,查询速度非常快,查询叶子节点最大次数和最小次数不能超过2倍。

2 List接口

特点
1.有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123)
2.有索引,包含了一些带索引的方法
3.允许存储重复的元素
带索引的方法(特有)
public void add(int index, E element) 将指定的元素,添加到该集合中的指定位置上。
public E get(int index)
public E remove(int index)
public E set(int index, E element)
防止索引越界异常
IndexOutOfBoundsException:索引越界异常,集合会报
ArrayIndexOutOfBoundsException:数组索引越界异常
StringIndexOutOfBoundsException:字符串索引越界异常

2.1LinkedList集合

特点
1.底层是一个双向链表结构:查询慢,增删快
2.里边包含了大量操作首尾元素的方法
注意:使用LinkedList集合特有的方法,不能使用多态
public void addFirst(E e)
public void addLast(E e)
public void push(E e)
public E getFirst()
public E getLast()
public E removeFirst()
public E removeLast()
public E pop()
public boolean isEmpty()

2.2Vector集合

特点 底层是一个数组

3 Set接口

特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历

3.1HashSet

特点
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历(遍历用Iterator)

Iterator<Integer> it = set.iterator(); //set为Hashset的一个实例
while (it.hasNext()){
    Integer n = it.next();
    System.out.println(n);
}

3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4.底层是一个哈希表结构(查询的速度非常的快)

存储数据的结构(哈希表)

  1. 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)

在Object类有一个方法,可以获取对象的哈希值:hashCode方法
public native int hashCode();
native : 代表该方法调用的是本地操作系统的方法
toString方法的源码:
return getClass().getName() + "@" + Integer.toHexString(hashCode());

  1. 在JDK1.8之前: 数组+链表
    在JDK1.8之后: 数组+链表+红黑树
    当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间

  2. Set 集合在调用add 方法会调用元素的hashCode方法和equals方法,判断元素是否重复。

  3. 存储自定义类型元素
    给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

3.2LinkedHashSet

特点
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序

4 可变参数(VarArgs)

使用前提:
当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数.
使用格式: 定义方法时使用
修饰符 返回值类型 方法名(数据类型…变量名){}
public static int add(int...arr){}
可变参数的原理:
可变参数底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数
传递的参数个数,可以是0个(不传递),1,2…多个

可变参数的注意事项
1.一个方法的参数列表,只能有一个可变参数
2.如果方法的参数有多个,那么可变参数必须写在参数列表的末尾
public static void method(String b,double c,int d,int...a){}
可变参数的特殊(终极)写法
public static void method(Object...obj){}

5 集合工具类

  1. public static <T> boolean addAll(Collection<T> c, T... elements) 往集合中添加一些元素 ; addAll( , )
  2. public static void shuffle(List<?> list) 打乱集合顺序 ; shuffle(list)
  3. public static <T> void sort(List<T> list) 将集合中元素按照默认规则排序,默认是升序 ; sort(list)
    使用前提 被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则
public class Person implements Comparable<Person>{
	@Override
	public int compareTo(Person o) {
		//return 0;//认为元素都是相同的
		//return this.getAge() - o.getAge();//年龄升序排序
		return o.getAge() - this.getAge();//年龄降序排序
    }
}

Comparable接口的排序规则: 自己(this)-参数: 升序;参数-自己(this) : 降序
4. public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序 ; sort(list, )

Collections.sort(list01, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
    //return o1-o2;//升序
    return o2-o1;//降序
    }
});
 Collections.sort(list02, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
    int result =  o1.getAge()-o2.getAge();
    if(result==0){  // 升序
        result =  o1.getName().charAt(0)-o2.getName().charAt(0);
    	}
    return  result;
    }
});
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值