2011-08-08 18 views
44

जावा प्रलेखन StringTokenizer के लिए बहिष्करण के बारे में कुछ भी नहीं बताता है, फिर भी मैं इस बारे में सुनता रहता हूं कि इसे बहुत पहले कैसे हटा दिया गया था। क्या इसे बहिष्कृत किया गया था क्योंकि इसमें बग/त्रुटियां थीं, या String.split() कुल मिलाकर उपयोग करने के लिए बेहतर है?स्ट्रिंगटोकनाइज़र का बहिष्कार क्यों किया जाता है?

मैं कुछ कोड StringTokenizer का उपयोग करता है और अगर मैं गंभीरता से यह पुनर्रचना String.split(), उपयोग करने के लिए के बारे में या फिर प्रतिवाद विशुद्ध रूप से सुविधा की बात है और मेरे कोड सुरक्षित है चिंतित होना चाहिए मैं सोच रहा हूँ।

+33

'StringTokenizer' एक विरासत वर्ग है (यानी एक बेहतर प्रतिस्थापन बाहर है वहां), लेकिन यह ** ** ** बहिष्कृत नहीं है। बहिष्करण केवल तब होता है जब कक्षा/विधि में कुछ गंभीर * दोष होते हैं। 'वेक्टर' के साथ एक समान स्थिति होती है: आप * लगभग हमेशा * इसे 'ऐरेलिस्ट' के साथ बदल सकते हैं, लेकिन यह "खराब" या "टूटा हुआ" नहीं है, इसलिए इसे बहिष्कृत नहीं किया गया है। –

+5

@ जोचिम अगर टिप्पणियां स्वीकार की जा सकती हैं तो मेरे पास – donnyton

+2

होगा स्ट्रिंगटोकनाइज़र की एक गंभीर आम-भावना समस्या है: यह लगातार डिलीमीटरों को एक डिलीमीटर के रूप में मानता है। यह एक आम या पारंपरिक भावना नहीं है। उदाहरण के लिए, सीएसवी 'ए, बी' में मतलब है कि दूसरे फ़ील्ड के साथ 3 फ़ील्ड खाली हैं। लेकिन स्ट्रिंगटोकेनाइज़र में यह डिफ़ॉल्ट रूप से इसे केवल 2 फ़ील्ड के रूप में देखता है, ',' को ',' के रूप में माना जाता है। यह पहले से ही कई प्रोग्रामर को भ्रमित करता है और उन्हें अनावश्यक डीबगिंग प्रयासों का प्रयोग करता है। *** बस इसका उपयोग न करें *** –

उत्तर

60

जावाडोक से StringTokenizer के लिए:

StringTokenizer एक विरासत वर्ग कि संगतता कारणों के लिए बनाए रखा है, हालांकि इसके उपयोग नए कोड में हतोत्साहित किया जाता है है। यह अनुशंसा की जाती है कि इस कार्यक्षमता की तलाश करने वाले किसी भी व्यक्ति को स्ट्रिंग या java.util.regex पैकेज की विभाजन विधि का उपयोग करें।

आप String.split() को देखो और StringTokenizer की तुलना करते हैं, तो प्रासंगिक अंतर यह है कि String.split(), एक रेगुलर एक्सप्रेशन का उपयोग करता है, जबकि StringTokenizer बस शब्दशः विभाजन वर्णों का उपयोग करता है। इसलिए यदि मैं एकल वर्णों की तुलना में अधिक जटिल तर्क के साथ एक स्ट्रिंग को टोकननाइज़ करना चाहता था (उदा। \r\n पर विभाजित), तो मैं StringTokenizer का उपयोग नहीं कर सकता लेकिन मैं String.split() का उपयोग कर सकता हूं।

76
  1. Java 8 String Tokenizer -
  2. Java 7 String Tokenizer पदावनत नहीं -
  3. Java 6 String Tokenizer पदावनत नहीं -
  4. Java 5 String Tokenizer पदावनत नहीं -

पदावनत नहीं यदि यह चिह्नित नहीं है के रूप में पदावनत, यह दूर नहीं जा रहा है

+8

+1। – Nishant

+7

"स्ट्रिंगटोकनाइज़र एक विरासत वर्ग है जो संगतता कारणों के लिए बनाए रखा गया है, हालांकि इसका उपयोग नए कोड में निराश है। यह अनुशंसा की जाती है कि इस कार्यक्षमता की तलाश करने वाले किसी भी व्यक्ति को स्ट्रिंग या java.util.regex पैकेज के विभाजन विधि का उपयोग करें।" – Miuler

+5

विरासत बहिष्कृत से अलग है। – StackOverflowed

-1

