【0基础学Java第十课】-- 认识String类

news2024/11/18 14:48:34

10. 认识String类

  • 10.1 String类的重要性
  • 10.2 常用方法
    • 10.2.1 字符串构造
    • 10.2.2 String对象的比较
    • 10.2.3 字符串查找
    • 10.2.4 转化
    • 10.2.5 字符串替换
    • 10.2.6 字符串拆分
    • 10.2.7 字符串截取
    • 10.2.8 字符串的不可变性
    • 10.2.9 字符串修改
  • 10.3 StringBuilder和StringBuffer
    • 10.3.1 StringBuilder的介绍
    • 10.3.2 面试题:
  • 10.4 String类oj

10.1 String类的重要性

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类
另外在开发和校招笔试中,字符串也是常客,比如:

  • 字符串转整形数字
  • 字符串相加

而在面试中经常被提问:
String、StringBuff和StringBuilder之间的区别等。

10.2 常用方法

10.2.1 字符串构造

常用的三种构造方法:

    public static void main(String[] args) {
        //使用常量串构造
        String str = "hello";
        System.out.println(str); // 调用println中print里面再调用write方法来打印

        //直接newString对象
        String str2 = new String("world");
        System.out.println(str2);

        //使用字符数组进行构造
        char[] array = {'h','e','l','l','o'};
        String str3 = new String(array);
        System.out.println(str3);
    }

其他方法需要使用可以去查看Java在线文档:链接: String官方文档

注意:

  1. String是引用类型,内部并不存储字符串本身,比如在String类的是实现源码,String类实例变量如下:
    在这里插入图片描述
    字符串实际保存在char类型的数组,即value去引用里面的数组内容,而s3这个引用 指向了s1这个引用 指向的对象如下:
    在这里插入图片描述
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("world");
        String s3 = s1;
        System.out.println(s3);
    }
  1. 在Java中 “” 引起来也是String类型对象,如:
    public static void main(String[] args) {
        String str4 = "";
        System.out.println("输出:"+str4);
        System.out.println(str4.length());
        System.out.println(str4.isEmpty());//为空 则为true,但这里的空不是null

        String str5 = null;
        System.out.println(str5.isEmpty());//报错:NullPointerException 所以null 和 ""不一样
    }

10.2.2 String对象的比较

字符串的比较是常见操作之一,比如:字符串排序。Java中总共提供了4中方式:

  1. == 比较是否引用同一个对象
    注意对于内置类型,双等号比较的是变量中的值;对于引用类型,==比较的是引用中的地址。
    public static void main(String[] args) {
		int a = 10;
		int b = 20;
		int c = 10;
		// 对于基本类型变量,==比较两个变量中存储的值是否相同
		System.out.println(a == b); // false
		System.out.println(a == c); // true
		// 对于引用类型变量,==比较两个引用中的地址
		String s1 = new String("hello");
		String s2 = new String("hello");
		String s3 = new String("world");
		String s4 = s1;
		System.out.println(s1 == s2); // false
		System.out.println(s2 == s3); // false
		System.out.println(s1 == s4); // true

    }
  1. boolean equals(Object anObject) 方法:按照字典序比较
    字典序:字符大小的顺序
    String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照
    如下规则进行比较,比如: s1.equals(s2)
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("world");
        System.out.println(s1.equals(s2)); //String类重写了父类Object中equals方法
    }

而父类Object中equals方法如下:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

另外:

    public static void main(String[] args) {
        String s3 = "hello";
        String s4 = "hello";
        System.out.println(s3==s4); // true
        System.out.println(s3.equals(s4)); // true
    }

在这里插入图片描述

  1. int compareTo(String s) 方法
public static void main(String[] args) {
	String s1 = new String("abc");
	String s2 = new String("ac");
	String s3 = new String("abc");
	String s4 = new String("abcdef");
	System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1
	System.out.println(s1.compareTo(s3)); // 相同输出 0
	System.out.println(s1.compareTo(s4)); // 前k个字符完全相同,输出长度差值 -3
}

与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:

  • 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
  • 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
  1. int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较:
