Kujifunza kutumia contains() katika Java: Jinsi ya Kufanya Utafutaji wa Vifungu Vidogo kwa Ufanisi

目次

1. Utangulizi: Kwa Nini Utafutaji wa Mstari Unahusu Java

Ushughulikiaji wa maandishi ni moja ya operesheni zinazotumika mara nyingi zaidi wakati wa kuandika programu katika Java.
Iwe ikikagua ingizo la mtumiaji, kuchambua maudhui ya faili, au kutafuta maneno maalum, mara nyingi unahitaji kubaini kama neno fulani limejumuishwa ndani ya mstari uliotolewa.

Ili kukidhi mahitaji haya, Java inatoa njia rahisi iitwayo contains().
Kwa njia hii, unaweza kwa urahisi kubaini kama mstari mmoja una sehemu ya mwingine.
Kwa mfano, ikiwa unataka kuangalia kama ujumbe wa kosa una neno maalum, contains() hukuruhusu kufanya hivyo katika mstari mmoja wa msimbo.

Haswa katika hali zinazohusisha kiasi kikubwa cha maandishi—kama vile programu za wavuti, usindikaji wa API, au uchambuzi wa logi—njia ya contains() inaboresha sana usomaji na matengenezo ya msimbo. Hata hivyo, kuna pia mambo muhimu ya kuzingatia kama vile hisia ya herufi kubwa/kudogo (case sensitivity) na uwezekano wa null.

Makala hii inaelezea kwa kina njia ya contains() ya Java—kutoka matumizi ya msingi na makosa ya kawaida hadi tofauti na njia zingine na matumizi ya vitendo. Lengo letu ni kutoa taarifa muhimu si tu kwa wanaoanza bali pia kwa watengenezaji wanaotumia Java katika miradi ya ulimwengu halisi.

2. Sarufi ya Msingi na Sifa za Njia ya contains()

Njia ya contains() ya Java inaamua kama mstari una sehemu ya mstari mwingine. Sarufi yake ni rahisi sana, lakini ni ya vitendo sana na hutumika mara kwa mara katika kazi za kila siku za programu.

Sarufi ya Msingi

boolean result = targetString.contains(searchString);

Njia hii ni sehemu ya darasa la String na inakubali CharSequence (kwa kawaida String) kama hoja yake. Thamani inayorejesha ni boolean: true ikiwa mstari lengwa una sehemu iliyopewa, na false vinginevyo.

Mfano wa Msimbo

String message = "Java programming is fun!";
boolean hasKeyword = message.contains("programming");

System.out.println(hasKeyword); // Output: true

Katika mfano hapo juu, sehemu ndogo ya msimbo "programming" ipo katika mstari lengwa, hivyo contains() inarejesha true.

Sifa za Njia

  • Inakagua tu mechi ya sehemu: Ikiwa unahitaji mechi kamili, tumia equals() badala yake.
  • Hisia ya herufi kubwa/kudogo: Kwa mfano, "Java" na "java" huchukuliwa kuwa tofauti (maelezo zaidi yatatolewa baadaye).
  • Haiunga mkono usemi wa kawaida (regular expressions): Kwa sababu inakagua tu uwepo wa mstari, mechi ya muundo inahitaji matches() au darasa la Pattern.

Tabia Inapopitishwa null

Kupitisha null kwa contains() husababisha NullPointerException. Kwa mfano, msimbo ufuatao utatupa hitilafu:

String text = null;
System.out.println(text.contains("test")); // Exception occurs

Vile vile, ikiwa mstari lengwa mwenyewe ni null, hitilafu ileile itatupwa. Kwa hiyo, inashauriwa sana kufanya ukaguzi wa null kabla ya kuita contains().

3. Mifano ya Matumizi ya Vitendo na Mambo Muhimu ya Kuzingatia

Njia ya contains() ya Java ni rahisi kuelewa na ya manufaa, lakini matumizi yasiyo sahihi yanaweza kusababisha hitilafu zisizotarajiwa au msimbo usio na ufanisi. Sehemu hii inaelezea matumizi ya msingi ya contains() pamoja na mambo muhimu ambayo unapaswa kuzingatia.

