Java字符串

2023-11-03

文章目录


Java字符串

一、Java常用 API

API (Application Programming Interface) :应用程序编程接口,就是别人写好的一些类,给咱们程序员直接拿去调用即可解决问题的

我们前面已经学过的 API 有 Scanner、Random。

但是 Java 中还有很多我们没有学习的类,下图仅一小部分:

image-20230130171837762

但要我们要记住这些类是比较困难的。

image-20230130171940065

这里我们可以使用 Java API 帮助文档来帮助我们使用这些类。

API 帮助文档使用流程:

  1. 在索引位置搜索自己要查看的类

  2. 看包

    目的:是 java.lang包(核心包),不需要导包代码(import);不是java.lang包,都需要编写导包代码。

  3. 看这个类的介绍

    目的:搞清楚这个类的作用

  4. 看这个类的构造方法

    目的:为了将该类的对象,创建出来

  5. 看这个类的成员方法(方法摘要)

    1. 方法名
    2. 参数
    3. 返回值
    4. 介绍

二、String 类

字符串在开发中的应用场景:

  • 比如,我们打开浏览器,登录 b站,需要输入账号名、密码、验证码等,这些就使用到了字符串。

    image-20230130172910495

  • 在游戏中的语言屏蔽机制

    image-20230130172950199

    玩家在输入时文字时语言不文明:

    image-20230130173105527

    可以对特定的字符串进行替换:

    image-20230130173144776

1. String 类的特点

  • Java 程序中所有双引号字符串, 都是 String 类的对象
  • 字符串在创建之后, 其内容不可更改
  • 字符串虽然不可改变, 但是可以被共享
1)Java 程序中所有双引号字符串, 都是 String 类的对象
package cn.edu.hgu.string;

public class StringDemo1 {
    public static void main(String[] args) {
        String s = "abc";
        System.out.println(s.toUpperCase());

        System.out.println("helloworld".toUpperCase());
    }
}

输出结果为:

image-20230130193415037

2)字符串在创建之后, 其内容不可更改

如果想要更改,只能使用新的对象,做替换。

package cn.edu.hgu.string;

public class StringDemo1 {
    public static void main(String[] args) {
        String s = "abc";
        System.out.println(s.hashCode());//输出对象的哈希码
        
        s = "def";
        System.out.println(s.hashCode());
    }
}

输出结果为:

image-20230130202642662

我们可以看到,两个数的值是不相同的,说明对象进行了替换。

3)字符串虽然不可改变, 但是可以被共享

下面我们来引入一个概念:字符串常量池

字符串常量池:当我们使用双引号创建字符串对象时,会检查常量池中是否存在该数据

  • 不存在:创建
  • 存在:复用

我们通过代码来看一下:

package cn.edu.hgu.string;

public class StringDemo1 {
    public static void main(String[] args) {
        String s1 = "abc";
        System.out.println(s1.hashCode());//输出对象的哈希码

        String s2 = "abc";
        System.out.println(s2.hashCode());
    }
}

2. String 类的常见构造方法

构造方法 说明
public String() 创建空白字符串,不含任何内容
public String(String original) 根据传入的字符串,创建字符串对象
public String(char[] chs) 根据字符数组,创建字符串对象

下面我们来通过代码来使用一下这三个构造方法:

package cn.edu.hgu.string;

public class StringDemo2 {
    public static void main(String[] args) {
        // public String():创建空白字符串,不含任何内容
        String s1 = new String();
        System.out.println(s1);

        // public String(char[] chs):根据传入的字符数组,创建字符串对象
        char[] chs = {'a', 'b', 'c'};
        String s2 = new String(chs);
        System.out.println(s2);

        // public String(String original):根据传入的字符串,来创建字符对象
        String s3 = new String("qwer");
        System.out.println(s3);
    }
}

输出结果为:

image-20230130204329246

注意事项

  • 这三个构造方法,创建字符串对象,都没有双引号直接创建来的方便。

    String s = “abc”;

  • 打印对象名,会看到对象的内存地址,这里打印字符串对象,为什么没有看到地址值?

