自用 Java 学习 IO流前总结(集合)

目录

Arrays类

递归

Collection接口

迭代器遍历

增强for遍历

数据结构

LinkedList类特有方法

泛型

泛型的总结

泛型限定

Set集合

TreeSet类

二叉树  (很难理解)

红黑树(很难理解)

Map集合

Map集合的基本使用

Map集合的常见方法

Map集合的遍历

HashMap集合的底层原理

TreeMap集合的底层原理


集合是升级版的数组(这么理解应该是没有问题吧)

Arrays类

Arrays是一个工具类。Arrays类中提供了一些对数组进行操作的方法(比如:查找和排序)

public static int binarySearch(int[] array,int key)
    对数组的元素进行二分查找
public static void sort(int[] array)
    对数组进行排序。
public static String toString(int[] array)
    把数组转换为字符串  格式:"[元素1,元素2,元素3]"

递归

方法自己调用自己,这种方式叫做递归。

这里也是代码思维的开始

Collection接口

Collection集合体系的根接口,该接口中定义了集合的通用方法。

迭代器遍历

在Java中所有的集合都可以使用迭代器(Iterator)进行遍历。

注意问题:

    当使用迭代器进行遍历集合的时候,集合自己不能去操作集合中的元素。
    Java不允许迭代器和集合自己并发的修改集合    
    否则java.util.ConcurrentModificationException(并发修改异常)

解决方案:
    使用迭代器自己的删除方法 it.remove()

Collection<String> coll=new ArrayList<>();

//添加元素
coll.add("土豆1");
coll.add("土豆2");
coll.add("土豆3");

//获取迭代器对象 (筷子)
Iterator<String> it = coll.iterator();

//判断是否有下一个元素
while (it.hasNext()){
    //获取元素
    String e = it.next();
    System.out.println(e);
} 

增强for遍历

增强for其实就是为了简化迭代器的代码书写,原理和迭代器一模一样。

Collection<String> coll=new ArrayList<>();
//添加元素
coll.add("土豆1");
coll.add("土豆2");
coll.add("土豆3");

//增强for
for(String s : coll){
    System.out.println(s);
}

数据结构

数据的组织方式就叫做数据结构,不同的组织方式就形式不同的数据结构,每一种数据结构的特点不一样。

栈结构:先进后出  (子弹夹)

队列结构:先进先出 (排队、安检机)
    
数组:查询快,增删慢

链表:查询慢,增删快(每一个元素记录下一个元素的地址

LinkedList类特有方法

由于 LinkedList底层是链表,新增了一些针对头和尾进行操作的方法。

public void addFirst(E e)
    添加元素到集合开头
public void addLast(E e)
    添加元素到集合末尾
​
public E removeFirst()
    移除开头的元素
public E removeLast()
    移除结尾的元素
​
public E getFirst()
    获取开头的元素
public E getLast()
    获取结尾的元素

 ---------------------------------------------------------------------------------------------------------

泛型

 Java中如果在写代码的时候,不知道数据类是什么类型,那么就可以使用泛型。泛型其实就是任意的数据类型。

泛型可以使用在哪些地方?
    泛型类: 在类名后面<T>, 它表示在类中有一个不确定的数据类型。
    泛型方法: 在方法的返回值前面<T>,它表示在方法中有一个不确定的数据类型
    泛型接口:在接口名后面<T>,它表示在接口中有一个不确定的数据类型

泛型的总结

1、类上的泛型<T>: 创建该类对象时,确定<T>的数据类型。

2.方法上的泛型<T>:调用方法的时候,确定<T>的数据类型。

3.接口上的泛型<T>:
    1)在实现类上确定<T>的数据类型
    2)把泛型<T>沿用到实现类上,在创建实现类对象来确定<T>的数据类型

泛型限定

<?> 表示可以接收任意的类型
<? extends Number> 表示可以接收Number或者Number的子类
<? super Number> 表示可以接收Number或者Number的父类

通配符

--------------------------------------------------------------------------------------------------------

Set集合

Set集合的特点:没有索引,元素不能重复
    --HashSet:元素是没有顺序
    --TreeSet:它可以对集合中的元素进行排序

TreeSet类

TreeSet集合可以对元素进行排序。有两种排序方式。

自然排序:让元素的类实现Comparable接口,复写compareTo方法

public class Student implements Comparable<Student>{
    private String name;
    private int age;
    private int score;

    //省略构造方法,自己加上即可

    //实现Comparable接口重写方法来告诉TreeSet排序的规则
    @Override
    public int compareTo(Student o) {
        //先按照成绩排序,
        int num=this.score-o.score;
        //如果成绩相同,再按照年龄排序
        if(num==0){
            num=this.age-o.age;
        } 
        return num;
    }
}