public static void main(String[] args) {
	String s1 = new String("abc");
	String s2 = new String("ac");
	String s3 = new String("ABc");
	String s4 = new String("abcdef");
	System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1
	System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0
	System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同,输出长度差值 -3
}

10.2.3 字符串查找

字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法:

    public static void main(String[] args) {
        String s1 = new String("hello");

        //返回字符串对应下标的字符
        char ch = s1.charAt(1);
        System.out.println(ch); //e

        //返回对应字符出现的下标位置 从头开始一个一个找 没有返回-1
        int index = s1.indexOf('l');
        System.out.println(index); //2

        // 从指定位置(3)开始找某个字符出现的位置   没有返回-1
        int index2 = s1.indexOf('l',3);
        System.out.println(index2); //3

        // 字符串查找 从一个字符串找另一个字符串   没有返回-1
        int index3 = s1.indexOf("llo");
        System.out.println(index3); //2
        int index4 = s1.indexOf("llo",3);
        System.out.println(index4); //-1

        //从后往前找,返回ch第一次出现的位置,没有返回-1
        int index5 = s1.lastIndexOf('l');
        System.out.println(index5); //3
        
        // 从指定位置开始找,从后往前找ch第一次出现的位置,没有返回-1
        int index6 = s1.lastIndexOf('l',2);
        System.out.println(index6); // 2
        // 字符串也可以从后往前同理
    }

10.2.4 转化

结论:字符串的改变 都是产生了新的对象
1.数值和字符串转化:String.valueOf()方法,里面可以是整数,double,boolean等:
在这里插入图片描述

    public static void main(String[] args) {
        //把整数  转化为  字符串
        String str = String.valueOf(123);
        System.out.println(str); 

        //这个过程  可以理解为序列化
        String str1 = String.valueOf(new Student("张三",12));
        System.out.println(str1); //上面重写一下toString方法来变成想要的形式  姓名:张三  年龄:12

        //包装类:首先是一个类 其次 类中拥有更多的方法 使用起来非常方便
        //把字符串变成整型
        int a = Integer.parseInt("123");
        System.out.println(a);  //123
        //变成double  变成什么类型就是 该包装类.parse类型
        double d = Double.parseDouble("99.99");
        System.out.println(d);  //99.99

    }

2.大小写转换:toUpperCase(),变小:toLowerCase()

    public static void main(String[] args) {
        //结论:字符串的改变 都是产生了新的对象
        //转化成大写的时候,产生了一个新的对象
        String str = "hello";
        String ret = str.toUpperCase();
        System.out.println(ret);  //HELLO
        System.out.println(str);

        String str2 = "HELLO";
        String ret2 = str2.toLowerCase();
        System.out.println(ret2); // hello
    }

