1. జావాలోని వస్తువులను పోల్చడం
జావాలో, వస్తువులను రిఫరెన్స్ ద్వారా మరియు విలువ ద్వారా పోల్చవచ్చు.
సూచనలను పోల్చడం
రెండు వేరియబుల్స్ మెమరీలో ఒకే వస్తువును సూచిస్తే, ఈ వేరియబుల్స్లో నిల్వ చేయబడిన సూచనలు సమానంగా ఉంటాయి. మీరు ఈక్వాలిటీ ఆపరేటర్ ( ==
)ని ఉపయోగించి ఈ వేరియబుల్స్ని పోల్చినట్లయితే, మీరు నిజం అవుతారు మరియు ఆ ఫలితం అర్ధవంతంగా ఉంటుంది. ఇక్కడ ప్రతిదీ సులభం.
కోడ్ | కన్సోల్ అవుట్పుట్ |
---|---|
|
|
విలువతో పోల్చడం
కానీ రెండు వేరియబుల్స్ ఒకేలా ఉండే రెండు విభిన్న వస్తువులను సూచించే పరిస్థితులను మీరు తరచుగా ఎదుర్కోవచ్చు. ఉదాహరణకు, ఒకే వచనాన్ని కలిగి ఉన్న రెండు వేర్వేరు స్ట్రింగ్ల వస్తువులు.
విభిన్న వస్తువులు ఒకేలా ఉన్నాయో లేదో తెలుసుకోవడానికి, equals()
పద్ధతిని ఉపయోగించండి. ఉదాహరణకి:
కోడ్ | కన్సోల్ అవుట్పుట్ |
---|---|
|
|
పద్ధతి equals
తరగతికి పరిమితం కాదు String
. ప్రతి తరగతికి అది ఉంది.
మీరు స్వంతంగా వ్రాసే తరగతులు కూడా, మరియు ఎందుకు ఇక్కడ ఉన్నాయి.
2. Object
తరగతి
జావాలోని అన్ని తరగతులు Object
తరగతిని వారసత్వంగా పొందుతాయి. జావా సృష్టికర్తలు ఈ విధానంతో ముందుకు వచ్చారు.
మరియు ఒక తరగతి తరగతిని వారసత్వంగా పొందినట్లయితే Object
, అది తరగతి యొక్క అన్ని పద్ధతులను పొందుతుంది Object
. మరియు ఇది వారసత్వం యొక్క ప్రధాన పరిణామం.
మరో మాటలో చెప్పాలంటే, ప్రతి తరగతికి తరగతి పద్ధతులు ఉంటాయి Object
, వాటి కోడ్ వాటిని పేర్కొనకపోయినా.
ఈ వారసత్వ పద్ధతుల్లో వస్తువు పోలికకు సంబంధించిన పద్ధతులు ఉంటాయి. ఇవి equals()
మరియు hashCode()
పద్ధతులు.
కోడ్ | వాస్తవానికి, ఇక్కడ మేము కలిగి ఉన్నాము: |
---|---|
|
|
ఎగువ ఉదాహరణలో, మేము Person
పేరు మరియు వయస్సు పారామితులతో ఒక సాధారణ తరగతిని సృష్టించాము, కానీ ఒకే పద్ధతిని కాదు. కానీ అన్ని తరగతులు Object
తరగతిని వారసత్వంగా పొందినందున, Person
తరగతి స్వయంచాలకంగా రెండు పద్ధతులను కలిగి ఉంటుంది:
పద్ధతి | వివరణ |
---|---|
|
ప్రస్తుత వస్తువు మరియు పాస్ అయిన వస్తువును పోల్చి చూస్తుంది |
|
ప్రస్తుత వస్తువు యొక్క హ్యాష్కోడ్ను అందిస్తుంది |
ఇది ఖచ్చితంగా ప్రతి వస్తువు equals
పద్ధతిని కలిగి ఉంటుంది మరియు వివిధ రకాల వస్తువులను ఒకదానితో ఒకటి పోల్చవచ్చు. ఇటువంటి కోడ్ సంపూర్ణంగా కంపైల్ చేస్తుంది మరియు పని చేస్తుంది.
కోడ్ | కన్సోల్ అవుట్పుట్ |
---|---|
|
|
|
|
3. equals()
పద్ధతి
equals()
తరగతి నుండి వారసత్వంగా పొందిన పద్ధతి , Object
ప్రస్తుత వస్తువును పాస్ చేసిన వస్తువులతో పోల్చడానికి సరళమైన అల్గోరిథంను అమలు చేస్తుంది: ఇది కేవలం వస్తువులకు సూచనలను సరిపోల్చుతుంది.
Person
మీరు పద్ధతిని కాల్ చేయడానికి బదులుగా వేరియబుల్లను సరిపోల్చినట్లయితే మీరు అదే ఫలితాన్ని పొందుతారు equals()
. ఉదాహరణ:
కోడ్ | కన్సోల్ అవుట్పుట్ |
---|---|
|
|
పద్ధతిని equals
పిలిచినప్పుడు a
, ఇది వేరియబుల్లో నిల్వ చేయబడిన సూచనను వేరియబుల్లో a
నిల్వ చేసిన సూచనతో సరిపోల్చుతుంది b
.
అయితే, పోలిక తరగతికి భిన్నంగా పనిచేస్తుంది String
. ఎందుకు?
ఎందుకంటే తరగతిని సృష్టించిన వ్యక్తులు పద్ధతి String
యొక్క వారి స్వంత అమలును వ్రాసారు equals()
.
equals()
పద్ధతి యొక్క అమలు
ఇప్పుడు తరగతిలో సమానమైన పద్ధతి యొక్క మన స్వంత అమలును వ్రాస్దాం Person
. మేము 4 ప్రధాన కేసులను పరిశీలిస్తాము.
equals
, ఇది ఎల్లప్పుడూ ఒక Object
వస్తువును వాదనగా తీసుకుంటుంది
దృశ్యం 1 : పద్ధతిని పిలిచే అదే వస్తువు equals
పద్ధతికి కూడా పంపబడుతుంది equals
. ప్రస్తుత వస్తువు మరియు ఆమోదించబడిన వస్తువు యొక్క సూచనలు సమానంగా ఉంటే, పద్ధతి తప్పనిసరిగా తిరిగి ఇవ్వాలి true
. ఒక వస్తువు తనతో సమానం.
కోడ్లో ఇది ఇలా కనిపిస్తుంది:
కోడ్ | వివరణ |
---|---|
|
సూచనలను సరిపోల్చండి |
దృశ్యం 2 : null
పద్ధతికి పంపబడింది equals
— మనం పోల్చడానికి ఏమీ లేదు. పద్ధతి అని పిలువబడే వస్తువు ఖచ్చితంగా శూన్యం కాదు, కాబట్టి మనం ఈ సందర్భంలో equals
తిరిగి రావాలి .false
కోడ్లో ఇది ఇలా కనిపిస్తుంది:
కోడ్ | వివరణ |
---|---|
|
సూచనలను సరిపోల్చండి ఆమోదించబడిన వస్తువు null ? |
దృష్టాంతం 3 : ఒక వస్తువు కాని ఒక వస్తువుకు సంబంధించిన సూచన Person
పద్ధతికి పంపబడుతుంది equals
. Person
వస్తువు కాని వస్తువుతో సమానమా Person
? Person
తరగతి డెవలపర్కి అతను లేదా ఆమె ఎలా కావాలో నిర్ణయించుకోవాల్సిన ప్రశ్న .
కానీ సాధారణంగా వస్తువులు సమానంగా పరిగణించబడాలంటే ఒకే తరగతికి చెందినవిగా ఉండాలి. అందువల్ల, తరగతిలోని వస్తువు కాకుండా ఏదైనా Person
మా సమాన పద్ధతికి పాస్ అయినట్లయితే, మేము ఎల్లప్పుడూ తిరిగి వస్తాము false
. మీరు వస్తువు యొక్క రకాన్ని ఎలా తనిఖీ చేయవచ్చు? అది నిజం — instanceof
ఆపరేటర్ని ఉపయోగించడం ద్వారా.
మా కొత్త కోడ్ ఎలా ఉంటుందో ఇక్కడ ఉంది:
కోడ్ | వివరణ |
---|---|
|
సూచనలను సరిపోల్చండి ఆమోదించబడిన వస్తువు null ? పాస్ అయిన వస్తువు కాకపోతే a Person |
Person
4. రెండు వస్తువులను పోల్చడం
మనం దేనితో ముగించాము? మేము పద్ధతి ముగింపుకు చేరుకున్నట్లయితే, మనకు Person
లేని వస్తువు సూచన ఉంది null
. కాబట్టి మేము దానిని a గా మారుస్తాము Person
మరియు రెండు వస్తువుల సంబంధిత అంతర్గత డేటాను సరిపోల్చండి. మరియు అది మా నాల్గవ దృశ్యం .
కోడ్ | వివరణ |
---|---|
|
సూచనలను సరిపోల్చండి ఆమోదించబడిన వస్తువు null ? పాస్ చేసిన వస్తువు టైప్కాస్టింగ్ కాకపోతే Person |
మరియు మీరు రెండు వస్తువులను ఎలా పోల్చాలి Person
? వారు ఒకే పేరు ( name
) మరియు వయస్సు ( age
) కలిగి ఉంటే వారు సమానంగా ఉంటారు. చివరి కోడ్ ఇలా కనిపిస్తుంది:
కోడ్ | వివరణ |
---|---|
|
సూచనలను సరిపోల్చండి ఆమోదించబడిన వస్తువు null ? పాస్ చేసిన వస్తువు టైప్కాస్టింగ్ కాకపోతే Person |
అయితే అంతే కాదు.
మొదట, పేరు ఫీల్డ్ a String
, కాబట్టి మీరు పద్ధతిని కాల్ చేయడం ద్వారా పేరు ఫీల్డ్ను సరిపోల్చాలి equals
.
this.name.equals(person.name)
రెండవది, name
ఫీల్డ్ కావచ్చు null
: ఆ సందర్భంలో, మీరు equals
దానిపై కాల్ చేయలేరు. దీని కోసం మీకు అదనపు చెక్ అవసరం null
:
this.name != null && this.name.equals(person.name)
null
రెండు వస్తువులలో పేరు ఫీల్డ్ ఉంటే Person
, పేర్లు ఇప్పటికీ సమానంగా ఉంటాయి.
నాల్గవ దృశ్యం కోసం కోడ్ ఇలా ఉండవచ్చు:
|
వయస్సులు సమానంగా లేకుంటే, వెంటనే సమానం అయితే return false , పద్ధతిని ఉపయోగించి పోల్చడంలో అర్థం లేదు . ఇక్కడ రెండవ ఫీల్డ్ సమానంగా ఉంటుంది , లేదా అది కాదు. పద్ధతిని ఉపయోగించి రెండు పేరు ఫీల్డ్లను సరిపోల్చండి . this.name null equals name null equals |
5. hashCode()
పద్ధతి
రెండు వస్తువుల యొక్క అన్ని ఫీల్డ్ల యొక్క వివరణాత్మక పోలికను నిర్వహించడానికి ఉద్దేశించిన పద్ధతితో పాటు equals
, ఖచ్చితమైన కానీ చాలా శీఘ్ర పోలిక కోసం ఉపయోగించగల మరొక పద్ధతి ఉంది: hashCode()
.
మీరు వేలకొద్దీ పదాల జాబితాను అక్షర క్రమంలో క్రమబద్ధీకరిస్తున్నారని ఊహించుకోండి మరియు మీరు పదాల జతలను పదేపదే సరిపోల్చాలి. మరియు పదాలు చాలా పొడవుగా ఉంటాయి, ఇందులో చాలా అక్షరాలు ఉంటాయి. సాధారణంగా చెప్పాలంటే, అటువంటి పోలిక చాలా కాలం పడుతుంది.
కానీ అది వేగవంతం చేయవచ్చు. మనకు వేర్వేరు అక్షరాలతో ప్రారంభమయ్యే పదాలు ఉన్నాయని అనుకుందాం - అవి భిన్నంగా ఉన్నాయని వెంటనే స్పష్టమవుతుంది. కానీ అవి ఒకే అక్షరాలతో ప్రారంభమైతే, ఫలితం ఎలా ఉంటుందో మనం ఇంకా చెప్పలేము: పదాలు సమానంగా లేదా భిన్నంగా ఉండవచ్చు.
పద్ధతి hashCode()
ఇదే సూత్రాన్ని ఉపయోగించి పనిచేస్తుంది. మీరు దానిని ఒక వస్తువుపై కాల్ చేస్తే, అది కొంత సంఖ్యను అందిస్తుంది - పదంలోని మొదటి అక్షరానికి సారూప్యంగా ఉంటుంది. ఈ సంఖ్య క్రింది లక్షణాలను కలిగి ఉంది:
- ఒకేలాంటి వస్తువులు ఎల్లప్పుడూ ఒకే హ్యాష్కోడ్ని కలిగి ఉంటాయి
- వేర్వేరు వస్తువులు ఒకే హ్యాష్కోడ్ను కలిగి ఉండవచ్చు లేదా వాటి హ్యాష్కోడ్లు భిన్నంగా ఉండవచ్చు
- వస్తువులు వేర్వేరు హ్యాష్కోడ్లను కలిగి ఉంటే, ఆ వస్తువులు ఖచ్చితంగా భిన్నంగా ఉంటాయి
దీన్ని మరింత స్పష్టంగా చేయడానికి, పదాల పరంగా ఈ లక్షణాలను రీఫ్రేమ్ చేద్దాం:
- ఒకే విధమైన పదాలు ఎల్లప్పుడూ ఒకే మొదటి అక్షరాలను కలిగి ఉంటాయి.
- వేర్వేరు పదాలు ఒకే మొదటి అక్షరాలను కలిగి ఉండవచ్చు లేదా వాటి మొదటి అక్షరాలు భిన్నంగా ఉండవచ్చు
- పదాలు వేర్వేరు మొదటి అక్షరాలను కలిగి ఉంటే, పదాలు ఖచ్చితంగా భిన్నంగా ఉంటాయి
వస్తువుల పోలికను వేగవంతం చేయడానికి చివరి ఆస్తి ఉపయోగించబడుతుంది:
మొదట, రెండు వస్తువుల హ్యాష్కోడ్లు లెక్కించబడతాయి. ఈ హ్యాష్కోడ్లు భిన్నంగా ఉంటే, వస్తువులు ఖచ్చితంగా భిన్నంగా ఉంటాయి మరియు వాటిని మరింత పోల్చాల్సిన అవసరం లేదు.
హ్యాష్కోడ్లు ఒకేలా ఉంటే, మనం ఇప్పటికీ ఈక్వల్స్ పద్ధతిని ఉపయోగించి వస్తువులను పోల్చాలి.
6. కోడ్లో ఒప్పందాలు
పైన వివరించిన ప్రవర్తన తప్పనిసరిగా జావాలోని అన్ని తరగతులచే అమలు చేయబడాలి. సంకలనం సమయంలో, వస్తువులు సరిగ్గా సరిపోలుతున్నాయో లేదో తనిఖీ చేయడానికి మార్గం లేదు.
జావా ప్రోగ్రామర్లు సార్వత్రిక ఒప్పందాన్ని కలిగి ఉంటారు, వారు ఈక్విల్స్() పద్ధతి యొక్క వారి స్వంత అమలును వ్రాసి, తద్వారా ప్రామాణిక అమలును (తరగతిలో) భర్తీ చేస్తే , వారు పైన పేర్కొన్న నియమాలు ఉండే విధంగా పద్ధతి Object
యొక్క వారి స్వంత అమలును కూడా వ్రాయాలి. hashCode()
సంతృప్తి చెందారు.
ఈ ఏర్పాటును ఒప్పందం అంటారు .
మీరు మీ తరగతిలో పద్ధతిని మాత్రమే అమలు చేస్తే equals()
లేదా hashCode()
మీరు మాత్రమే ఒప్పందాన్ని ఉల్లంఘిస్తారు (మీరు ఒప్పందాన్ని ఉల్లంఘించారు). ఇది చేయవద్దు.
ఇతర ప్రోగ్రామర్లు మీ కోడ్ని ఉపయోగిస్తుంటే, అది సరిగ్గా పని చేయకపోవచ్చు. అంతేకాదు, మీరు పైన పేర్కొన్న ఒప్పందాలకు కట్టుబడి ఉండే కోడ్ని ఉపయోగిస్తారు.
మూలకం కోసం శోధిస్తున్నప్పుడు, అన్ని జావా సేకరణలు మొదట ఆబ్జెక్ట్ల హ్యాష్కోడ్లను సరిపోల్చుతాయి మరియు ఆ తర్వాత మాత్రమే పద్ధతిని ఉపయోగించి పోలికను నిర్వహిస్తాయి equals
.
అంటే మీరు మీ స్వంత తరగతికి ఒక equals
పద్ధతిని ఇచ్చినప్పటికీ, మీరు మీ స్వంత పద్ధతిని వ్రాయకపోయినా hashCode()
లేదా మీరు దానిని తప్పుగా అమలు చేసినా, మీ వస్తువులతో సేకరణలు సరిగ్గా పని చేయకపోవచ్చు.
ఉదాహరణకు, మీరు జాబితాకు ఒక వస్తువును జోడించి, ఆపై contains()
పద్ధతిని ఉపయోగించి దాని కోసం శోధించవచ్చు, కానీ సేకరణ మీ వస్తువును కనుగొనలేకపోవచ్చు.
GO TO FULL VERSION