3-1. Mfano wa Matumizi ya Msingi

Msimbo ufuatao unaonyesha mfano rahisi wa kuangalia kama mstari lengwa una neno maalum:

String sentence = "今日はJavaの勉強をしています。";

if (sentence.contains("Java")) {
    System.out.println("Javaが含まれています。");
} else {
    System.out.println("Javaは含まれていません。");
}

Kama ilivyoonyeshwa, contains() mara nyingi huunganishwa na tamko la if ili kutekeleza tawi la masharti.

3-2. Hisia ya Herufi Kubwa/Kudogo

Njia ya contains() ni hisia ya herufi kubwa/kudogo. Kwa mfano, msimbo ufuatao unarejesha false:

String text = "Welcome to Java";
System.out.println(text.contains("java")); // false

Katika hali kama hizo, ni kawaida kubadilisha nyuzi kuwa herufi ndogo (au kubwa) kabla ya kulinganisha:

String text = "Welcome to Java";
System.out.println(text.toLowerCase().contains("java")); // true

Njia hii inasaidia kuondoa tofauti katika hali ya kuingiza (k.m., kuingiza kwa mtumiaji).

3-3. Kushughulikia null na Nyuzi Tupu

Moja ya mambo muhimu zaidi wakati wa kutumia contains() ni kushughulikia null.
Ikiwa nyuzi lengo au hoja ni null, utatokea NullPointerException.

String text = null;
System.out.println(text.contains("test")); // Runtime error

Ili kuepuka tatizo hili, daima ongeza ukaguzi wa null:

if (text != null && text.contains("test")) {
    // Safe to process
}

Pia kumbuka:
Kupitisha nyuzi tupu ("") daima inarudisha true.

String sample = "test";
System.out.println(sample.contains("")); // true

Hata hivyo, tabia hii ni nadra kuwa na manufaa katika mazoezi na inaweza kusababisha makosa bila kukusudia ikiwa nyuzi tupu zitapitishwa bila kukusudia.

3-4. Haishikilii Utafutaji wa Maneno Mengi

contains() inaweza kukagua neno moja tu kwa wakati.
Ili kukagua maneno mengi, lazima uitie contains() mara nyingi au tumia API ya Stream.

String target = "エラーコード123:アクセス拒否";
if (target.contains("エラー") || target.contains("拒否")) {
    System.out.println("問題のあるメッセージです。");
}

Au, kwa seti za maneno zenye nguvu:

List<String> keywords = Arrays.asList("エラー", "障害", "失敗");
boolean found = keywords.stream().anyMatch(target::contains);

4. Mbinu Zinazolinganishwa Mara Kwa Mara na contains()

Java inatoa mbinu kadhaa za kulinganisha nyuzi au kukagua kama substring maalum ipo ndani ya nyuzi.
Miongoni mwao, contains() inatumika kwa “sawa kidogo,” lakini mbinu zingine pia hutumikia madhumuni sawa.
Sehemu hii inaeleza sifa na tofauti za mbinu hizo ili kukusaidia kuzitumia kwa usahihi.

4-1. Tofauti kutoka equals(): Sawa Kabisa dhidi ya Sawa Kidogo

equals() inaamua kama nyuzi mbili zinafanana kabisa.
Kinyume chake, contains() inakagua sawa kidogo.

String a = "Java";
String b = "Java";

System.out.println(a.equals(b));      // true: Exact match
System.out.println(a.contains("av")); // true: Partial match

Tofauti kuu:

Comparisonequals()contains()
Match TypeExact matchPartial match
Case SensitivitySensitiveSensitive
Argument TypeObjectCharSequence

Miongozo ya Matumizi:
Tumia equals() wakati maadili yanapaswa kufanana kabisa (k.m., uthibitisho wa kitambulisho).
Tumia contains() wakati sawa kidogo zinakubalika (k.m., utafutaji wa neno la msingi).