3.字符串转数组

    public static void main(String[] args) {
        String str = "hello";
        char[] chars = str.toCharArray();
        for (char ch:chars) {
            System.out.println(ch);
        }

4.格式化

    public static void main(String[] args) {
        String s = String.format("%d-%d-%d",2019,9,14);
        System.out.println(s); //2019-9-14
    }

10.2.5 字符串替换

    public static void main(String[] args) {
        String str = "abcdabcddef";
        // 字符替换 把a替换成A
        String ret = str.replace('a','A');
        System.out.println(ret);
        // 字符串替换  把ab替换成AB 
        String ret2 = str.replace("ab","AB");
        System.out.println(ret2);
    }

10.2.6 字符串拆分

.split(“切割符”,限制数) 拆分为几部分的数组接收:

    public static void main(String[] args) {
        String str = "name=zhagnsan&age=10";
        String[] ret = str.split("&");
        for (int i = 0; i < ret.length; i++) {
            System.out.println(ret[i]);
            //name=zhagnsan
            //age=10
        }

        //可以加限制分割为几部分
        String str2 = "hello world hello bit";
        String[] ret2 = str2.split(" ",2);
        for (int i = 0; i < ret2.length; i++) {
            System.out.println(ret2[i]);    
            //hello
            //world hello bit
        }

        String str3 = "192.168.1.1";
        String[] ret3 = str3.split("\\.");
        for (int i = 0; i < ret3.length; i++) {
            System.out.println(ret3[i]);
            //192
            //168
            //1
            //1
        }

注意

  1. 字符"|“,”*“,”+“都得加上转义字符,前面加上”\" .
  2. 而如果是"" ,那么就得写成"\\" .
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
    public static void main(String[] args) {
    	//正则表达式的分割
        String str = "192\\168\\1\\1";
        String[] ret = str.split("\\\\");
        for (int i = 0; i < ret.length; i++) {
            System.out.println(ret[i]);
            //192
            //168
            //1
            //1
        }
				
				// 俩个分割符
        String str2 = "name=zhagnsan&age=10";
        String[] ret2 = str2.split("=|&");
        for (int i = 0; i < ret2.length; i++) {
            System.out.println(ret2[i]);
            //name
            //zhagnsan
            //age
            //10
        }
  1. 多次拆分:
    public static void main(String[] args) {
        //实现多次分割
        String str = "name=zhagnsan&age=10";
        String[] ret = str.split("&");
        // [0] name=zhagnsan  [1]  age=10
        for (String x:ret) {
            String[] s = x.split("=");
            for (String ss:s) {
                System.out.println(ss);
                //name
                //zhagnsan
                //age
                //10
            }
        }
    }

10.2.7 字符串截取

从一个完整的字符串之中截取出部分内容。可用方法如下:
String substring(int beginIndex) 从指定索引截取到结尾
String substring(int beginIndex, int endIndex) 截取部分内容
trim() 截取字符串两边的空格 保留中间空格

    public static void main(String[] args) {
        String str = "abcdef";
        //从指定截取到结尾
        String ret = str.substring(3);
        System.out.println(ret);   //def
        //截取部分内容  [a,b) 在Java中一般是左闭有开
        String ret2 = str.substring(2,5);   //cde
        System.out.println(ret2);

        //trim() 截取字符串两边的空格  保留中间空格
        String str3 = "    abcde fefef  f     ";
        String ret3 = str3.trim();
        System.out.println(ret3);   //abcde fefef  f
    }

10.2.8 字符串的不可变性

String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,对字符串的改变操作都会产生新的对象。

在被private修饰封装起来的value[] 拿不到value里面的内容,而且也没有提供get 和set方法。
在这里插入图片描述

    public static void main15(String[] args) {
        final char[] value = {'a','b','c','d'};
        value[0] = 'g';//修改对象 0 下标内容
        //value = new char[10];//指向新的对象
    }

final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内
容是可以修改的。

public static void main(String[] args) {
	final int array[] = {1,2,3,4,5};
	array[0] = 100;
	System.out.println(Arrays.toString(array));
	// array = new int[]{4,5,6}; // 编译报错: 无法为最终变量array分配值
	//可以修改值但是不能修改数组的指向
}

为什么 String 要设计成不可变的?(不可变对象的好处是什么?)

  1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了.
  2. 不可变对象是线程安全的.
  3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中.

10.2.9 字符串修改

注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率
非常低下。

    public static void main15(String[] args) {
        //String s = "hello";
        //s += " world";  // s指向了新的指向
        //System.out.println(s); // 输出:hello world
			//相当于下面:
			
        String s = "hello";
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(s);
        s = stringBuilder.toString();
        System.out.println(s);
        System.out.println(stringBuilder);
    }

在这里插入图片描述

但是这种方式不推荐使用,因为其效率非常低,中间创建了好多临时对象。

    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder("abcdef");
        stringBuilder.reverse();
        System.out.println(stringBuilder);
    }

    public static void main17(String[] args) {

        long start = System.currentTimeMillis();
        StringBuffer sbf = new StringBuffer("");
        for(int i = 0; i < 100000; ++i){
            sbf.append(i);
        }

        long end = System.currentTimeMillis();
        System.out.println(end - start);

        start = System.currentTimeMillis();
        StringBuilder sbd = new StringBuilder();
        for(int i = 0; i < 100000; ++i){
            sbd.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
         start = System.currentTimeMillis();//获取当前系统的时间戳
        String s = "";
        for(int i = 0; i < 100000; ++i){
            //以后不能在循环当中 这样去拼接字符串
            s += i;
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
    }

10.3 StringBuilder和StringBuffer

10.3.1 StringBuilder的介绍

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大
部分功能是相同的,这里介绍 StringBuilder常用的一些方法,其他可以点击链接: stringBuilder在线文档

    public static void main(String[] args) {
        //StringBuilder StringBuffer 是一个可变的对象 返回的是this 也就是当前对象

        // 使用多线程情况下 synchronized 执行一个append方法时得先执行完才能执行其他方法
        // 但是频繁得上锁 和 解锁是需要耗费系统的资源
        StringBuffer stringBuffer = new StringBuffer("aaaa");
        stringBuffer.append("111");
        System.out.println(stringBuffer); //aaaa111

        StringBuilder stringBuilder = new StringBuilder("abcdef");
        stringBuilder.append("123");
        stringBuilder.append("456").append("789");
        stringBuilder.reverse(); // 逆置字符串
        System.out.println(stringBuilder);  //987654321fedcba
   }
  • StringBuff append(String str) ----- 在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量
  • char charAt(int index) ----- 获取index位置的字符
  • int length() ----- 获取字符串的长度
  • int capacity() ----- 获取底层保存字符串空间总的大小
  • void ensureCapacity(int mininmumCapacity) ----- 扩容
  • void setCharAt(int index,char ch) ----- 将index位置的字符设置为ch
  • int indexOf(String str) 返回str第一次出现的位置
  • int indexOf(String str, int fromIndex) ----- 从fromIndex位置开始查找str第一次出现的位置
  • int lastIndexOf(String str) ----- 返回最后一次出现str的位置
  • int lastIndexOf(String str, int fromIndex) ----- 从fromIndex位置开始找str最后一次出现的位置
  • StringBuff insert(int offset, String str) ----- 在offset位置插入:八种基类类型 & String类型 & Object类型数据
  • StringBuffer deleteCharAt(int index) ----- 删除index位置字符
  • StringBuffer delete(int start, int end) ----- 删除[start, end)区间内的字符
  • StringBuffer replace(int start, int end, String str) ----- 将[start, end)位置的字符替换为str
  • String substring(int start) ----- 从start开始一直到末尾的字符以String的方式返回
  • String substring(int start,int end) ----- 将[start, end)范围内的字符以String的方式返回
  • StringBuffer reverse() ----- 反转字符串
  • String toString() ----- 将所有字符按照String的方式返回
    public static void main(String[] args) {
        StringBuilder sb1 = new StringBuilder("hello");
        StringBuilder sb2 = sb1;
        // 追加:即尾插-->字符、字符串、整形数字
        sb1.append(' '); // hello
        sb1.append("world"); // hello world
        sb1.append(123); // hello world123
        System.out.println(sb1); // hello world123
        System.out.println(sb1 == sb2); // true
        System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h
        System.out.println(sb1.length()); // 获取字符串的有效长度14
        System.out.println(sb1.capacity()); // 获取底层数组的总大小
        sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Hello world123
        sb1.insert(0, "Hello world!!!"); // Hello world!!!Hello world123
        System.out.println(sb1);
        System.out.println(sb1.indexOf("Hello")); // 获取Hello第一次出现的位置
        System.out.println(sb1.lastIndexOf("hello")); // 获取hello最后一次出现的位置
        sb1.deleteCharAt(0); // 删除首字符
        sb1.delete(0,5); // 删除[0, 5)范围内的字符
        String str = sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回
        System.out.println(str);
        sb1.reverse(); // 字符串逆转
        str = sb1.toString(); // 将StringBuffer以String的方式返回
        System.out.println(str);
    }

总结:String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可
以修改
频繁修改字符串的情况考虑使用StringBuilder
注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:

  • String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
  • StringBuilder变为String: 调用toString()方法。

10.3.2 面试题:

  1. String、StringBuffer、StringBuilder的区别
  • String的内容不可修改,StringBuffer和StringBuilder的内容可以修改
  • StringBuffer和StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理,属于多线程安全操作;而StringBuilder未采用同步操作,属于线程不安全操作
  1. 以下总共创建了多少个String对象【前提不考虑常量池之前是否存在】

10.4 String类oj

  1. 链接: 第一个只出现一次的字符
    public int firstUniqChar(String s) {
        //1.定义一个计数数组
        int[] count = new int[26];
        //2.遍历字符串 记录次数
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            count[ch-'a']++;
        }
        //3.再次遍历原字符串
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (count[ch -'a'] == 1) {
                return i;
            }
        }
        return -1;
    }
  1. 链接: 字符串最后一个单词的长度
  • 使用split方法分割空格后的字符串
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String s = in.nextLine();
            String[] ret = s.split(" ");
            System.out.println(ret[ret.length-1].length());
        }
    }
  • 使用lastIndexOf方法找到空格的位置,然后substring截取空格+1之后的字符串
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String s = in.nextLine();
            int index = s.lastIndexOf(" ");
            String str = s.substring(index+1);
            int len = str.length();
            System.out.println(len);
        }
    }
  1. 链接: 检测字符串是否为回文
    public boolean isPalindrome(String s) {
        s = s.toLowerCase();
        int left = 0;
        int right = s.length()-1;

        while(left < right) {
            //1.left走到合法字符底下
            while(left<right && !isCharacterNum(s.charAt(left))) {
                left++;
            }
            //2.right走到合法字符底下
            while(left<right && !isCharacterNum(s.charAt(right))) {
                right--;
            }

            if(s.charAt(left) == s.charAt(right)) {
                left++;
                right--;
            } else {
                return false;
            }
        }
        return true;
    }
    private boolean isCharacterNum(char ch) {
        // if(ch >= 'a' && ch <= 'z' || ch >='0' && ch <= '9') {
        //     return true;
        // }
        // return false;
        if(Character.isDigit(ch) || Character.isLetter(ch)) {
            return true;
        }
        return false;
    }

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

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

