Java入门基础16:集合框架1(Collection集合体系、List、Set)

news2024/11/24 15:28:04

集合体系结构

Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。

collection集合体系

Collection的常用方法

package com.itchinajie.d1_collection;

import java.util.ArrayList;
import java.util.HashSet;

/*
* 目标:认识Collection体系的特点。
* */
public class CollectionTest1 {
    public static void main(String[] args) {
        //简单确认一下Collection集合的特点。
        ArrayList<String> list=new ArrayList<>();//有序 可重复 有索引
        list.add("java1");
        list.add("java2");
        list.add("java1");
        list.add("java2");
        System.out.println(list);

        HashSet<String>set = new HashSet<>();
        set.add("java1");
        set.add("java2");
        set.add("java1");
        set.add("java2");
        set.add("java3");
        System.out.println(set);
    }
}



package com.itchinajie.d1_collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

public class CollectionTest2API {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();// 多态写法
        //1.public boolean add(Ee):添加元素,添加成功返回true。
        c.add("java1");
        c.add("java1");
        c.add("java2");
        c.add("java2");
        c.add("java3");
        System.out.println(c);

    //2.public void clear():清空集合的元素。
    //c.clear();
    //system.out.println(c);

    //3.public boolean isEmpty():判断集合是否为空是空返回true,反之。
        System.out.println(c.isEmpty()); // false

    //4.public int size():获取集合的大小。
        System.out.println(c.size());

    //5.public boolean contains(object obj):判断集合中是否包含某个元素。
        System.out.println(c.contains("java1")); // true
        System.out.println(c.contains("Java1")); // false

    //6.public boolean remove(Ee):删除某个元素:如果有多个重复元素默认删除前面的第一个!
        System.out.println(c.remove( "java1"));
        System.out.println(c);

        //7.public Object [] toArray();把集合转换成数组
        Object[] arr = c.toArray();
        System.out.println(Arrays.toString(arr));

        String[] arr2 = c.toArray(new String[c.size()]);
        System.out.println(Arrays.toString(arr2));

        System.out.println("------------------------------------");
        //把一个集合的全部数据倒入到另一个集合中去。
        Collection<String>c1 = new ArrayList<>();
        c1.add("java1");
        c1.add("java2");
        Collection<String> c2 = new ArrayList<>();
        c2.add("java3");
        c2.add("java4");
        c1.addAll(c2);//就是把c2集合的全部数据倒入到c1集合中去。
        System.out.println(c1);
        System.out.println(c2);

    }
}

Collection的遍历方式

迭代器

迭代器是用来遍历集合的专用方式(数组没有迭代器),在到ava中迭代器的代表是Iterator

package com.itchinajie.d2_collection_traverse;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
* 目标:Collection集合遍历方式一:使迭代器Iterator遍历
* */
public class CollectionDemo1 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("赵敏");
        c.add("小昭");
        c.add("素素");
        c.add("灭绝");
        System.out.println(c);
    //c=[赵敏,小昭,素素,灭绝]
    //                                       it
    //使用迭代器遍历集合
    //1、从集合对象中获取迭代器对象。
        Iterator<String> it = c.iterator();
//        System.out.println(it.next());
//        System.out.println(it.next());
//        System.out.println(it.next());
//        System.out.println(it.next());
        //System.out.println(it.next());//出现异常的

        //2、我们应该使用循环结合迭代器遍历集合。
        while (it.hasNext()){
//            String ele = it.next();
//            System.out.println(ele);
            System.out.println(it.next());
        }
    }
}

增强for

增强for可以用来遍历集合或者数组。

增强for遍历集合,本质就是迭代器遍历集合的简化写法。

package com.itchinajie.d2_collection_traverse;

import java.util.ArrayList;
import java.util.Collection;

/*
 * 目标:Collection集合遍历方式二:增强for
 * */
public class CollectionDemo2 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("赵敏");
        c.add("小昭");
        c.add("素素");
        c.add("灭绝");
        System.out.println(c);
    //c=[赵敏,小昭,素素,灭绝]
    //                    ele
    //使用增强for遍历集合或者数组。
        for (String ele : c){
            System.out.println(ele);
        }

        String[] names = {"迪丽热巴","古力娜扎","稀奇哈哈"};
        for (String name : names){
            System.out.println(name);
        }
    }
}

Lambda表达式

得益于刊DK8开始的新技术Lambda表达式,提供了一种更简单、更直接的方式来遍历集合。