3. String 类的常见面试题

面试题1:下面代码结果为:

public class StringTest1 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2);//true
    }
}

image-20230130212306607

因为两个变量使用的都是在字符变量池中的同一个变量地址。

面试题2:下面代码结果为:

public class StringTest1 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = new String("abc");
        System.out.println(s1 == s2);//false
    }
}

image-20230130212835608

s1使用的是字符串中的地址,而s2会在堆内存中新开辟一块内存地址,两个地址是不一样的。

面试题3:下面代码结果为:

public class StringTest1 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "ab";
        String s3 = s2 + "c";
        System.out.println(s1 == s3);//false
    }
}

image-20230130213625791

s1使用的是在字符串常量池中的地址,字符串进行拼接时会使用 StringBuilder 类,拼接完成后会使用 toString 方法再堆内存中开辟一块地址,两个地址是不相同的。

面试题4:下面代码结果为:

public class StringTest1 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "a" + "b" + "c";
        System.out.println(s1 == s2);//true
    }
}

前面讲了字符串在拼接时会调用 StringBuilder 类进行拼接,那为什么结果不对呢?

String s2 = “a” + “b”+“c”;编译器将这个"a" + “b”+“c"作为常量表达式,在编译时进行优化,直接取表达式结果"abc”,这里没有创建新的对象,而是从JVM字符串常量池中获取之前已经存在的"abc"对象。因此a,b具有对同一个string对象的引用,两个引用相等,结果true。

4. String 类用于比较的方法

public boolean  equals方法(要比较的字符串)                                完全一样结果才是true,否则为false 

public boolean  equalsIgnoreCase(要比较的字符串)		忽略大小写的比较

下面我们通过案例来学习这两个用于比较的方法:

package cn.edu.hgu.string.method;

public class StringMethodDemo1 {
    public static void main(String[] args) {

        String s1 = "abc";
        String s2 = new String("abc");

        System.out.println(s1 == s2);//false
        System.out.println(s1.equals(s2));//true

        System.out.println("--------------");

        String ss1 = "abc";
        String ss2 = "ABC";

        System.out.println(ss1.equals(ss2));//false
        System.out.println(ss1.equalsIgnoreCase(ss2));//true
    }
}

输出结果为:

image-20230130220546337

案例:用户登录

需求:已知正确的用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示。

分析:

  1. 定义两个字符串类型变量,模拟已经存在的用户名和密码
  2. 键盘录入用户输入的用户名,密码
  3. 比对

代码实现:

package cn.edu.hgu.test;

import java.util.Scanner;

public class StringTest1 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        // 1.定义两个字符串类型变量,模拟已经存在的用户名和密码
        String username = "admin";
        String password = "123456";

        for (int i = 1; i <= 3; i++) {
            // 2. 键盘录入用户输入的用户名,密码
            System.out.println("请输入用户名:");
            String inputUsername = sc.nextLine();

            System.out.println("请输入密码:");
            String inputPassword = sc.nextLine();

            // 3.比对
            if (inputUsername.equals(username) && inputPassword.equals(password)) {
                System.out.println("登录成功!");
                break;
            } else {
                if (i == 3) {
                    System.out.println("明儿再来吧~");
                } else {
                    System.out.println("登陆失败,您还剩余" + (3 - i) + "次机会");
                }
            }
        }

    }
}

输出结果为:

image-20230130222419905

image-20230130222536579

5. String 字符串的遍历

public char[]  toCharArray ()    将字符串转换为字符数组 
public char chatAt (int index)  根据索引找字符
public int length() : 返回字符串的长度

下面我们来简单了解一下这几个方法的使用:

package cn.edu.hgu.string.method;

public class StringMethodDemo2 {
    public static void main(String[] args) {

        String s = "itheima";

        char[] chars = s.toCharArray();

        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i]);
        }
        
        System.out.println("-----------------");

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            System.out.println(c);
        }

    }
}

输出结果为:

image-20230130223525251

案例:统计字符次数

需求 : 键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)