व्यक्तिगत रूप से मुझे लगता है कि स्ट्रिंगटोकनाइज़र को हटा दिया गया था क्योंकि यह कुछ आसान काम करने का एक जटिल तरीका था। स्ट्रिंगटोकनाइज़र नाम के रूप में केवल स्ट्रिंग्स पर लागू होता है, इसलिए इसे स्ट्रिंग में केवल एक विधि क्यों नहीं बनाया गया। आगे स्ट्रिंगटोकनाइज़र का समर्थन नहीं किया गया RegularExpression नियमित अभिव्यक्ति का समर्थन नहीं करता है जो 90 के उत्तरार्ध में और शुरुआती '00 के दशक में बेहद आम हो गया है, इसलिए यह व्यावहारिक रूप से बेकार है।

+12

इसे बहिष्कृत नहीं किया गया है। – Nishant

+1

आप सही हैं, ऐसा नहीं है, यह अभी अनुशंसा की जाती है कि आप इसका उपयोग न करें। अंतर यह है कि कोई ग्वारेट नहीं है कि कक्षाओं को वंचित कर दिया जाएगा भविष्य में रिलीज में प्रदान किया जाएगा। – Ali

+4

यह भी सही नहीं है। पिछली बाइनरी संगतता की पूर्ण गारंटी है। – EJP

0

मुझे ऐसा नहीं लगता कि इसका कारण String.split विधि है, क्योंकि विभाजन स्ट्रिंग को पार्स करने के लिए धीमा तरीका है - यह अंदर एक पैटर्न को संकलित करता है।

स्ट्रिंगटोकनाइज़र को java.util.Scanner जैसे अधिक कार्यात्मक वर्गों के साथ प्रतिस्थापित किया जा सकता है या आप regexp द्वारा समूह प्राप्त करने के लिए पैटर्न मैचर का उपयोग कर सकते हैं।

0
  1. StringTokenizer

  2. यह थोड़ा अलग समारोह और उत्पादन है पदावनत नहीं है ...

उदाहरण के लिए, यदि आप "aaa.aa.aa" है और यह भागों "aaa", "aa" और "a" में विभाजित करना चाहते हैं, तो आप सिर्फ लिख सकते हैं:

new StringTokenizer("aaa.aa.aa", ".") 

अगर तुम सिर्फ का उपयोग करें:

"aaa.aa.aa".split(".") 

यह खाली सरणी देता है, क्योंकि यह नियमित अभिव्यक्तियों से मेल खाता है जहां . एक विशाल चरित्र है। तो आप इसे से बचने के लिए है:

"aaa.aa.aa".split("\\.") 

तो मूल रूप से .. विभाजित regex का उपयोग करने के लिए सक्षम ... यह बहुत उपयोगी

लेकिन StringTokenizer टोकन द्वारा पाठ पार्स हो सकता है ... और टोकन भी हो सकता है विशेष वर्ण

2

StringTokenize के साथ कोई समस्या नहीं है ...

स्प्लिट regex, StringTokenizer, स्ट्रिंग या CharSequence उपयोग कर रहा है का उपयोग करने के

लेकिन

"a.b..".split("."){"a","b",""}

और की StringTokenizer वापस आ जाएगी "a.b .." ... केवल वापस आ जाएगी { "एक", "ख"}

और यह बहुत मुश्किल है !!! सावधान रहें!!! StringTokenizer को

बेहतर और सुरक्षित विकल्प हैं:

बहुत बेहतर StrongTokenizerorg.apache.common.lang3 में है ... यह बहुत अधिक लचीलापन या

है

com.google.common.base.Splitter

+0

बिल्कुल। और इस मुद्दे ने हमारे प्रोग्रामर को 'तितली प्रभाव' बग खोजने के लिए जबरदस्त प्रयास किए। क्यों जावा टीम शुरुआत में ऐसी भयानक चीजें का आविष्कार करती है? ... श्वास! –

11

StringTokenizer तथ्य में पदावनत नहीं है StringTokenizer 4 एक्स है String.split() से अधिक और प्रतिस्पर्धी प्रोग्रामिंग में इसका उपयोग कई डेवलपर्स द्वारा किया जाता है।

स्रोत: - Faster Input for Java

+0

क्या यह अभी भी वैध है? – RBz

+0

अन्य उत्तरों के अनुसार हाँ, यह सिर्फ इतना है कि विभाजन अधिक लचीला है क्योंकि आप regexes का उपयोग कर सकते हैं –

0

StringTokenizer एक विरासत वर्ग कि संगतता कारणों के लिए बनाए रखा है, हालांकि इसके उपयोग नए कोड में हतोत्साहित किया जाता है है। यह अनुशंसा की जाती है कि इस कार्यक्षमता की तलाश करने वाले किसी भी व्यक्ति को स्ट्रिंग या java.util.regex पैकेज की विभाजन विधि का उपयोग करें।

निम्न उदाहरण दिखाता है कि कैसे String.split() विधि अपनी बुनियादी टोकन में एक स्ट्रिंग को तोड़ने के लिए इस्तेमाल किया जा सकता:

String[] result = "this is a test".split("\\s");