主頁 > 後端開發 > 常用工具類

常用工具類

2022-11-27 07:06:10 後端開發

Apache-Commons-*

字串

判斷字串是否為空白字串

以前判斷字串是否為空:

if ((name == null) || (name.isEmpty())){}

使用 apache-common-lang3StringUtils

void testIsBlank() {
   // true
   Assertions.assertTrue(StringUtils.isBlank(" "));

   // true
   Assertions.assertTrue(StringUtils.isBlank(""));

   // true
   Assertions.assertTrue(StringUtils.isBlank(null));

   // false
   Assertions.assertFalse(StringUtils.isBlank("foo"));

   // true
   Assertions.assertTrue(StringUtils.isAnyBlank(null, " "));

   // false
   Assertions.assertFalse(StringUtils.isAnyBlank("foo", " bar "));
}
左邊填充字串

有時候我們需要生成流水號,例如4位數的流水號,從1開始其余用字符'0'填充,就可以使用 leftPad 方法,示例如下:

@Test
void testLeftPad() {
   // 0001
   Assertions.assertEquals("0001", StringUtils.leftPad("1", 4, '0'));
}
右邊填充字串
@Test
void testRightPad() {
   // 1000
   Assertions.assertEquals("1000", StringUtils.rightPad("1", 4, '0'));
}
分割字串
// ["a","b","c"]
Assertions.assertEquals(Arrays.toString(new String[]{"a", "b", "c"}), Arrays.toString(StringUtils.split("a,b,c", ",")));
字串比較
// true
Assertions.assertTrue(StringUtils.equals(null, null));

// false
Assertions.assertFalse(StringUtils.equals("null", null));
字串已指定子字串開頭
@Test
void testStartWith() {
   // true
   Assertions.assertTrue(StringUtils.startsWith("hello,world", "hello"));

   // false
   Assertions.assertFalse(StringUtils.startsWith("你好,世界", "世界"));
}

數值工具類

轉換為 int 型別

將字串轉換為 int 型別,toInt(String str) 在轉換失敗的時候會回傳默認值 0,如果需要指定默認值那么可以使用 toInt(final String str, final int defaultValue)

@Test
void testToInt() {
   // 0
   Assertions.assertEquals(0, NumberUtils.toInt("abc"));

   // 0
   Assertions.assertEquals(0, NumberUtils.toInt("01c"));

   // 0
   Assertions.assertEquals(0, NumberUtils.toInt("1a3"));

   // 1
   Assertions.assertEquals(1, NumberUtils.toInt("foo", 1));

   // 11
   Assertions.assertEquals(11, NumberUtils.toInt("11"));

   // 11
   Assertions.assertEquals(11, NumberUtils.toInt("011", 3));
}

陣列

判斷陣列是否為空
@Test
void testIsEmpty() {
   // true
   Assertions.assertTrue(ArrayUtils.isEmpty(new Object[]{}));

   // false
   Assertions.assertFalse(ArrayUtils.isEmpty(new String[]{"foo"}));
}

日期

增加指定天數

除了增加指定的天數,common-lang3 還提供了:

  1. addHours:增加指定小時
  2. addMonths:增加指定月數
  3. 等...
@Test
void testAddDay() {
   Date now = new Date();
   Date tomorrow = DateUtils.addDays(now, 1);

   Assertions.assertEquals(1, Duration.ofMillis(tomorrow.getTime() - now.getTime()).toDays());
   Assertions.assertEquals(Duration.ofDays(1).toMillis(), Duration.ofMillis(tomorrow.getTime() - now.getTime()).toMillis());
}
格式化日期
tring pattern = "yyyy-MM-dd HH:mm:ss";
Date d1 = DateUtils.parseDate("2022-10-22 00:00:00", pattern);

Assertions.assertEquals("2022-10-22 00:00:00", DateFormatUtils.format(d1, pattern));
判斷是否為同一天
String parsePattern = "yyyy-MM-dd HH:mm:ss";
Date d1 = DateUtils.parseDate("2022-10-22 00:00:00", parsePattern);
Date d2 = DateUtils.parseDate("2022-10-22 23:59:59", parsePattern);
// true
Assertions.assertTrue(DateUtils.isSameDay(d1, d2));