4-2. Tofauti kutoka indexOf(): Kama Unahitaji Mahali

Mbinu ya indexOf() pia inaweza kutumika kukagua kama substring ipo ndani ya nyuzi.
Tofauti ni kwamba indexOf() inarudisha kiindex cha kuanza cha substring ikiwa imepatikana.
Ikiwa substring haijapatikana, inarudisha -1.

String text = "Hello, Java World!";
System.out.println(text.indexOf("Java"));    // 7
System.out.println(text.indexOf("Python"));  // -1

Unaweza pia kutumia indexOf() kuiga tabia ya contains():

if (text.indexOf("Java") >= 0) {
    System.out.println("It is contained.");
}

Miongozo ya matumizi:
Ikiwa huhitaji kiindex, contains() ni rahisi kusomwa na inapendelewa zaidi.

4-3. Tofauti kutoka matches(): Msaada wa Usawa wa Kawaida

Mbinu ya matches() inakagua kama nyuzi inafanana kabisa na usawa wa kawaida uliopewa.
Kinyume chake, contains() inakagua tu sawa za substring halisi na haishikilii regex.

String text = "abc123";
System.out.println(text.matches(".*123")); // true
System.out.println(text.contains(".*123")); // false (not regex)

Ikiwa unataka sawa kidogo yenye msingi wa regex, tumia darasa la Pattern:

4-4. Muhtasari wa Kulinganisha Vipengele

MethodPurposeReturn TypeRegex SupportUse Case
contains()Partial matchbooleanNoKeyword search
equals()Exact matchbooleanNoID/password checks
indexOf()Get match positionintNoIndex-based processing
matches()Regex matchbooleanYesFind pattern-based strings

5. Matumizi ya Kawaida na Mifano ya Kodi

Java’s contains() method ni rahisi lakini inatumika sana katika hali za maendeleo halisi.
Matumizi ya kawaida ni pamoja na uthibitishaji wa ingizo la mtumiaji, uchambuzi wa kumbukumbu, na shughuli za kuchuja.
Sehemu hii inashughulikia mifano ya vitendo na msimbo unaohusiana.

5-1. Uthibitishaji wa Ingizo la Mtumiaji (Kugundua Maneno Yaliyokatazwa)

Katika fomu au programu za mazungumzo, unaweza kuhitaji kugundua ikiwa maneno fulani yaliyokatazwa yamejumuishwa.

String input = "このアプリは最悪だ";
String banned = "最悪";

if (input.contains(banned)) {
    System.out.println("不適切な言葉が含まれています。");
}

Kushughulikia maneno mengi ya NG:

List<String> bannedWords = Arrays.asList("最悪", "バカ", "死ね");
for (String word : bannedWords) {
    if (input.contains(word)) {
        System.out.println("不適切な言葉が含まれています: " + word);
        break;
    }
}

5-2. Uchambuzi wa Faili ya Kumbukumbu (Kugundua Ujumbe maalum)

Unapochambua kumbukumbu za mfumo au programu, unaweza kutaka kuchukua tu mistari inayotumia neno la msingi maalum kama ERROR au WARN.

List<String> logs = Arrays.asList(
    "[INFO] サーバーが起動しました",
    "[ERROR] データベース接続失敗",
    "[WARN] メモリ使用率が高い"
);

for (String log : logs) {
    if (log.contains("ERROR")) {
        System.out.println("エラー発生ログ: " + log);
    }
}

5-3. Kuchuja Mithili katika Orodha (Kutumia API ya Mkondo)

Unaposhughulikia data kubwa, tumia API ya Mkondo ili kuchukua tu vipengele vinavyotumia kifungu maalum cha maandishi:

List<String> users = Arrays.asList("tanaka@example.com", "sato@gmail.com", "yamada@yahoo.co.jp");

List<String> gmailUsers = users.stream()
    .filter(email -> email.contains("@gmail.com"))
    .collect(Collectors.toList());

System.out.println(gmailUsers); // [sato@gmail.com]