例如 : aAb3&c2B*4CD1

小写字母 : 3个

大写字母 : 4个

数字字母 : 4个

代码实现:

package cn.edu.hgu.test;

import java.util.Scanner;

public class StringTest2 {
    public static void main(String[] args) {
        // 1. 键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入:");
        String content = sc.nextLine();

        // 2. 定义三份计数器变量,用于统计操作
        int smallCount = 0;
        int bigCount = 0;
        int numCount = 0;

        // 3.遍历字符串,获取到每一个字符
        char[] chars = content.toCharArray();

        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            // 4.在遍历的过程中,加入 if 判断,看字符属于哪一种类别
            if (c >= 'a' && c <= 'z') {
                // 5.对应的计数器变量自增
                smallCount++;
            } else if (c >= 'A' && c <= 'Z') {
                bigCount++;
            } else if (c >= '0' && c <= '9') {
                numCount++;
            }
        }

        // 6.在遍历结束后,将统计好的计数器变量,打印在控制台
        System.out.println("小写字母:" + smallCount + "个");
        System.out.println("大写字母:" + bigCount + "个");
        System.out.println("数字字符:" + numCount + "个");

    }
}

输出结果为:

image-20230130225209151

6. String 字符串的截取方法

public String substring(int beginIndex, int endIndex)     截取
      注意点:包头不包尾,包左不包右
	    只有返回值才是截取的小串
public String substring(int beginIndex)     截取到末尾

下面我们来了解一下这两个方法:

package cn.edu.hgu.string.method;

public class StringMethodDemo3 {
    public static void main(String[] args) {

        String s = "itheima";

        String result1 = s.substring(2);

        System.out.println(result1);

        System.out.println("----------");

        String result2 = s.substring(0, 2);

        System.out.println(result2);
    }
}

输出结果为:

image-20230130225819918

注意:截取出来的内容,是作为新的字符串返回,别忘记找变量接收

案例:手机号屏蔽

需求:以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽,最终效果为:156****1234

分析:

  1. 键盘录入字符串
  2. 截取前三位
  3. 截取后四位
  4. 前三位 + “****” +后四位

代码实现:

package cn.edu.hgu.test;

import java.util.Scanner;

public class StringTest3 {
    public static void main(String[] args) {
        // 1.键盘录入字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入手机号:");
        String tel = sc.nextLine();

        // 2. 截取前三位
        String start = tel.substring(0, 3);

        // 3. 截取后四位
        String end = tel.substring(7);

        // 4. 前三位 + "****" +后四位
        System.out.println(start + "****" + end);
    }
}

输出结果为:

image-20230131084340548

7. String 字符串的替换方法

public String replace(旧值,新值)  替换
      注意点:返回值才是替换之后的结果

下面我们来学习一下这个方法:

package cn.edu.hgu.string.method;

public class StringMethodDemo4 {
    public static void main(String[] args) {

        String s = "itheima";

        System.out.println("原字符串为:" + s);

        String result = s.replace("heima", "baima");

        System.out.println("替换后的字符串为:" + result);
    }
}

输出结果为:

image-20230131084847033

案例:敏感词替换

需求:键盘录入一个 字符串,如果字符串中包含(TMD),则使用 *** 替换

示例:

辅助你 TMD 是不是有病,  你出无尽干什么 ?
辅助你 *** 是不是有病,  你出无尽干什么 ?

代码实现:

package cn.edu.hgu.test;

import java.util.Scanner;

public class StringTest4 {
    /*
        需求:键盘录入一个字符串,如果字符串中包含(TMD),则使用 *** 替换
     */
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入:");
        String content = sc.nextLine();

        content = content.replace("TMD", "***");

        System.out.println(content);

    }
}

输出结果为:

image-20230131090030403

8. String 字符串的切割方法

public String[] split(String regex) :
	根据传入的字符串作为规则进行切割
	将切割后的内容存入字符串数组中,并将字符串数组返回

下面我们来学习一下字符串的切割方法:

package cn.edu.hgu.string.method;