d1 = DateUtils.parseDate("2022-10-23 00:00:00", parsePattern);
d2 = DateUtils.parseDate("2022-10-22 00:00:00", parsePattern);
// false
Assertions.assertFalse(DateUtils.isSameDay(d1, d2));

列舉

@Test
void testGetEnum() {
   Assertions.assertThrowsExactly(IllegalArgumentException.class, () -> Season.valueOf("Spring"));

   // 默認回傳null,不拋出例外
   Assertions.assertNull(EnumUtils.getEnum(Season.class, "spring"));
   // 指定默認值
   Assertions.assertEquals(Season.SPRING, EnumUtils.getEnumIgnoreCase(Season.class, "spring"));
   // 忽略大小寫匹配
   Assertions.assertEquals(Season.SPRING, EnumUtils.getEnum(Season.class, "spring", Season.SPRING));
}

enum Season {
   SPRING,
}

Guava

分割字串

在了解 Guava 提供的字串分割器之前,我們先來看看 Java 提供的字串分隔有什么缺點,如下所示,輸出的結果為:

",a,,b,".split(",")
  1. "", "a", "", "b", ""
  2. null, "a", null, "b", null
  3. "a", null, "b"
  4. "a", "b"
  5. 以上都不對

正確輸出結果是 [, a, , b],答案是選項5:“以上都不對”,Splitter 不僅實作了字串分隔,還提供了對應的修飾符,即對拆分結果進行處理,例如:

String str = "foo, bar ,,,baz";
// ["foo","bar","baz"]
Splitter.on(",")
      .trimResults()
      .omitEmptyStrings()
      .splitToList(str);

// [上下上下左, 左, 右右]
str = "baba上下上下左a左b右右";
res = Splitter.on(CharMatcher.inRange('a', 'b'))
      .trimResults()
      .omitEmptyStrings()
      .splitToList(str);
// [上下上下左, 左, 右右]      
log.info("{}", res);
拆分器工廠
方法 描述 示例
Splitter.on(char) 按單個字符拆分 Splitter.on(',');
Splitter.on(CharMatcher) 按字符匹配器拆分 Splitter.on(CharMatcher.inRange('a', 'b'))
Splitter.on(String) 按字串拆分 Splitter.on(", ")
Splitter.on(Pattern)或onPattern(String) 按正則運算式拆分 Splitter.on("\r?\n ")
Splitter.fixedLength(int) 按固定長度拆分;最后一段可能比給定長度短,但不會為空, Splitter.fixedLength(3)
拆分器修飾符
方法 描述
omitEmptyStrings() 從結果中自動忽略空白字串
trimResults() 移除結果字串的首位空白字符
trimResults(CharMatcher) 給定匹配器,移除結果字串的首位匹配字符
limit(int) 限制拆分出的字串數量

不可變集合

public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
        "red",
        "orange",
        "yellow",
        "green",
        "blue",
        "purple");

class Foo {
    Set<Bar> bars;
    Foo(Set<Bar> bars) {
        this.bars = ImmutableSet.copyOf(bars); // defensive copy!
    }
}

不可變物件有很多的優點:

  1. 當物件被不可信的庫呼叫時,不可變形式是安全的;
  2. 不可變物件被多個執行緒呼叫時,不存在競態條件問題
  3. 不可變集合不需要考慮變化,因此可以節省時間和空間,所有不可變的集合都比它們的可變形式有更好的記憶體利用率(分析和測驗細節);
  4. 不可變物件因為有固定不變,可以作為常量來安全使用,
使用不可變集合

不可變集合可以用如下多種方式創建:

  1. copyOfImmutableList.copyOf
  2. ofImmutableList.of("a","b","c")
  3. Builder 工具,例如:
public static final ImmutableSet<Color> GOOGLE_COLORS =
        ImmutableSet.<Color>builder()
            .addAll(WEBSAFE_COLORS)
            .add(new Color(0, 191, 255))
            .build();

連接字串