package com.itchinajie.d2_collection_traverse;

import java.util.ArrayList;
import java.util.Collection;

/*
* 目标:Collection集合的遍历方式三:JDK8开始新增的lambda表达式(forEach方法)
* */
public class CollectionDemo3 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("赵敏");
        c.add("小昭");
        c.add("殷素素");
        c.add("周芷若");
        System.out.println(c);
        //[赵敏,小昭,般素素,周芷若]
        //        s
        //default void forEach(Consumer<?superT>action): 结合Lambda表达式遍历集合:

//        c.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });
//        //简化
//        c.forEach((String s) -> {
//                System.out.println(s);
//        });
            //简化
//        c.forEach( s -> {
//            System.out.println(s);
//        });
            //简化
//        c.forEach( s -> System.out.println(s));

        c.forEach( System.out::println);



    }
}

List系列集合

List集合的特有方法 List集合因为支持索引,所以多了很多与索引相关的方法,当然,Collection的功能List也都继承了。

List集合的特有方法

package com.itchinajie.d3_collection_list;

import java.util.ArrayList;
import java.util.List;

/**
 目标:掌握List系列集合的特点,以及其提供的特有方法。
 */
public class ListTest1 {
    public static void main(String[] args) {
        //1.创建一个ArrayList集合对象(有序、可重复、有索引)
        List<String> list = new ArrayList<>();// 一行经典代码
        list.add("蜘蛛精");
        list.add("至尊宝");
        list.add("至尊宝");
        list.add("牛夫人");
        System.out.println(list);//【蜘蛛精,至尊宝,至尊宝,牛夫人]

        //2.public void add(int index,E element):在某个索引位置插入元素。
        list.add( 2,"紫霞仙子");
        System.out.println(list);

        //3.public E remove(int index):根据索引删除元素,返回被删除元素
        System.out.println(list.remove(2));
        System.out.println(list);

        //4.public E get(int index):返回集合中指定位置的元素。
        System.out.println(list.get(3));

        //5.public E set(int index,E element):修改索引位置处的元素,修改成功后,会返回原来的数据
        System.out.println(list.set(3,"牛魔王"));
        System.out.println(list);
    }
}

遍历方式

List集合支持的遍历方式:

1、for循环(因为List集合有索引)

2、迭代器

3、增强for循环(foreach遍历)

4、Lambda表达式

package com.itchinajie.d3_collection_list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
* List集合支持的遍历方式:
1、for循环(因为List集合有索引)
2、迭代器
3、增强for循环
4、Lambda表达式
* */
public class ListTest2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("糖宝宝");
        list.add("蜘蛛精");
        list.add("至尊宝");

        //(1)for循环
        for (int i=0;i<list.size();i++){
            //i=012
            String s = list.get(i);
            System.out.println(s);
        }

        //(2)迭代器
        Iterator<String> it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        
        //(3)增强for循环(foreach循环)
        for (String s : list) {
            System.out.println(s);
        }

        //(4)JDK1.8开始之后的Lambda表达式
        list.forEach(s -> {
                System.out.println(s);
        });
    }
}

ArrayList集合的底层原理

特点

1、基于数组实现的

2、查询速度快(注意:是根据索引查询数据快):查询数据通过地址值和索引定位,查询任意数据耗时相同。

3、删除效率低:可能需要把后面很多的数据进行前移。

4、添加效率极低:可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。

底层原理

1、利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组;

2、添加第一个元素时,底层会创建一个新的长度为10的数组;

3、存满时,会扩容1.5倍;

4、如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准。

ArrayList集合的应用原理

1、ArrayList适合:根据索I查询数据 ,比如根据随机索引数据(高效)!或者数据量 不是很大时!

2、ArrayList不适合:数据量大的同时 ,又要频繁的进行增删操作!

LinkedList集合的底层原理

基于双链表实现的。

什么是链表?有啥特点?

单项链表:链表的特点1: 查询慢,无论查询哪个数据都要从头开始找;
                  链表的特点2: 链表增删相对快。

双向链表(基于双链表实现):基于双链表实现的。
特点:查询慢,增删相对较快,
但对首尾元素进行增删改查的速度是极快的。

新增首尾操作的特有方法

LinkedList集合的应用场景

1、用来设计队列

2、用来设计栈

package com.itchinajie.d3_collection_list;

import java.util.LinkedList;

/**
 目标:掌握List系列集合的特点,以及其提供的特有方法。
 */
