Mega Code Archive

 
Categories / Java / Data Type
 

Converts a String to a boolean (optimised for performance)

/*  * Licensed to the Apache Software Foundation (ASF) under one or more  * contributor license agreements.  See the NOTICE file distributed with  * this work for additional information regarding copyright ownership.  * The ASF licenses this file to You under the Apache License, Version 2.0  * (the "License"); you may not use this file except in compliance with  * the License.  You may obtain a copy of the License at  *   *      http://www.apache.org/licenses/LICENSE-2.0  *   * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ /**  * <p>Operations on boolean primitives and Boolean objects.</p>  *  * <p>This class tries to handle <code>null</code> input gracefully.  * An exception will not be thrown for a <code>null</code> input.  * Each method documents its behaviour in more detail.</p>  *   * @author Stephen Colebourne  * @author Matthew Hawthorne  * @author Gary Gregory  * @since 2.0  * @version $Id: BooleanUtils.java 589050 2007-10-27 05:07:45Z bayard $  */ public class Main {   /**    * <p>Converts a String to a boolean (optimised for performance).</p>    *     * <p><code>'true'</code>, <code>'on'</code> or <code>'yes'</code>    * (case insensitive) will return <code>true</code>. Otherwise,    * <code>false</code> is returned.</p>    *     * <p>This method performs 4 times faster (JDK1.4) than    * <code>Boolean.valueOf(String)</code>. However, this method accepts    * 'on' and 'yes' as true values.    *    * <pre>    *   BooleanUtils.toBoolean(null)    = false    *   BooleanUtils.toBoolean("true")  = true    *   BooleanUtils.toBoolean("TRUE")  = true    *   BooleanUtils.toBoolean("tRUe")  = true    *   BooleanUtils.toBoolean("on")    = true    *   BooleanUtils.toBoolean("yes")   = true    *   BooleanUtils.toBoolean("false") = false    *   BooleanUtils.toBoolean("x gti") = false    * </pre>    *    * @param str  the String to check    * @return the boolean value of the string, <code>false</code> if no match    */   public static boolean toBoolean(String str) {       // Previously used equalsIgnoreCase, which was fast for interned 'true'.       // Non interned 'true' matched 15 times slower.       //        // Optimisation provides same performance as before for interned 'true'.       // Similar performance for null, 'false', and other strings not length 2/3/4.       // 'true'/'TRUE' match 4 times slower, 'tRUE'/'True' 7 times slower.       if (str == "true") {           return true;       }       if (str == null) {           return false;       }       switch (str.length()) {           case 2: {               char ch0 = str.charAt(0);               char ch1 = str.charAt(1);               return                    (ch0 == 'o' || ch0 == 'O') &&                   (ch1 == 'n' || ch1 == 'N');           }           case 3: {               char ch = str.charAt(0);               if (ch == 'y') {                   return                        (str.charAt(1) == 'e' || str.charAt(1) == 'E') &&                       (str.charAt(2) == 's' || str.charAt(2) == 'S');               }               if (ch == 'Y') {                   return                        (str.charAt(1) == 'E' || str.charAt(1) == 'e') &&                       (str.charAt(2) == 'S' || str.charAt(2) == 's');               }               return false;           }           case 4: {               char ch = str.charAt(0);               if (ch == 't') {                   return                        (str.charAt(1) == 'r' || str.charAt(1) == 'R') &&                       (str.charAt(2) == 'u' || str.charAt(2) == 'U') &&                       (str.charAt(3) == 'e' || str.charAt(3) == 'E');               }               if (ch == 'T') {                   return                        (str.charAt(1) == 'R' || str.charAt(1) == 'r') &&                       (str.charAt(2) == 'U' || str.charAt(2) == 'u') &&                       (str.charAt(3) == 'E' || str.charAt(3) == 'e');               }           }       }       return false;   } }