@Test
void testJoin() {
   // foo,bar
   Assertions.assertEquals("foo,bar", Joiner.on(',').join(ImmutableList.of("foo", "bar")));

   // foo
   Assertions.assertEquals("foo", Joiner.on(',').skipNulls().join("foo", null));

   // foo,empty
   Assertions.assertEquals("foo,empty", Joiner.on(',').useForNull("empty").join("foo", null));


   // 拋出空指標例外
   Assertions.assertThrowsExactly(NullPointerException.class, () -> Joiner.on(',').join("foo", null));
}

警告:joiner實體總是不可變的,用來定義joiner目標語意的配置方法總會回傳一個新的joiner實體,這使得joiner實體都是執行緒安全的,你可以將其定義為static final常量,

Strings

null 轉換為空字串:

Assertions.assertEquals("", Strings.nullToEmpty(null));

將空字串轉換為 null

Assertions.assertEquals(null, Strings.emptyToNull(""));
Assertions.assertEquals(null, Strings.emptyToNull(null));

CharMatcher

String noControl = CharMatcher.JAVA_ISO_CONTROL.removeFrom(string); //移除control字符
String theDigits = CharMatcher.DIGIT.retainFrom(string); //只保留數字字符
String spaced = CharMatcher.WHITESPACE.trimAndCollapseFrom(string, ' ');
//去除兩端的空格,并把中間的連續空格替換成單個空格
String noDigits = CharMatcher.JAVA_DIGIT.replaceFrom(string, "*"); //用*號替換所有數字
String lowerAndDigit = CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom(string);
// 只保留數字和小寫字母

Spring

判斷集合是否為空

@Test
void testIsEmpty() {
   Assertions.assertTrue(CollectionUtils.isEmpty((List<?>) null));
   Assertions.assertTrue(CollectionUtils.isEmpty((Set<?>) null));
   Assertions.assertTrue(CollectionUtils.isEmpty((Map<?, ?>) null));

   Assertions.assertTrue(CollectionUtils.isEmpty(Collections.emptyList()));
   Assertions.assertTrue(CollectionUtils.isEmpty(Collections.emptySet()));
   Assertions.assertTrue(CollectionUtils.isEmpty(Collections.emptyMap()));

   Assertions.assertTrue(CollectionUtils.isEmpty(List.of()));
   Assertions.assertTrue(CollectionUtils.isEmpty(Set.of()));
   Assertions.assertTrue(CollectionUtils.isEmpty(Map.of()));

   List<Object> list = new LinkedList<>();
   list.add(new Object());
   Assertions.assertFalse(CollectionUtils.isEmpty(list));
   Assertions.assertFalse(CollectionUtils.isEmpty(List.of("foo")));

   Map<String, String> map = new HashMap<>();
   map.put("foo", "bar");
   Assertions.assertFalse(CollectionUtils.isEmpty(map));
   Assertions.assertFalse(CollectionUtils.isEmpty(Map.of("foo", "bar")));
}

獲取集合的第一個元素

@Test
void testFirstElement() {
   Assertions.assertNull(CollectionUtils.firstElement((Set<?>) null));
   Assertions.assertNull(CollectionUtils.firstElement((List<?>) null));

   List<String> list = new ArrayList<>();
   list.add(null);
   // null
   Assertions.assertNull(CollectionUtils.firstElement(list));

   list = new ArrayList<>();
   list.add("foo");
   // foo
   Assertions.assertEquals("foo", CollectionUtils.firstElement(list));

   list = List.of("foo", "bar");
   // foo
   Assertions.assertEquals("foo", CollectionUtils.firstElement(list));


   Set<String> set = new TreeSet<>();
   set.add("b");
   set.add("a");
   // a
   Assertions.assertEquals("a", CollectionUtils.firstElement(set));

   // b
   set = new TreeSet<>(Comparator.reverseOrder());
   set.add("b");
   set.add("a");
   Assertions.assertEquals("b", CollectionUtils.firstElement(set));
}

獲取集合的最后一個元素