5-4. Kuchanganua Vichwa vya Ombi la HTTP au URL

Katika maendeleo ya wavuti, uelekebishaji au kushughulikia maalum kwa kifaa kunaweza kuhitaji kuangalia vifungu katika User-Agent au URL.

String userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)";
if (userAgent.contains("iPhone")) {
    System.out.println("スマートフォンからのアクセスです。");
}

5-5. Kuangalia Njia za Faili au Upitisho

Ili kubaini aina ya faili kwa kutumia njia yake:

String filePath = "/usr/local/data/sample.csv";
if (filePath.contains(".csv")) {
    System.out.println("CSVファイルです。");
}

Kumbuka:
Kwa uchunguzi wa upitisho wa faili, endsWith(".csv") mara nyingi ni sahihi zaidi.

Mazingatio ya Vitendo

  • Tumia kawaida (k.m., toLowerCase(), trim()) wakati usahihi unahitajika.
  • Kwa data ya kiwango kikubwa, zingatia API ya Mkondo au regex.
  • Kumbuka kuwa contains() ni mechi ya sehemu—unganisha na hali zingine kwa mantiki salama zaidi.

6. Mazingatio ya Utendaji

Ingawa njia ya contains() inatoa uwezo wa kusoma vizuri na urahisi, lazima uzingatie athari yake ya utendaji unaposhughulikia data kubwa au kuendesha shughuli zinazorudiwa.
Sehemu hii inaeleza gharama ya uchakataji wa contains() na mbinu mbadala kwa ufanisi ulioboreshwa.

6-1. Tabia ya Ndani na Ugumu wa Wakati wa contains()

Njia ya contains() inatafuta mnyororo wa lengo kwa mpangilio kutoka mwanzo ili kupata kifungu cha maandishi.
Ndani, inategemea njia ya indexOf(), na ugumu wake wa wakati wa hali mbaya zaidi ni:

O(n * m)
– n = urefu wa mnyororo wa lengo
– m = urefu wa mnyororo wa utafutaji

Mfano wa uchakataji mzito:

for (String line : hugeTextList) {
    if (line.contains("error")) {
        // processing
    }
}

Hii inaweza kuathiri utendaji sana wakati inarudiwa ndani ya peti kubwa.

6-2. Mbinu za Kuboresha Utendaji Wakati wa Utafutaji wa Mara Kwa Mara

Unapotumia contains() mara kwa mara katika data kubwa, mbinu zifuatazo zinaweza kuboresha kasi ya uchakataji:

• Badilisha maandishi yote kuwa herufi ndogo mapema

Badala ya kuita toLowerCase() wakati wa kulinganisha kila moja, weka kawaida ya maandishi mapema:

List<String> normalizedList = originalList.stream()
    .map(String::toLowerCase)
    .collect(Collectors.toList());
• Tumia Stream API na parallel() kwa usindikaji sambamba

Tumia vichwa vya CPU kuongeza kasi ya utafutaji:

List<String> result = hugeTextList.parallelStream()
    .filter(line -> line.contains("keyword"))
    .collect(Collectors.toList());
• Tumia regular expressions kwa mifumo ya utafutaji tata

Ikiwa masharti ni tata na yanaweza kuelezwa katika regex moja, Pattern inaweza kufanya kazi vizuri zaidi:

Pattern pattern = Pattern.compile("error|fail|fatal");
for (String log : logs) {
    if (pattern.matcher(log).find()) {
        // matched
    }
}

6-3. Ufanisi wa Kumbukumbu na Mambo ya Kutumia Tena

Uendeshaji ambao mara kwa mara hubadilisha maandishi—kama vile toLowerCase() au substring()—huweza kuzalisha majumbe mengi yasiyo ya lazima ya maandishi, ambayo huathiri matumizi ya kumbukumbu.
Hii ni muhimu hasa kwa programu zinazoendelea kwa muda mrefu au usindikaji upande wa seva.