比较器排序Comparator,让集合具备比较规则。


//创建TreeSet集合,同时指定排序规则 需要一个Comparator对象。
TreeSet<Teacher> ts=new TreeSet<>(new Comparator<Teacher>() {
    @Override
    public int compare(Teacher o1, Teacher o2) {
        //o1和o2 表示集合中已有的两个元素
        //按照年龄升序排列
        int num=o1.getAge()- o2.getAge();
        //如果年龄相同,就按照姓名进行比较
        if(num==0){
            num=o1.getName().compareTo(o2.getName());
            if(num==0){
                //...
            }
        }
        return num; 
    }
}); 

ts.add(new Teacher("zhagnasn",20));
ts.add(new Teacher("lisi",21));
ts.add(new Teacher("wangwu",22));
ts.add(new Teacher("aaaa",22));
ts.add(new Teacher("zhaoliu",24));
ts.add(new Teacher("zhaoliu",24));

for (Teacher t : ts) {
    System.out.println(t);
}


 

-------------------------------------------------------------------------------------------

二叉树  (很难理解)

二叉树: 每一个节点,它最多有两个子节点

二叉查找树(二叉排序树、二叉搜索树):对于任意的一个节点,左边的子节点都比这个数小,右子节点都比这个数大。

二叉平衡树:每一个节点,左右两个子树的高度差不超过1
    
如果一个二叉树不平衡,如何达到平衡?
    左旋:如果右子树比左子树的高度差大于1,就需要左旋
    右旋:如果左子树比右子树的高度差大于1,就需要右旋
    
破坏平衡二叉树的几种情况,如何再次达到平衡
    左左:在左子树的左边添加元素,直接右旋即可
    左右:在左子树的右边添加元素,先左旋再右旋
    
    右右:在右子树的右边添加元素,直接左旋即可
    右左:在右子树的左边添加元素,先右旋再左旋

红黑树(很难理解)

红黑树的规则:
    1.每一个节点都是红色或者黑色
    2.如果一个节点没有子节点或者父节点,该节点的子节点(Nil),叶子节点都是黑色
    3.根节点是黑色
    4.对于一个红色节点,它的子节点都是黑色
    5.对任意的节点,到其叶子节点的简单路径,包含相同的黑色节点数目。
    
红黑树添加元素:元素默认的颜色是红色

Map集合

Map表示的是双列集合,集合中的元素是成对出现的,一对元素包括【键和值】

Map集合中键是不能重复的,但是值是可以重复的。

Map接口
    HashMap类
    TreeMap类

Map集合的基本使用

//键和值都是String类
Map<String,String> map=new HashMap<>();

//添加元素
map.put("猪八戒","高老庄");
map.put("孙悟空","花果山");
map.put("沙和尚","流沙河");

Map集合的常见方法

public V put(K key, V value) 
    把键和值添加到Map集合中; 如果键重复,新的值会替换旧的值。
    把被修改的值返回。
public V get(Object key) 
     根据键或者值;如果找不到就返回null
public V remove(Object key) 
     根据键删除【键值对】
     返回被删除的值。
public void clear() 
    清空集合的所有【键值对】

public int size()  
    获取Map集合中有多少个【键值对】
public boolean containsKey(Object key) 
     判断是否包含键
public boolean containsValue(Object value) 
     判断是否包含值

Map集合的遍历

通过键获取值的方式遍历Map集合

HashMap<String,String> map=new HashMap<>();
map.put("李晨","范冰冰");
map.put("贾乃亮","李小璐");
map.put("王宝强","马蓉");

//获取所有的键组成的Set集合
Set<String> keys = map.keySet();
for (String key : keys) {
    //通过键获取值
    String value = map.get(key);
    System.out.println(key+"...."+value);

通过获取【键值对】的方式遍历Map集合

public Set<Map.Entry<K,V>> entrySet()  
    获取Map集合中所有的Entry对象,一个Entry对象表示一个【键值对】.

//获取Entry对象的集合,Entry对象表示【键值对】
Set<Map.Entry<String, String>> entrys = map.entrySet();

//遍历Set集合
for (Map.Entry<String, String> entry : entrys) {
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key+"...."+value);
}

HashMap集合的底层原理

通过查看源代码发现,HashSet集合底层其实就是HashMap集合,所以HashSet的底层原理和HashMap的底层原理是一模一样的。

HashMap集合的特点
    1.键不能重复
    2.保证键的唯一性通过复写键的hashCode和equals方法

TreeMap集合的底层原理

通过查看源代码发现, TreeSet集合底层其实就是TreeMap集合,所以TreeSet的底层原理和HashMap的底层原理是一模一样的。

TreeMap集合的特点
    1.可以对键进行排序
    2.键的排序方式,可以使用自然排序Comparable和比较器排序Comparator

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值