public class ListTest3 {
    public static void main(String[] args) {
        //1、创建一个队列。
        LinkedList<String> queue = new LinkedList<>();
        //入队
        queue.addLast("第1号人");
        queue.addLast("第2号人");
        queue.addLast("第3号人");
        queue.addLast("第4号人");
        System.out.println(queue);
        //出队
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue);
        System.out.println("------------------------------------");
        //2、创建一个栈对象。
        LinkedList<String> stack = new LinkedList<>();
        //压栈
//        stack.addFirst("第1颗子弹");
//        stack.addFirst("第2颗子弹");
//        stack.addFirst("第3颗子弹");
//        stack.addFirst("第4颗子弹");
        stack.push("第1颗子弹");
        stack.push("第2颗子弹");
        stack.push("第3颗子弹");
        stack.push("第4颗子弹");
        System.out.println(stack);
        //出栈
//        System.out.println(stack.removeFirst());
//        System.out.println(stack.removeFirst());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack);
    }
}

set系列集合

package com.itchinajie.d4_collection_set;

import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

/*
* 目标:整体了解一下Set系列集合的特点
* */
public class SetTest1 {
    public static void main(String[] args) {
        //1、创建一个Set集合的对象
        //Set<Integer>set =new HashSet<>();//创建了一个HashSet的集合对象。 一行经典代码 HashSet:无序不重复无索引,
        // 不支持索引操作,一般只会无序一次
        // Set<Integer> set = new LinkedHashSet<>();//有序 不重复 无索引
        Set<Integer> set =new TreeSet<>();//可排序(升序) 不重复 无索引
        set.add(666);
        set.add(555);
        set.add(555);
        set.add(888);
        set.add(888);
        set.add(777);
        set.add(777);
        System.out.println(set);

    }
}

HashSet

哈希值

就是一个int类型的数值,Java中每个对象都有一个哈希值。
Java中的所有对象,都可以调用Obejct类提供的hashCode方法,返回该对象自己的哈希值。

package com.itchinajie.d4_collection_set;
/**
 *目标:了解一下哈希值。
 *Java中的所有对象,都可以调用Obejct类提供的hashCode方法,返回该对象自己的哈希值。
 * public int hashcode():返回对象的哈希值。
 *同一个对象多次调用hashCode方法返回的哈希值是相同的。
 *不同的对象,它们的哈希值一般不相同,但也有可能会相同(哈希碰撞)。
 */
public class SetTest2 {
    public static void main(String[] args) {
        Student s1 = new Student("蜘蛛精",25,169.5);
        Student s2 = new Student("紫霞",24,166.5);
        System.out.println(s1.hashCode());
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());

        String str = new String("abc");
        String str2 = new String("acD");
        System.out.println(str.hashCode());
        System.out.println(str2.hashCode());
    }
}

对象哈希值的特点

同一个对象多次调用hashCode()方法返回的哈希值是相同的。
不同的对象,它们的哈希值一般不相同,但也有可能会相同(哈希碰撞)。

HashSet的底层原理

了解一下数据结构(树)

1、普通二叉树(无用)

2、二叉查找树(二叉排序树)

小的存左边, 大的存右边, 一样的不存。

3、平衡二叉树(java常用)

4、java用的红黑树

深入理解HashSet集合去重复的机制。

HashSet集合默认不能对内容一样的两个不同对象去重复!

比如内容一样的两个学生对象存入到HashSet集合中去,HashSet集合是不能去重复的!

如何让HashSet集合能够实现对内容一样的两个不同对象也能去重复???

如果希望Set集合认为2个内容一样的对象是重复的 必须重写对象的hashCode()和equals()方法。

package com.itchinajie.d4_collection_set;

import java.util.Objects;