@Test
void testLastElement() {
   Assertions.assertNull(CollectionUtils.lastElement((Set<?>) null));
   Assertions.assertNull(CollectionUtils.lastElement((List<?>) null));

   List<String> list = new ArrayList<>();
   list.add(null);
   Assertions.assertNull(CollectionUtils.lastElement(list));

   list = new ArrayList<>();
   list.add("foo");
   list.add("bar");
   // bar
   Assertions.assertEquals("bar", CollectionUtils.lastElement(list));

   list = List.of("foo", "bar");
   Assertions.assertEquals("bar", CollectionUtils.lastElement(list));

   Set<String> set = new TreeSet<>();
   set.add("b");
   set.add("a");
   // b
   Assertions.assertEquals("b", CollectionUtils.lastElement(set));

   set = new TreeSet<>(Comparator.reverseOrder());
   set.add("b");
   set.add("a");
   // a
   Assertions.assertEquals("a", CollectionUtils.lastElement(set));
}

物件屬性拷貝

添加一個測驗物件:

class User {
   private String name;
   private String email;
   
   // 忽略getXxx和setXxx方法
@Test
void testCopyProperties() {
   User user =  new User();
         user.setName("foo");
         user.setEmail("bar");

   User target = new User();
    
   // 拷貝屬性
   BeanUtils.copyProperties(user, target, "email");

   Assertions.assertEquals("foo", target.getName());
   Assertions.assertNull(target.getEmail());
}

命名的 ThreadLocal

@Test
void testNamedThreadLocal() {
   NamedThreadLocal<String> threadLocal = new NamedThreadLocal<>("task");
   Assertions.assertEquals("task", threadLocal.toString());
}

判斷物件是否相等

@Test
void testNullSafeEquals() {
   Assertions.assertTrue(ObjectUtils.nullSafeEquals(null, null));
   Assertions.assertTrue(ObjectUtils.nullSafeEquals("a", "a"));
   Assertions.assertTrue(ObjectUtils.nullSafeEquals(Optional.of("a"), Optional.of("a")));
}

判斷物件是否為空

@Test
void testIsEmpty() {
   Assertions.assertTrue(ObjectUtils.isEmpty((Object) null));
   Assertions.assertTrue(ObjectUtils.isEmpty(Optional.empty()));
   Assertions.assertTrue(ObjectUtils.isEmpty(""));
   Assertions.assertTrue(ObjectUtils.isEmpty(new String[]{}));
   Assertions.assertTrue(ObjectUtils.isEmpty(Collections.emptyList()));
   Assertions.assertTrue(ObjectUtils.isEmpty(Collections.emptyMap()));
}

資源工具類

有時候我們需要加載 classpath 目錄下的資源,例如:

File file = new File(ResourceUtilsTests.class.getClassLoader().getResource("log4j2.xml").toURI());
Assertions.assertEquals("log4j2.xml", file.getName());

使用 SpringResourceUtils 只需要這么寫:

File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "log4j2.xml");
Assertions.assertEquals("log4j2.xml", file.getName());

計時器

@Test
void testStopWatch() throws InterruptedException {
   // 創建一個計時器(秒表)
   StopWatch stopWatch = new StopWatch();
   // 開始計時
   stopWatch.start();
   Thread.sleep(Duration.ofSeconds(1).toMillis());
   // 停止計時
   stopWatch.stop();
   // 獲取總耗時(毫秒)
   // 1005ms.
   log.info("{}ms.", stopWatch.getTotalTimeMillis());
   // 1s.
   log.info("{}s.", Duration.ofMillis(stopWatch.getTotalTimeMillis()).toSeconds());
}

UriComponentsBuilder

有時候我們需要在服務端手動發送請求,在請求 url 我們使用字串拼接的方式,Spring 提供了UriComponentsBuilder 能讓我們更加語意化來構建一個請求url,而且還會自動對url進行編碼:

@Test
void testFromUriString() {
   String uri = UriComponentsBuilder
         .fromUriString("/coffee/{foo}/{id}/like")
         .build("aa", "bb")
         .toString();
   Assertions.assertEquals("/coffee/aa/bb/like", uri);

   uri = UriComponentsBuilder
         .fromUriString("http://localhost:8080/coffe/{id}")
         .encode()
         .build(1).toString();
   Assertions.assertEquals("http://localhost:8080/coffe/1", uri);

   uri = UriComponentsBuilder
         .fromUriString("http://localhost:8080/coffee?name={name}")
         .build(" ").toString();
   Assertions.assertEquals("http://localhost:8080/coffee?name=%20",uri);
}