public class StringMethodDemo5 {
    public static void main(String[] args) {
        String s1 = "192,168,1,1";

        String[] sArr1 = s1.split(",");

        for (int i = 0; i < sArr1.length; i++) {
            System.out.println(sArr1[i]);
        }

        String s2 = "192.168.1.1";

        String[] sArr2 = s2.split("\\.");

        for (int i = 0; i < sArr2.length; i++) {
            System.out.println(sArr2[i]);
        }
    }
}

输出结果为:

image-20230131093955483

建议:先正常指定切割规则,后来发现没有得到自己要的效果,就可以尝试在规则前面,加入 \

9. String 方法小结

public boolean  equals方法 (要比较的字符串)  :  比较内容
public boolean  equalsIgnoreCase (要比较的字符串) : 比较内容, 忽略大小写
public char[]  toCharArray ()    将字符串转换为字符数组 
public char chatAt (int index)  根据索引找字符
public int length() : 返回字符串的长度
public String substring(int beginIndex)     截取到末尾
public String substring(int beginIndex, int endIndex)     根据开始和结束索引做截取, 包含头不包含尾
public String replace(旧值,新值)  替换
public String[] split(String regex) :切割

三、StringBuilder 类

1. StringBuiler 引入

提高字符串操作效率

我们通过一段代码来看一下是否能提高操作效率:

package cn.edu.hgu.stringbuilder;

public class StringBuilderDemo1 {
    public static void main(String[] args) {
        long time1 = getTime1();
        long time2 = getTime2();

        System.out.println("第一次用时:" + time1 + "毫秒");
        System.out.println("第二次用时:" + time2 + "毫秒");

    }

    private static long getTime2() {
        long start = System.currentTimeMillis();

        StringBuilder sb = new StringBuilder();

        for (int i = 1; i <= 10000; i++) {
            sb.append(i);
        }

        System.out.println(sb);

        long end = System.currentTimeMillis();

        long time = end - start;
        return time;
    }

    private static long getTime1() {
        // 获取1970年1月1日0分0秒到现在所经历的毫秒值(1秒 = 1000毫秒)
        long start = System.currentTimeMillis();

        String s = "";

        for (int i = 1; i <= 10000; i++) {
            s += i;
        }

        System.out.println(s);

        long end = System.currentTimeMillis();

        long time = end - start;
        return time;
    }
}

输出结果为:

image-20230131095726487

可以看到,使用 StringBuilder 类用时明显少于 String 类。

2. StringBuiler

StringBuilder是一种可变的字符序列

package cn.edu.hgu.stringbuilder;

public class StringBuilderDemo2 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        System.out.println(sb);

        sb.append("红色");
        System.out.println(sb);

        sb.append("绿色");
        System.out.println(sb);

        sb.append("蓝色");
        System.out.println(sb);
    }
}

输出结果为:

image-20230131102948399

StringBuilder是字符串的缓冲区, 我们可以将其理解为是一种容器,这个容器可以存储任意数据类型,但只要进入到这个容器,全部变成字符串。

package cn.edu.hgu.stringbuilder;

public class StringBuilderDemo2 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();

        sb.append(100);
        sb.append(45.6);
        sb.append(false);
        sb.append('中');
        sb.append("黑马程序员");

        System.out.println(sb);
    }
}

输出结果为:

image-20230131102729395

3. StringBuiler 构造方法

构造方法 说明
public StringBuilder() 创建一个空的字符串缓冲区(容器),其初始容量为16个字符
public StringBuilder(String str) 创建一个字符串缓冲区, 并初始化好指定的参数内容

4. StringBuiler 常用方法

方法名 说明
public StringBuilder append (任意类型) 添加数据,并返回对象本身
public StringBuilder reverse() 反转容器中的内容
public int length() 返回长度 ( 字符出现的个数)
public String toString() 通过toString()就可以实现把StringBuilder转换为String
1)public StringBuilder append (任意类型):

添加数据,并返回对象本身

package cn.edu.hgu.stringbuilder;

