String 类的equal方法源代码

首先看一下equal的源代码如下,

public boolean equals(Object obj)
{
if(this == obj)
  return true; 
if(obj instanceof String)
{
String s = (String)obj; 
int i = value.length; 
if(i == s.value.length)
{
char ac[] = value;
char ac1[] = s.value;
for(int j = 0; i-- != 0; j++)
if(ac[j] != ac1[j])
return false;

return true;
}
}
return false;
}

从上面的代码可以看出如果是同一个对象进行比较的话,该方法就直接返回位true,若不是同一个对象进行比较就逐个比较字符是否相等。若是相同就返回true,否则返回false。


简单的演示代码如下所示,

@Test
public void testEqual(){
String sameObj1=new String("abc");
String sameObj2=sameObj1;
Assert.assertEquals(true, sameObj1.equals(sameObj2));

String simepleObj1="abc";
String simepleObj2="abc";
Assert.assertEquals(true, simepleObj1.equals(simepleObj2));

Assert.assertEquals(true, sameObj1.equals(simepleObj2));
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jlox是一个用Java编写的lox语言解释器,它包含了词法扫描和语法分析等功能。以下是Jlox的源代码和词法扫描器部分的示例代码: ### Lox.java ```java import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class Lox { static boolean hadError = false; public static void main(String[] args) throws IOException { if (args.length > 1) { System.out.println("Usage: jlox [script]"); System.exit(64); } else if (args.length == 1) { runFile(args[0]); } else { runPrompt(); } } private static void runFile(String path) throws IOException { byte[] bytes = Files.readAllBytes(Paths.get(path)); run(new String(bytes, Charset.defaultCharset())); if (hadError) System.exit(65); } private static void runPrompt() throws IOException { System.out.println("Welcome to the JLox REPL!"); for (;;) { System.out.print("> "); run(new java.util.Scanner(System.in).nextLine()); hadError = false; } } private static void run(String source) { Scanner scanner = new Scanner(source); List<Token> tokens = scanner.scanTokens(); // For now, just print the tokens. for (Token token : tokens) { System.out.println(token); } } static void error(int line, String message) { report(line, "", message); } private static void report(int line, String where, String message) { System.err.println( "[line " + line + "] Error" + where + ": " + message); hadError = true; } } ``` ### Scanner.java ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static TokenType.*; class Scanner { private final String source; private final List<Token> tokens = new ArrayList<>(); private int start = 0; private int current = 0; private int line = 1; private static final Map<String, TokenType> keywords; static { keywords = new HashMap<>(); keywords.put("and", AND); keywords.put("class", CLASS); keywords.put("else", ELSE); keywords.put("false", FALSE); keywords.put("for", FOR); keywords.put("fun", FUN); keywords.put("if", IF); keywords.put("nil", NIL); keywords.put("or", OR); keywords.put("print", PRINT); keywords.put("return", RETURN); keywords.put("super", SUPER); keywords.put("this", THIS); keywords.put("true", TRUE); keywords.put("var", VAR); keywords.put("while", WHILE); } Scanner(String source) { this.source = source; } List<Token> scanTokens() { while (!isAtEnd()) { // We are at the beginning of the next lexeme. start = current; scanToken(); } tokens.add(new Token(EOF, "", null, line)); return tokens; } private void scanToken() { char c = advance(); switch (c) { case '(': addToken(LEFT_PAREN); break; case ')': addToken(RIGHT_PAREN); break; case '{': addToken(LEFT_BRACE); break; case '}': addToken(RIGHT_BRACE); break; case ',': addToken(COMMA); break; case '.': addToken(DOT); break; case '-': addToken(MINUS); break; case '+': addToken(PLUS); break; case ';': addToken(SEMICOLON); break; case '*': addToken(STAR); break; case '!': addToken(match('=') ? BANG_EQUAL : BANG); break; case '=': addToken(match('=') ? EQUAL_EQUAL : EQUAL); break; case '<': addToken(match('=') ? LESS_EQUAL : LESS); break; case '>': addToken(match('=') ? GREATER_EQUAL : GREATER); break; case '/': if (match('/')) { // A comment goes until the end of the line. while (peek() != '\n' && !isAtEnd()) advance(); } else { addToken(SLASH); } break; case ' ': case '\r': case '\t': // Ignore whitespace. break; case '\n': line++; break; case '"': string(); break; default: if (isDigit(c)) { number(); } else if (isAlpha(c)) { identifier(); } else { Lox.error(line, "Unexpected character."); } break; } } private void identifier() { while (isAlphaNumeric(peek())) advance(); // See if the identifier is a reserved word. String text = source.substring(start, current); TokenType type = keywords.get(text); if (type == null) type = IDENTIFIER; addToken(type); } private void number() { while (isDigit(peek())) advance(); // Look for a fractional part. if (peek() == '.' && isDigit(peekNext())) { // Consume the "." advance(); while (isDigit(peek())) advance(); } addToken(NUMBER, Double.parseDouble(source.substring(start, current))); } private void string() { while (peek() != '"' && !isAtEnd()) { if (peek() == '\n') line++; advance(); } // Unterminated string. if (isAtEnd()) { Lox.error(line, "Unterminated string."); return; } // The closing ". advance(); // Trim the surrounding quotes. String value = source.substring(start + 1, current - 1); addToken(STRING, value); } private boolean match(char expected) { if (isAtEnd()) return false; if (source.charAt(current) != expected) return false; current++; return true; } private char peek() { if (isAtEnd()) return '\0'; return source.charAt(current); } private char peekNext() { if (current + 1 >= source.length()) return '\0'; return source.charAt(current + 1); } private boolean isAlpha(char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; } private boolean isAlphaNumeric(char c) { return isAlpha(c) || isDigit(c); } private boolean isDigit(char c) { return c >= '0' && c <= '9'; } private boolean isAtEnd() { return current >= source.length(); } private char advance() { current++; return source.charAt(current - 1); } private void addToken(TokenType type) { addToken(type, null); } private void addToken(TokenType type, Object literal) { String text = source.substring(start, current); tokens.add(new Token(type, text, literal, line)); } } ``` 这些代码只是Jlox解释器的一部分,但它们展示了如何实现词法扫描器和一些简单的语法分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值