Vidokezo muhimu:

  • Kuepuka kuunda nakala zisizo za lazima za maandishi.
  • Kwa seti kubwa za data, fikiria kutumia buffering au usindikaji wa vipande.
  • Kuhifadhi matokeo ya contains() yanayojirudia inaweza kuboresha utendaji katika baadhi ya hali.

7. Ulinganisho na Lugha Nyingine za Programu

Njia ya contains() ya Java inatoa ulinganisho rahisi, wa kuaminika wa sehemu ndogo ya maandishi, lakini lugha zingine zinatoa vipengele vinavyofanana na sifa zao.
Sehemu hii inalinganisha ukaguzi wa sehemu ndogo ya maandishi katika Python, JavaScript, na C# ili kuonyesha tofauti na usawa.

7-1. Python: Ulinganisho Rahisi wa Sehemu Ndogo kwa Opereta in

Katika Python, unaweza kuangalia ikiwa sehemu ndogo ipo kwa kutumia opereta in:

text = "Hello, Python!"
if "Python" in text:
    print("含まれています")

Sintaksia hii ni rahisi sana kusoma—karibu na lugha ya asili na inahitaji kujifunza kidogo tu.

Tofauti na Maelezo:

  • in ni opereta ya lugha, si njia.
  • Python pia inahesabu herufi kubwa/kubwa (case-sensitive) kwa kulinganisha maandishi.
  • None husababisha hitilafu; ukaguzi wa null unahitajika.

7-2. JavaScript: Ulinganisho wa Sehemu Ndogo kwa includes()

Katika JavaScript (ES6+), unaweza kutumia njia ya includes():

const text = "JavaScript is fun";
console.log(text.includes("fun")); // true

Njia hii inafanana sana na contains() ya Java na ni rahisi kuibadilisha kiakili.

Tofauti na Maelezo:

  • Kumpeleka undefined hakusababisha hitilafu; inarejelea tu false.
  • includes() pia inafanya kazi kwenye safu (arrays), ikiongeza matumizi yake.

7-3. C#: Contains() Inafanana na Java

C# pia ina njia ya Contains() yenye tabia inayofanana na Java:

string text = "Welcome to C#";
bool result = text.Contains("C#");

Tofauti na Maelezo:

  • Contains() ya C# inahesabu herufi kubwa/kubwa (case-sensitive) kwa chaguo-msingi, lakini unaweza kupuuza herufi kwa kutumia StringComparison.OrdinalIgnoreCase.
  • Kumpeleka null husababisha ArgumentNullException.

7-4. Jedwali la Ulinganisho Kati ya Lugha

LanguageExample SyntaxCase SensitivityNotes
Java"abc".contains("a")SensitiveThrows exception on null
Python"a" in "abc"SensitiveMost intuitive syntax
JavaScript"abc".includes("a")SensitiveAlso works for arrays
C#"abc".Contains("a")Sensitive (configurable)Comparison mode can be chosen

Muhtasari: Chagua Sintaksia Sahihi kwa Matumizi Yako

Ingawa ukaguzi wa sehemu ndogo ya maandishi ni hitaji la kawaida katika lugha zote, kila lugha ina njia au sintaksia yake.
contains() ya Java inatoa uthabiti na uwazi, na inafaa kwa mifumo ya biashara na programu zinazodumu.
Lugha kama Python na JavaScript hutoa sintaksia rahisi na fupi, ambayo inaweza kuwa bora kwa maandishi mepesi au uundaji wa haraka.

Kwa kuelewa dhana za pamoja na sifa maalum za kila lugha, utaweza kuandika msimbo salama zaidi na wenye ufanisi katika lugha mbalimbali.

8. Maswali Yanayoulizwa Mara kwa Mara (FAQ)

Hapo chini kuna maswali yanayoulizwa mara kwa mara kuhusu njia ya contains() ya Java—yakusaidia kuelewa mambo magumu na kuepuka vizingiti vya kawaida.

Q1. Je, contains() inahesabu herufi kubwa/kubwa (case-sensitive)?