相关文章

Java 11及更高版本的Oracle JDK版本

2021 年 9 月 14 日&#xff0c;Oracle 发布了可以长期支持的 JDK17 版本&#xff0c;那么从 JDK11 到 JDK17&#xff0c;到底带来了哪些特性呢&#xff1f;亚毫秒级的 ZGC 效果到底怎么样呢&#xff1f;值得我们升级吗&#xff1f;而且升级过程会遇到哪些问题呢&#xff1f;带…

PHP字符串函数的解析

在PHP中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于存储和操作文本数据。PHP提供了丰富的字符串函数&#xff0c;用于执行各种字符串操作&#xff0c;包括截取、连接、替换、搜索等。在这篇文章中&#xff0c;我们将深入解析一些常用的PHP字符串函数&#xff0c;以…

小程序开通电子发票

总目录 文章目录 总目录前言结语 前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 首先登录商户号&#xff1a;https://pay.weixin.qq.com/index.php/core/home/lo…

数据结构及八种常用数据结构简介

data-structure 数据结构是一种存在某种关系的元素的集合。“数据” 是指元素&#xff1b;“结构” 是指元素之间存在的关系&#xff0c;分为 “逻辑结构” 和 “物理结构&#xff08;又称存储结构&#xff09;”。 常用的数据结构有 数组&#xff08;array&#xff09;、栈&…