public class StringBuilderDemo3 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        StringBuilder sb2 = sb.append("绿色");
        StringBuilder sb3 = sb.append("红色");
        StringBuilder sb4 = sb.append("蓝色");

        System.out.println(sb == sb2);
        System.out.println(sb2 == sb3);
        System.out.println(sb3 == sb4);
        System.out.println(sb4 == sb);
    }
}

输出结果为:

image-20230131103729996

因为该方法返回对象本身,那么我们可以使用链式编程来简化代码:

package cn.edu.hgu.stringbuilder;

public class StringBuilderDemo3 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();

        // 链式编程:调用的方法,返回的结果是对象,就可以继续向下调用方法
        sb.append("绿色").append("红色").append("蓝色");

        System.out.println(sb);
    }
}

2)public StringBuilder reverse()

反转容器中的内容

package cn.edu.hgu.stringbuilder;

public class StringBuilderDemo3 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();

        // 链式编程:调用的方法,返回的结果是对象,就可以继续向下调用方法
        sb.append("绿色").append("红色").append("蓝色");

        System.out.println(sb);

        sb.reverse().append("你好");

        System.out.println(sb);
    }
}

输出结果为:

image-20230131111034759

3)public int length()

返回长度

package cn.edu.hgu.stringbuilder;

public class StringBuilderDemo3 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();

        // 链式编程:调用的方法,返回的结果是对象,就可以继续向下调用方法
        sb.append("绿色").append("红色").append("蓝色");

        System.out.println(sb);
        System.out.println(sb.length());//6

    }
}

4)public String toString()

通过toString()就可以实现把StringBuilder转换为String

package cn.edu.hgu.stringbuilder;

public class StringBuilderDemo3 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();

        // 链式编程:调用的方法,返回的结果是对象,就可以继续向下调用方法
        sb.append("绿色").append("红色").append("蓝色");

        System.out.println(sb);

        // 情况:我数据在StringBuilder当中,我要调用的方法,StringBuilder没有,但String有
        // 解决:转换为String类,再调用

        String[] sArr = sb.toString().split("色");

        for (int i = 0; i < sArr.length; i++) {
            System.out.println(sArr[i]);
        }

    }
}

5. StringBuilder 案例

1)对称字符串

需求:键盘接受一个字符串,程序判断出该字符串是否是对称字符串(回文字符串),并在控制台打印是或不是

  • 对称字符串:123321、111

  • 非对称字符串:123123

思路:对拿到的字符串进行反转,反转后的内容,根原数据相同,判定为回文字符串

代码实现:

package cn.edu.hgu.test;

import java.util.Scanner;