Ndiyo, inahesabu herufi kubwa/kubwa.
Kwa mfano, "Java".contains("java") inarejelea false.

Suluhisho:

String input = "Welcome to Java";
boolean result = input.toLowerCase().contains("java");

Q2. Ninawezaje kuangalia ulinganisho wa sehemu ndogo kwa kutumia regular expressions?

contains() haiunga mkono usemi wa kawaida.
Tumia matches() au darasa la Pattern badala yake.

Mfano (kuangalia muundo wa nambari):

import java.util.regex.Pattern;
import java.util.regex.Matcher;

String text = "注文番号: A123456";
Pattern pattern = Pattern.compile("A\\d+");
Matcher matcher = pattern.matcher(text);

if (matcher.find()) {
    System.out.println("パターンに一致しました。");
}

Q3. Nini hutokea nikipiga contains() kwenye null?

Itasababisha NullPointerException.

String target = null;
System.out.println(target.contains("test")); // Error

Suluhisho:

if (target != null && target.contains("test")) {
    System.out.println("含まれています。");
}

Q4. Nini hutokea nikipita kamba tupu (“”) kwa contains()?

Daima inarudisha true.

String text = "Java";
System.out.println(text.contains("")); // true

Ingawa ni sehemu ya maelezo rasmi, tabia hii siyo ya manufaa sana na inaweza kusababisha hitilafu zisizotarajiwa ikiwa kamba tupu hazikusudiwa.

Q5. Je, contains() inaweza kutafuta maneno kadhaa kwa wakati mmoja?

Hapana. Kila mwito hukagua neno moja tu.

String text = "本日はシステムエラーが発生しました";
if (text.contains("エラー") || text.contains("障害") || text.contains("失敗")) {
    System.out.println("問題が検出されました。");
}

Njia ya dinamik:

List<String> keywords = Arrays.asList("エラー", "障害", "失敗");
boolean found = keywords.stream().anyMatch(text::contains);

Q6. Ni lini ninapaswa kutumia contains() dhidi ya indexOf()?

contains() inarudisha boolean, wakati indexOf() inarudisha fahirisi ya nambari.

  • Tumia contains() unapohitaji tu kujua kama kifungu kipo.
  • Tumia indexOf() unapohitaji pia nafasi.
    String text = "Error: Disk full";
    if (text.contains("Error")) {
        int pos = text.indexOf("Error");
        System.out.println("Position: " + pos);
    }
    

9. Hitimisho

Njia ya contains() ya Java ni chombo chenye nguvu na rahisi kwa kuamua kama kifungu maalum kiko ndani ya kamba.
Inatumika sana katika hali mbalimbali kama uthibitishaji wa ingizo la mtumiaji, uchambuzi wa logi, na uchujaji wa data.

Katika makala hii, tulijifunza:

  • Sintaksia ya msingi na thamani za kurudi
  • Uhusiano wa herufi kubwa na ndogo na jinsi ya kushughulikia
  • Kushughulikia nulls na kamba tupu
  • Tofauti na mbinu nyingine za kulinganisha kamba
  • Matumizi ya vitendo: uthibitishaji, utafutaji wa logi, usindikaji wa Stream
  • Mazingatio ya utendaji na mbinu za ubora
  • Ulinganisho na Python, JavaScript, na C#
  • Maswali yanayoulizwa mara kwa mara na vidokezo vya utatuzi

Ingawa contains() ni rahisi kuelewa na yenye matumizi mengi, matumizi yake yanapaswa kutathminiwa kwa umakini katika hali zinazojumuisha seti kubwa za data, mwito wa mara kwa mara, au vigezo vya utafutaji tata.
Kwa kuunganisha usanidi, usindikaji sambamba, regex, na mikakati ya kuhifadhi, unaweza kudumisha utendaji na usomaji.

Kwa kuwa contains() ni msingi wa kufanya kazi na kamba katika Java, tunatumaini makala hii itakusaidia kuitumia kwa usalama na ufanisi katika miradi yako ya maendeleo.