hutool

校驗

@Test
void testIsCitizenId() {
   // 校驗是否為身份證
   Assertions.assertTrue(Validator.isCitizenId("110101199003074477"));

   // 15位身份證號碼驗證
   Assertions.assertTrue(Validator.isCitizenId("410001910101123"));

   // 10位身份證號碼驗證
   Assertions.assertTrue(Validator.isCitizenId("U193683453"));
}

@Test
void testIsMobile() {
   // 校驗是否為手機號
   Assertions.assertTrue(Validator.isMobile("13900221432"));
   Assertions.assertTrue(Validator.isMobile("015100221432"));
   Assertions.assertTrue(Validator.isMobile("+8618600221432"));
}

@Test
void testIsPlateNumber() {
   // 校驗是否為車牌號
   Assertions.assertTrue(Validator.isPlateNumber("粵BA03205"));
   Assertions.assertTrue(Validator.isPlateNumber("閩20401領"));
}

emoji

@Test
void testToUnicode() {
   String unicode = EmojiUtil.toUnicode(":smile:");
   Assertions.assertEquals("??", unicode);
}

@Test
void testToAlias() {
   Assertions.assertEquals(":smile:", EmojiUtil.toAlias("??"));
}

@Test
void testToHtml() {
   String html = EmojiUtil.toHtml("??");
   Assertions.assertEquals("&#x1f604;", html);
}

拼音

引入依賴:

<dependency>
    <groupId>io.github.biezhi</groupId>
    <artifactId>TinyPinyin</artifactId>
    <version>2.0.3.RELEASE</version>
</dependency>

獲取拼音:

@Test
void testGetPinyin() {
   Assertions.assertEquals("ceng", PinyinUtil.getPinyin("曾"));
   Assertions.assertEquals("f o o", PinyinUtil.getPinyin("foo"));
   Assertions.assertThrowsExactly(NullPointerException.class, () -> PinyinUtil.getPinyin(null));
   Assertions.assertEquals("       ", PinyinUtil.getPinyin("    "));
   // ? ?
   log.info("{}", PinyinUtil.getPinyin("??"));
   Assertions.assertEquals("! # ¥ % ( # ) @", PinyinUtil.getPinyin("!#¥%(#)@"));
}

壓縮

轉換

@Test
void testDigitToChinese() {
   Assertions.assertEquals("零元零壹分",Convert.digitToChinese(0.01));
}

二維碼

@Test
void testGenerate() {
   // 生成二維碼
   final BufferedImage image = QrCodeUtil.generate("https://hutool.cn/", 300, 300);
   Assertions.assertNotNull(image);
}

SpringUtil

SpringUtil 實作了通過 @EnalbeAutoConfiguuration 自動裝配 Bean,檔案 spring.factories 定義如下:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.hutool.extra.spring.SpringUtil
// 獲取bean
final Demo2 testDemo = SpringUtil.getBean("testDemo");

版本比較

@Test
void testCompare() {
   Assertions.assertEquals(-1, VersionComparator.INSTANCE.compare("1.12.1", "1.12.1c"));
   Assertions.assertEquals(1, VersionComparator.INSTANCE.compare("V0.0.20170102", "V0.0.20170101"));
}

身份證

private static final String ID_18 = "321083197812162119";
private static final String ID_15 = "150102880730303";

/**
 * 根據身份編號獲取生日,只支持15或18位身份證號碼.
 */
@Test
void testGetBirthByIdCard() {
   Assertions.assertEquals(IdcardUtil.getBirthByIdCard(ID_18), "19781216");

   Assertions.assertEquals(IdcardUtil.getBirthByIdCard(ID_15), "19880730");
}

打碼/資訊脫敏

void testIdCardNum() {
   Assertions.assertEquals("5***************1X",
         DesensitizedUtil.idCardNum("51343620000320711X", 1, 2));
}

@Test
void testMobilePhone() {
   Assertions.assertEquals("180****1999", DesensitizedUtil.mobilePhone("18049531999"));
}