public class StringBuilderTest1 {
    /*
        需求:键盘接受一个字符串,程序判断出该字符串是否是对称字符串(回文字符串),并在控制台打印是或不是
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String content = sc.nextLine();

        // 将String类型转换为StringBuilder类型,为了调用内部反转的方法
        StringBuilder sb = new StringBuilder(content);
        String s = sb.reverse().toString();

        // 判断反转后的内容,和原数据是否相同
        if (content.equals(s)) {
            System.out.println("是对称字符串");
        } else {
            System.out.println("不是对称字符串");
        }
    }
}

输出结果为:

image-20230131112622415

String类型和StringBuilder类型互相转换:

String ---> StringBUilder
			String s = "abc";
			StringBuilder sb = new Stringbuilder(sb);
StringBuilder ---> String
    		String s = sb.toString();
2)拼接字符串

需求:定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回。

调用该方法,并在控制台输出结果。

例如:数组为int[] arr = {1,2,3};

执行方法后的输出结果为:[1, 2, 3]

代码实现:

package cn.edu.hgu.test;

public class StringBuilderTest2 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};

        StringBuilder result = arrayToString(arr);
        System.out.println(result);

    }

    private static StringBuilder arrayToString(int[] arr) {
        // 1.创建StringBuilder,准备进行拼接
        StringBuilder sb = new StringBuilder("[");

        // 2.遍历数组,获取内部元素
        for (int i = 0; i < arr.length - 1; i++) {
            // 3.将获取到的元素,拼接到字符串缓冲区
            sb.append(arr[i]).append(", ");
        }

        // 4.特殊处理最后一个元素
        sb.append(arr[arr.length - 1]).append("]");

        return sb;
    }

}

输出结果为:

image-20230131114405983

参考文章:

Java中的常量优化机制
c";

  	StringBuilder sb = new Stringbuilder(sb);

StringBuilder —> String
String s = sb.toString();

2)拼接字符串

需求:定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回。

调用该方法,并在控制台输出结果。

例如:数组为int[] arr = {1,2,3};

执行方法后的输出结果为:[1, 2, 3]

代码实现:

package cn.edu.hgu.test;

public class StringBuilderTest2 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};

        StringBuilder result = arrayToString(arr);
        System.out.println(result);

    }

    private static StringBuilder arrayToString(int[] arr) {
        // 1.创建StringBuilder,准备进行拼接
        StringBuilder sb = new StringBuilder("[");

        // 2.遍历数组,获取内部元素
        for (int i = 0; i < arr.length - 1; i++) {
            // 3.将获取到的元素,拼接到字符串缓冲区
            sb.append(arr[i]).append(", ");
        }

        // 4.特殊处理最后一个元素
        sb.append(arr[arr.length - 1]).append("]");

        return sb;
    }

}

输出结果为:

image-20230131114405983

参考文章:

Java中的常量优化机制

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java字符串 的相关文章

  • 如何在java中压缩/解压tar.gz文件

    谁能告诉我在java中压缩和解压缩tar gzip文件的正确方法我一直在搜索 但我能找到的最多的是zip或gzip 单独 我写了一个包装器公共压缩 http commons apache org compress called jarchi
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • 在哈希图中存储字符和二进制数

    我正在尝试存储字母到二进制数的映射 这是我的映射 h 001 i 010 k 011 l 100 r 101 s 110 t 111 为此 我创建了一个哈希映射并存储了键值对 我现在想显示给定句子的相应二进制值 这是我的代码 package
  • 代码编译期间遇到警告消息“使用或覆盖已弃用的 API”

    我编译了我的程序并收到以下错误 我该如何解决呢 Note ClientThreadClients java uses or overrides a deprecated API Note Recompile with Xlint depre
  • 通过 JNI 从 Applet 调用 DLL

    我有一个 概念验证 的作品 它跨越了一些不熟悉的领域 我的任务是将 EFTPOS 机器连接到在内联网浏览器中作为小程序运行的应用程序 我暂时忽略了 EFTPOS dll 并用我选择的语言 Delphi 创建了一个简单的 JNI 修饰的 DL
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • XSLT:我们可以使用abs值吗?

    我想知道在 XSLT 中我们是否可以使用 math abs 我在某处看到过这个 但它不起作用 我有类似的东西
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指
  • NoSuchMethodError:将 Firebase 与应用程序引擎应用程序集成时

    我试图将 firebase 实时数据库与谷歌应用程序引擎应用程序集成 我在调用时收到此错误 gt DatabaseReference ref FirebaseDatabase gt getInstance gt getReference t
  • 删除 ArrayList 对象问题

    我在处理作业时遇到从 ArrayList 中删除对象的问题 如果我使用 正常 for 循环 它的工作原理如下 public void returnBook String isbn for int i 0 i lt booksBorrowed
  • Hibernate @OneToMany 注释到底是如何工作的?

    我对 Hibernate 还很陌生 我正在通过教程学习它 我在理解到底如何一对多注释作品 所以我有这两个实体类 Student代表一个学生并且Guide代表指导学生的人 因此 每个学生都与一名向导相关联 但一名向导可以跟随多个学生 我想要一
  • 如何在 Java 中创建要打印到 JFrame 的 JLabels 数组

    我正在尝试制作一系列标签 每个标签都有一个来自函数的不同值 我不知道要使用的标签的确切数量 我的意思是可以打印任意数量的值 请帮我做这件事 很简单 只需一个方法返回一个数组或一些 JLabels 集合 并将它们全部添加到您的 JCompon
  • 为什么 RMI 注册表忽略 java.rmi.server.codebase 属性

    我正在运行 java RMI 的 Hello World 示例 1 我在空文件夹中运行注册表 motta motta laptop tmp rmiregistry 2 我启动 HTTP 服务器以在运行时检索类 下载文件夹包含客户端 服务器的
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • 如何使用 Hibernate Session.doWork(...) 进行保存点/嵌套事务?

    我正在使用 JavaEE JPA 托管事务与 Oracle DB 和 Hibernate 并且需要实现某种嵌套事务 据我所知 此类事情不受开箱即用的支持 但我应该能够为此目的使用保存点 正如建议的https stackoverflow co
  • 设计抽象类时是否应该考虑序列化问题?

    一般来说这个问题来自Eclipse建议在抽象类上添加串行版本UID 由于该类是抽象类 因此该类的实例永远不会存在 因此它们永远不会被序列化 只有派生类才会被序列化 所以我的问题是放置一个安全 SuppressWarnings serial
  • 如何使用 SAX Java 解析器读取注释文本

    我只想使用 Java 中的 SAX 解析器读取 XML 文件中对象标记的注释 这是我的文件的摘要
  • 如何使用maven创建基于spring的可执行jar?

    我有一个基于 Maven 的 Spring WS 客户端项目 我想将其打包为单个 jar 在eclipse中 一切运行正常 当我尝试将其打包为可执行 jar 时 我收到 ClassNotFound 异常 因为 Spring jar 未包含在
  • JPA - 非主键字段上的 @OneToOne 关系不起作用

    我有一个 Spring Data JPA 后端 使用 Hibernate 作为 ORM 实现 这是模型 Person MailConfig id PK uid PK FK Person uid uid Entity

随机推荐

  • 分享24个Python接单平台,有技术等于有收入!

    一 Python兼职种类 接私活刚学会python那会 就有认识的朋友介绍做一个网站的私活 当时接单赚了4K 后又自己接过开发网站后台接口 做数据处理等事情 都赚了一些 接私活指的是利用自己的技术 在业余时间搞定用户整块需求 对方在开始前预
  • Java自动化框架配置监听器生成测试报告邮件发送

    TestNG官网 https testng org doc documentation main html introduction TestNG博客 https www jianshu com p 8a729de618b6 一 接口自动化
  • JMETER接口测试_参数化和关联实现注册、登录和查询

    JMETER接口测试 参数化和关联 实现如下 1 注册接口 实现参数化 2 登录接口 关联用第一步中的用户和密码 3 博文查询接口 关联登录接口返回的token和userid 1 添加Thread Group 2 添加HTTP Reques
  • NameNode: Permission denied&无法启动Hadoop解决方法

    NameNode Permission denied publickey gssapi keyex gssapi with mic password 就是这个原因 这个问题的出现主要是因为没有给authorized keys授权 解决方法如
  • VMware虚拟机安装MacOS Big Sur

    之前完善了vm安装Windows系统的教程 今天给大家分享一个vm安装MacOS的教程 我们今天用macOS Big Sur版本来做教程演示 注 使用VMware安装MacOS哪怕配置给的高也会出现体验上的不佳 大家可以尽可能调高适当的配置
  • ElasticSearch 双数据中心建设在新网银行的实践

    本文公众号读者飞熊的投稿 本文主要讲述了ElasticSearch 双数据中心建设在新网银行的实践 作者简介 飞熊 目前就职于新网银行大数据中心 主要从事大数据实时计算和平台开发相关工作 对Flink Spark 以及ElasticSear
  • goland语法面试题

    文章目录 1 关于 switch 语句 下面说法正确的是 2 下面代码能编译通过吗 可以的话 输出什么 3 interface 是可以指向任意对象的 Any 类型 是否正确 4 下面的代码有什么问题 1 关于 switch 语句 下面说法正
  • Unity5热更新ILRuntime 使用 Protobuf3.0

    Unity5热更新ILRuntime 使用 Protobuf3 0 须知 1 pb3官方用到了C 很多的新语法 所以在unity主工程中直接撸码是不可以的 还好github上面有同僚作了framework35版的 2 ILrt中的类目前是不
  • R语言与面向对象的编程(3):R6类

    专注系列化 高质量的R语言教程 本号已支持快捷转载 无需白名单即可转载 本系列将介绍R语言中三个与面向对象的编程 Object Oriented Programming OOP 相关的工具包 proto R6和基础包methods 这是一个
  • python中,@和-> 代表什么?

    今天把代码放到Hadoop平台时调试代码的时候报错 但是在本地测试并没有什么问题 然后可查看了下代码 报错的地方这么定义的 看到这个符号觉得很奇怪 因为在Python中确实没见过这个符号 后来查了一下 参考这个博主写的 https blog
  • noip2008 火柴棒等式 (暴力枚举)

    P1496火柴棒等式 Accepted 标签 搜索 NOIP提高组2008 描述 给你n根火柴棍 你可以拼出多少个形如 A B C 的等式 等式中的A B C是用火柴棍拼出的整数 若该数非零 则最高位不能是0 用火柴棍拼数字0 9的拼法如图
  • 算法基础\BFS\DFS

    1 200 岛屿数量 题目描述 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向和 或竖直方向上相邻的陆地连接形成 此外 你可以假设该网格的四条边均被水包围 示例 示
  • 41.cuBLAS开发指南中文版--cuBLAS中的Level-2gemvBatched()

    2 6 24 cublas
  • numpy 三维矩阵下采样小技巧

    问题描述 我们有一个 160 192 224 的三维矩阵 由于其过大 跑神经网络时显存不够 此时我们的一个思路就是对其进行一个简单的下采样 即没3x3x3的小方格里只取其中间的那个数 现在的问题是如何快速高效地实现这个计算 而不是使用多个f
  • 爬虫代理IP池怎么来的,可能遇到哪些问题,怎么解决

    目录 前言 一 代理IP对爬虫工作的重要性 二 代理IP池从哪里来 三 爬虫工作中可能会遇到哪些问题 四 怎么解决遇到的问题 总结 前言 爬虫工作离不开代理IP的支持 代理IP在爬虫工作中发挥重要的作用 但爬虫代理IP池从哪里来呢 爬虫工作
  • 口令破解(概述、暴力破解、字典破解、Hydra)

    文章目录 口令破解 概述 口令安全现状 破解方式 暴力破解 字典破解 Hydra quarkspwdump 口令破解 概述 现在很多地方都以用户名 账号 和口令 密码 作为鉴权的方式 口令 密码 就意味着访问权限 口令 密码 就相当于进入家
  • sata接口_无线网卡M.2(ngff) keyA/E接口扩展sata硬盘接口,黑群辉NAS系统

    miniPC普及 主板小型化后 PCIE接口数量减少到1 2个 甚至没有 sata接口数量也大幅减少 这样的主板对于想使用多硬盘 特别是要黑群辉NAS系统的 是不适合的 好在某些主板有无线网卡M 2 ngff 接口 为扩展sata存留了希望
  • 华为手机助手上架流程_2019年各大安卓应用商店上架经验,含流程,物料,方法,建议收藏...

    注册应用商店账号 申请应用商店上架是APP推广的第一步 这一步没做好 会延迟甚至耽误后续的工作 因此 做好上架工作尤为重要 今天姑婆根据我们自己APP上架的经验进行了整理 分享给大家 希望对大家有所帮助 一 安卓应用商店格局 据调查显示在中
  • 【ubuntu】安装tensorRT

    tensorRT官方安装文档TensorRT3 Installation Guide RC pdf位于tensorRT下载页面 1 tensorRT下载 将tensorRT下载到想要安装的目录 https developer nvidia
  • Java字符串

    文章目录 Java字符串 一 Java常用 API 二 String 类 1 String 类的特点 1 Java 程序中所有双引号字符串 都是 String 类的对象 2 字符串在创建之后 其内容不可更改 3 字符串虽然不可改变 但是可以