public class Student implements Comparable<Student>{
    private String name;
    private int age;
    private double height;
//方式一:让自定义的类(如学生类)实现Comparable接口,重写里面的compareTo方法来指定比较规则。
    @Override
    public int compareTo(Student o) {
        //约定1:  如果左边的对象 大于 右边对象 请您返回正整数
        //约定2:  如果左边的对象 小于 右边对象 请您返回负整数
        //约定3:  如果左边的对象 等于 右边对象 请您返回0
        //按照年龄升序排序
//        if (this.age > o.age) {
//            return 1;
//        }else if (this.age < o.age){
//            return -1;
//        }
//        return 0;
        //return this.age - o.age;//升序
        return o.age - this.age;//降序
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public Student() {
    }

    public Student(String name, int age, double height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }
    //容一样就只要两个对象内返回true
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Double.compare(height, student.height) == 0 && Objects.equals(name, student.name);
    }
    //只要两个对象内容一样,返回的哈希值就是一样的。
    @Override
    public int hashCode() {
        return Objects.hash(name, age, height);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
}


package com.itchinajie.d4_collection_set;

import java.util.HashSet;
import java.util.Set;

public class SetTest3 {
    public static void main(String[] args) {
        Set<Student> students = new HashSet<>();
        Student s1 = new Student("至尊宝", 28, 169.6);
        Student s2 = new Student("蜘蛛精", 23, 169.6);
        Student s3 = new Student("蜘蛛精", 23, 169.6);
        System.out.println(s2.hashCode());
        System.out.println(s3.hashCode());
        Student s4 = new Student("牛魔王", 48, 169.6);
        students.add(s1);
        students.add(s2);
        students.add(s3);
        students.add(s4);
        System.out.println(students);
    }
}

LinkedHashSet

特点:有序、不重复、无索引。

底层原理

TreeSet

特点:不重复、无索引、可排序(默认升序排序,按照元素的大小,由小到大排序。

底层是基于红黑树实现的排序。

package com.itchinajie.d4_collection_set;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

/*
* 目标:掌握TreeSet集合的使用
* */
public class SetTest4 {
    public static void main(String[] args) {
        Set<Integer> set1 = new TreeSet<>();
        set1.add(6);
        set1.add(5);
        set1.add(5);
        set1.add(7);
        System.out.println(set1);

        //方式一:让自定义的类(如学生类)实现Comparable接口,重写里面的compareTo方法来指定比较规则。
        //方式二:通过调用TreeSet集合有参数构造器,可以设置Comparator对像(比较器对象,用于指定比较规则)。
        // new 一个TreeSet的比较器对象的有参构造器,生成一个比较器对象,然后重写对象的匿名内部类
        //day04_oop -> src -> com.itchinajie -> d5_arrays 中讲过自定义排序规则
        //TreeSet就近选择自己自带的比较器对象进行排序
        Set<Student> students = new TreeSet<>(( o1,  o2) -> Double.compare(o1.getHeight(), o2.getHeight()));
        students.add(new Student("蜘蛛精",23,169.7));
        students.add(new Student("紫霞",22,169.8));
        students.add(new Student("至尊宝",26,165.5));
        students.add(new Student("牛魔王",22,183.5));
        System.out.println(students);
    }
}

自定义排序规则

小结

注意:集合的并发修改异常

package com.itchinajie.d5_collection_exception;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class collection_exception {
    public static void main(String[] args) {
        //需求:找出集合中全部带“李”的名字,并从集合中删除。
        List<String>  list = new ArrayList<>();
        list.add("王麻子");
        list.add("小李子");
        list.add("李爱花");
        list.add("张全蛋");
        list.add("晓李");
        list.add("李玉刚");
        System.out.println(list);
        //[王麻子,小李子,李爱花,张全蛋,晓李,李玉刚]

        //System.out.println("--------------------------------------");
        //需求:找出集合中全部带“李"的名字,并从集合中删除。
//        Iterator<String>it = list.iterator();
//        while (it.hasNext()){
//            String name = it.next();
//            if(name.contains("李")){
//                list.remove(name);
//            }
//        }
//        System.out.println(list);
        //报错

        //System.out.println("--------------------------------------");
        //使用for循环遍历集合并删除集合中带李字的名字
        //[王麻子,小李子,李爱花,张全蛋,晓李,李玉刚]
//        for (int i=0;i<list.size();i++){
//            String name = list.get(i);
//            if(name.contains("李")){
//                list.remove(name);
//            }
//        }
//        System.out.println(list);
        //出bug,需要在他的基础上加个i--

        //System.out.println("--------------------------------------");
        //怎么解决呢?
        //使用for循环遍历集合并刷除集合中带李字的名字
        //[王麻子,小李子,李爱花,张全蛋,晓李,李玉刚]
        //i
//        for (int i = 0;i<list.size();i++){
//            String name = list.get(i);
//            if(name.contains("李")) {
//                list.remove(name);
//                i--;
//            }
//        }
//        System.out.println(list);
        //加个i--也可以
        //倒着删除也可以

        System.out.println("--------------------------------------");
        //用迭代器正常删除的方式
        需求:找出集合中全部带“李”的名字,并从集合中删除。
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String name = it.next();
            if (name.contains("李")) {
                //List.remove(name);//并发修改异常的错误。
                it.remove();//删除迭代器当前遍历到的数据,每删除一个数据后,相当于也在底层做了i--
            }
        }
        System.out.println(list);

        //System.out.println("--------------------------------------");
        //使用增强for循环遍历集合并删除数据,没有办法解决bug的
        //由于增强for循环遍历集合就是迭代器遍历集合的简化写法,因此,使用增强fo循环遍历集合,又在同时删
        //除集合中的数据时,程序也会出现并发修改异常的错误
//        for (String name : list){
//            if(name.contains("")){
//                list.remove(name);
//            }
//        }
//        System.out.println(list);

        //System.out.println("--------------------------------------");
        //使用lambda表达式也不行
//        list.forEach(name ->{
//            if(name.contains("李")){
//            list.remove(name);
//            }
//        });
//        System.out.println(list);

    }
}

(本章图片均来自于黑马程序员视频)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式事务和一致性

分布式事务是什么&#xff1f; 分布式事务是指在分布式系统中涉及到多个数据库或多个应用程序之间的事务处理&#xff0c;这些数据库或应用程序可能 布在不同的物理节点上&#xff0c;甚至可能位于不同的地理位置&#xff0c;在分布式事务中&#xff0c;需要确保所有参与者的事…

C++ 之动手写 Reactor 服务器模型(一):网络编程基础复习总结

基础 IP 地址可以在网络环境中唯一标识一台主机。 端口号可以在主机中唯一标识一个进程。 所以在网络环境中唯一标识一个进程可以使用 IP 地址与端口号 Port 。 字节序 TCP/IP协议规定&#xff0c;网络数据流应采用大端字节序。 大端&#xff1a;低地址存高位&#xff0c…

[陇剑杯 2021]wifi WP

9.1小王往upload-labs上传木马后进行了cat /flag&#xff0c;flag内容为_____________。&#xff08;压缩包里有解压密码的提示&#xff0c;需要额外添加花括号&#xff09; 附件信息&#xff1a; 拿到附件 先看服务器.pcapng 可以发现只有发出去的包&#xff0c;且为哥斯…

Golang实现简单的HTTP服务,响应RESTful请求判断形状大小

题目要求&#xff1a; 题目 1.shape 接口有面积Area() float64和 周长Perimeter()fioat64 两个法。为Circle Rectangle实现shape 接口。 2.实现isGreater(shape1&#xff0c;shape2 shape)boo1 函数&#xff0c;用于比较两个形状的大小,并使用单元测试验证 3.实现http.Handle…

反常识心理学——受助者恶意 / 如何防备受助者恶意的发生

原创 大渔 大渔大师课 贯穿电影《消失的她&#xff08;2013年上映&#xff09;》中全片的两个反常识心理学效应&#xff1a;曼德拉效应、受助者恶意。 「被篡改的记忆—曼德拉效应 」 何非与妻子去国外旅行&#xff0c;妻子却离奇失踪&#xff0c;正在何非焦急寻找之时&…

根据字典值回显,有颜色的

背景 本项目以若依前端vue2版本为例&#xff0c;项目中有根据字典值回显文本的函数selectDictLabel&#xff0c;但是有时候我们需要带颜色的回显&#xff0c;大概这样的 用法 <template v-slotscope><dict-label :options"dangerLevelOptions" :value&qu…

2024年办公协作新趋势:8种值得瞩目的工作方式

过去两年中&#xff0c;疫情的爆发推动了远程办公业务的发展&#xff0c;并且随着疫情的常态化和企业数字化转型的加速&#xff0c;中国企业对协作办公软件的需求显著增加。数据显示&#xff0c;2021年中国协作办公市场规模已达264.2亿元&#xff0c;预计到2023年将增长至330.1…

Asymmetric Loss For Multi-Label Classification

从b站视频区看到的一篇论文&#xff0c;来自阿里。据他所说&#xff0c;他的多标签分类数据长尾最大到100:1&#xff0c;再做增广也没用&#xff0c;用了这篇论文的loss直接起飞。 链接在此 首先&#xff0c;常规的loss 既然是多标签分类&#xff0c;那么最基础的方法肯定是…

《探索 Unity 开发:创新与挑战》

《探索 Unity 开发&#xff1a;创新与挑战》 在当今的游戏开发和虚拟现实领域&#xff0c;Unity 已经成为了一款备受青睐的引擎。它的强大功能和灵活性&#xff0c;为开发者们提供了无限的创作可能。在这篇博客中&#xff0c;我们将深入探讨 Unity 开发的各个方面&#xff0c;包…

HarmonyOS应用二之代办事项案例

目录&#xff1a; 1、代码分析2、ArkTS的基本组成3、重点扩展 1、代码分析 1.1代码&#xff1a; 在鸿蒙&#xff08;‌HarmonyOS&#xff09;‌的ArkTS框架中&#xff0c;‌aboutToAppear() 是一个自定义组件的生命周期函数&#xff0c;‌它在组件即将显示时被系统自动调用1。…

生信入门:序列比对之ncbi_blast在线使用

1.背景 blast作为一种序列相似性比对工具&#xff0c;是生物信息分析最常用的一款软件&#xff0c;必须掌握。不管是做两序列相似性的简单比对&#xff0c;还是引物特异性、序列的来源等个性化分析&#xff0c;都会用到blast比对。许多看似高大上的基因分析&#xff0c;都可归…

1688商品详情API返回值中的物流与配送信息

在阿里巴巴1688平台上&#xff0c;商品详情API的返回值通常会包含丰富的商品信息&#xff0c;但具体到“物流与配送信息”这部分&#xff0c;它可能不直接包含在API的标准返回字段中&#xff0c;因为物流和配送信息往往与订单处理、库存状态以及物流服务商的实时数据相关联&…

探索Linux -- 冯诺依曼体系、初始操作系统、初始进程、fork函数

一、冯诺依曼体系结构 1、概念 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。 最早的计算机器仅内含固定用途的程序。若想要改变此机器的程序&#xff0c;就必须更改线路、更改结构甚至重新设计此机器。当然最早的计…

安卓应用开发学习:查看手机传感器信息

一、引言 在手机app的开发中经常会用到手机的传感器&#xff0c;在《Android App 开发进阶与项目实战》一书的第10章就介绍了传感器的一些功能和用法。要想使用传感器&#xff0c;首先得知道手机具备哪些传感器。书中有传感器类型取值的说明&#xff0c;并提供了一个查看手机传…

vulnhub系列:DC-9

vulnhub系列&#xff1a;DC-9 靶机下载 一、信息收集 nmap扫描存活&#xff0c;根据mac地址寻找IP nmap 192.168.23.0/24nmap扫描IP 端口等信息 nmap 192.168.23.144 -p- -sV -Pn -O访问80端口 dirsearch目录扫描 python3 dirsearch.py -u http://192.168.23.144/页面查看…

8.12-基于gtids的主从复制搭建+lvs

一、LVS 1.角色 主机名ip地址功能web01192.168.2.101rsweb02192.168.2.102realserveenat内网:192.168.2.103 外网:192.168.2.120directorserver,ntpdns192.168.2.105dns 2..web服务器 [rootweb01 ~]# yum -y install nginx ​ [rootweb01 ~]# echo "web01" > …

【kruskal】最小生成树算法详解

最小生成树kruskal 洛谷 P3366 【模板】最小生成树 算法介绍 最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;是一个无向图中连接所有顶点的边的集合&#xff0c;这个集合满足两点&#xff1a;第一&#xff0c;它是一棵树&#xff0c;即任意两个顶点之间恰好有…

打靶记录9——Vikings

靶机下载地址&#xff1a;https://www.vulnhub.com/entry/vikings-1,741/ 难度&#xff1a; 低&#xff08;中&#xff09;&#xff0c;CTF风格的靶机 目标&#xff1a; 取得 root 权限 2 个flag 涉及的攻击方法&#xff1a; 主机发现端口扫描Web信息收集编码转换/文件还…

ThinkPHP5.1.C+CmsEasy-SQL注入

目录 1、ThinkPHP 中存在的 SQL注入 漏洞&#xff08; select 方法注入&#xff09; 1.1环境配置 1.1.1将 composer.json 文件的 require 字段设置成如下&#xff1a; 1.1.2设置application/index/controller/Index.php 文件 1.1.3在 application/database.php 文件中配置…

Xcode 在原生集成flutter项目

笔者公司有一个从2017年就开始开发的iOS和安卓原生项目&#xff0c;现在计划从外到内开始进行项目迁徙。 1》从gitee拉取flutter端的代码&#xff1b;&#xff08;Android报错Exception: Podfile missing&#xff09; 2》替换Xcode里的cocopods里Podfile的路径 然后报警 然后…