Aquí está la implementación de JBoss JSTL para la etiqueta EscapeXML
public class EscapeXML { private static final String[] ESCAPES; static { int size = '>' + 1; // '>' is the largest escaped value ESCAPES = new String[size]; ESCAPES['<'] = "<"; ESCAPES['>'] = ">"; ESCAPES['&'] = "&"; ESCAPES['\''] = "'"; ESCAPES['"'] = """; } //omitted } ¿Por qué ESCAPES es una matriz de 61 elementos? ¿Cuáles son las implicaciones de usar Map<Character,String> en su lugar?
Creo que la razón principal es el rendimiento. Cada consulta de mapa necesita obtener el código hash y luego calcular la posición de la matriz en el mapa, y la matriz se puede obtener directamente. La siguiente es una prueba simple, consultando 10,000 veces por separado, la matriz es aproximadamente 10 veces más rápida que el mapa.
array query result: cost time= 184041 map query result: cost time= 1677042 import org.junit.Before; import org.junit.Test; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * @author jahe * @date 2022/1/9 * @note */ public class ArrayMapTest { private char[] chars = {'<', '>', '&', '\'', '"'}; private char[] charsForQuery = new char[10000]; @Before public void init(){ Random random = new Random(5); random.nextInt(5); for (int i = 0; i < charsForQuery.length; i++) { charsForQuery[i] = chars[random.nextInt(5)]; } System.out.println(Arrays.toString(charsForQuery)); } @Test public void test() { int size = '>' + 1; String[] ESCAPES = new String[size]; ESCAPES['<'] = "<"; ESCAPES['>'] = ">"; ESCAPES['&'] = "&"; ESCAPES['\''] = "'"; ESCAPES['"'] = """; long start = System.nanoTime(); doTestForArray(ESCAPES); long end = System.nanoTime(); System.out.println("array query result: cost time= " + (end - start)); Map<Character, String> map = new HashMap<>(); map.put('<', "<"); map.put('>', ">"); map.put('&', "&"); map.put('\'', "'"); map.put('"', """); start = System.nanoTime(); doTestForMap(map); end = System.nanoTime(); System.out.println("map query result: cost time= " + (end - start)); } private void doTestForArray(String[] ESCAPES){ for (char c : charsForQuery) { String str = ESCAPES[c]; } } private void doTestForMap(Map<Character, String> map){ for (char c : charsForQuery) { String s = map.get(c); } } }