debian10 开启rdp安装firefox,firefox 中文乱码

debian10 开启rdp安装firefox apt -y install tigervnc-standalone-server apt -y install xrdp tigervnc-standalone-server systemctl enable xrdpapt install firefox-esrmstsc连接 firefox-settings-general-fonts-advanced-Simplified Chinese

【LeetCode:2342. 数位和相等数对的最大和 | HashMap + 模拟 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【开源】基于Vue和SpringBoot的微信小程序的音乐平台

项目编号&#xff1a; S 055 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S055&#xff0c;文末获取源码。} 项目编号&#xff1a;S055&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…

R语言的入门学习

目录 准备工作导入csv数据集选择前200行作为数据集展示数据集的前/后几N行宏观分析删除缺失值构建直方图导出为图片 R语言常见图像类型例1&#xff1a;散点图例2&#xff1a;散点矩阵图 准备工作 安装教程&#xff1a; R语言和RStudio的下载安装&#xff08;非常简便舒适&…

脚本(JavaScript)-练手-简单的随机音乐播放器

浅浅的写个简单的随机音乐播放脚本(可移动)&#xff0c;注释很详细&#xff0c;直接上源码 效果&#xff1a; // UserScript // name 播放音乐脚本 // namespace 代码对我眨眼睛 // version 1.2 // description 在API上请求音乐链接并随机自动连续播放音乐&…