@Test
void testPassword() {
   Assertions.assertEquals("**********", DesensitizedUtil.password("1234567890"));
}

@Test
void testEmail() {
   Assertions.assertEquals("d********@126.com", DesensitizedUtil.email("[email protected]"));
   Assertions.assertEquals("d********@gmail.com.cn", DesensitizedUtil.email("[email protected]"));
   Assertions.assertEquals("d*************@gmail.com.cn", DesensitizedUtil.email("[email protected]"));
}

加密

引入依賴:

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15to18</artifactId>
    <version>1.69</version>
</dependency>

SM4 對稱加密:

String content = "test中文"; SymmetricCrypto sm4 = SmUtil.sm4(); 
String encryptHex = sm4.encryptHex(content); 
String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);

JDK

Collections

回傳空陣列:

@Test
void testEmptyList() {
   Assertions.assertTrue(Collections.emptyList().isEmpty());
}

Arrays

列印陣列資訊,方便debug:

@Test
void testToString() {
   Assertions.assertEquals("[a, b, c]",Arrays.toString(new String[]{"a","b","c"}));
   Assertions.assertEquals("null",Arrays.toString((String[]) null));
}

Duration

有時候我們傳遞一些時間引數,單位可能是秒、毫米、分鐘、小時等,例如執行緒睡眠時間,我們可以使用 Duration 來語意化我們的代碼:

@Test
void test() throws InterruptedException {
   Thread.currentThread().sleep(Duration.ofSeconds(1).toMillis());
}

StandardCharsets

我們有時候需要用到字符集,例如:

  1. URLEncoder
  2. InputStreamReader
  3. IOUtils.toString

可以使用 StandardCharsets,例如:

IOUtils.toString(new ClassPathResource("log4j2.xml").getInputStream(), StandardCharsets.UTF_8)

Objects

物件 equals

@Test
void testEquals() {
   Assertions.assertTrue(Objects.equals(null, null));
   Assertions.assertFalse(Objects.equals("a", "b"));
}

避免空指標獲取 hashCode

@Test
void testHashCode() {
   Assertions.assertEquals(0, Objects.hashCode(null));
   Assertions.assertEquals("a".hashCode(), Objects.hashCode("a"));
}

null 轉默認值:

@Test
void testRequireNonNullElse() {
   Assertions.assertEquals("a", Objects.requireNonNullElse(null, "a"));
}

判斷物件不為空,配合 Stream

@Test
void testNonNull() {
   List<String> names = Lists.newArrayList("foo", null);
   names = names.stream()
         .filter(Objects::nonNull)
         .collect(Collectors.toList());
   Assertions.assertEquals(names, List.of("foo"));
}

Optional

@Test
void testOptional() {
   // 創建一個 Optional 物件,不允許為空
   Optional<String> optional = Optional.of("a");
   // 獲取值,如果值為空拋出 NoSuchElementException 例外
   Assertions.assertEquals("a", optional.get());
   // 判斷Optional的值是否為空
   Assertions.assertFalse(optional.isEmpty());
   // 判斷Optional的值是否不為空
   Assertions.assertTrue(optional.isPresent());

   // 創建一個 Optional 物件,允許為 null
   optional = Optional.ofNullable(null);
   // 獲取值,如果值為空拋出 NoSuchElementException 例外
   Assertions.assertThrowsExactly(NoSuchElementException.class, optional::get);
   // 判斷Optional的值是否為空
   Assertions.assertTrue(optional.isEmpty());
   // 判斷Optional的值是否不為空
   Assertions.assertFalse(optional.isPresent());

   // 創建一個空的Optional物件
   optional = Optional.empty();
   // 獲取值,如果值為空拋出 NoSuchElementException 例外
   Assertions.assertThrowsExactly(NoSuchElementException.class, optional::get);
   // 判斷Optional的值是否為空
   Assertions.assertTrue(optional.isEmpty());
   // 判斷Optional的值是否不為空
   Assertions.assertFalse(optional.isPresent());
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538452.html

標籤:其他

上一篇:day24-服務器端渲染技術02

下一篇:<一>繼承的基本意義

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more