【Python3】【力扣题】303. 区域和检索 - 数组不可变

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;从列表中获取指定下标的所有元素&#xff0c;求和。 知识点&#xff1a;列表[start:end]&#xff1a;切片。从列表中获取起始下标start&#xff08;含&#xff09;到结束下标end&#xf…

Redis(地理空间Geospatial和HyperLogLog)

Geospatial&#xff1a; Redis中的Geospatial提供了一种存储和处理地理空间数据的能力&#xff0c;这对于许多应用非常有用。以下是Redis中的Geospatial的一些作用&#xff1a; 1. 地理位置查询&#xff1a;可以存储地理位置的坐标信息&#xff0c;并且可以通过查询指定半径范…

数据库的三范式(Normalization)

数据库的三范式&#xff08;Normalization&#xff09;是关系数据库设计中的基本理论原则&#xff0c;旨在减少数据冗余和提高数据库的数据组织结构。三范式通过将数据分解为更小的表&#xff0c;并通过关系建立连接&#xff0c;使得数据库设计更加灵活、规范和容易维护。在这篇…

【csapp lab】lab2_bomblab

文章目录 前言实验内容phase_1phase_2phase_3phase_4phase_5phase_6secret_phase 前言 刚做了csapp lab2&#xff0c;记录一下。 我这里用的的系统环境是Ubuntu22.04&#xff0c;是64位系统&#xff0c;与用32位系统可能有所差异。 实验共包括七个阶段&#xff0c;每个阶段考…

湖北成人自考毕业学位申请照片要求及自拍制作方法

湖北成人自考学位申请需要上传照片是为了身份验证和学籍管理的目的。通过上传照片&#xff0c;学校可以确认申请者的身份&#xff0c;并将照片与其他申请信息进行关联。这有助于提高学校对学生的管理效率&#xff0c;确保学籍信息的准确性。同时&#xff0c;照片也用于学位证书…

基于FPGA的五子棋(论文+源码)

1.系统设计 在本次设计中&#xff0c;整个系统硬件框图如下图所示&#xff0c;以ALTERA的FPGA作为硬件载体&#xff0c;VGA接口&#xff0c;PS/2鼠标来完成设计&#xff0c;整个系统可以完成人人对战&#xff0c;人机对战的功能。系统通过软件编程来实现上述功能。将在硬件设计…

计算机硬件的基本组成

一、冯诺依曼结构 存储程序&#xff1a; “存储程序”的概念是指将指令以二进制代码的形式事先输入计算机的主存储器&#xff0c;然后按其在存储器中的首地址执行程序的第一条指令&#xff0c;以后就按该程序的规定顺序执行其他指令&#xff0c;直至程序执行结束。 冯诺依曼计…

C语言每日一题(33)随机链表的复制

力扣138 随机链表的复制 题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都…

理论与实践相结合之Cisco Packet Tracer网络模拟器安装教程

简介 Packet Tracer是由思科设计的跨平台可视化仿真工具&#xff0c;它允许用户创建网络拓扑以模仿计算机网络和使用命令行界面来模拟配置思科路由器和交换机。Packet Tracer的用户界面为拖放式&#xff0c;允许用户根据自己的需要添加和删除模拟的网络设备。 Packet Tracer很…