public class Employee {
private int empId;
private String empName;
public Employee(int empId, String empName) {
super();
this.empId = empId;
this.empName = empName;
}
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
@Override
public String toString() {
return "Employee [empId=" + empId + ", empName=" + empName + "]";
}
@Override
public int hashCode() {
return empId + empName.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(this instanceof Employee)) {
return false;
}
Employee emp = (Employee) obj;
return this.getEmpId() == emp.getEmpId() && this.getEmpName().equals(emp.getEmpName());
}
}
Класс теста
public class Test {
public static void main(String[] args) {
Employee emp1 = new Employee(101,"Manash");
Employee emp2 = new Employee(101,"Manash");
Employee emp3 = new Employee(103,"Ranjan");
System.out.println(emp1.hashCode());
System.out.println(emp2.hashCode());
System.out.println(emp1.equals(emp2));
System.out.println(emp1.equals(emp3));
}
}
В объекте Class equals (Object obj) используется для сравнения сравнения адресов, поэтому, когда в классе Test, если вы сравниваете два объекта, тогда equals метод дает false, но когда мы переопределяем hashcode (), он может сравнивать контент и давать правильный результат.
Использование функции String
match()
не возвратит захваченные группы, если установлен глобальный модификатор, как вы выяснили.
В этом случае вы хотели бы использовать RegExp
и вызвать функцию exec()
. String
's match()
почти идентичен функции RegExp
exec()
... кроме случаев, подобных этим. Если глобальный модификатор установлен, нормальная функция match()
не вернет захваченные группы, тогда как функция RegExp
exec()
будет. (Замечание здесь , среди других мест.)
Еще один улов, который следует помнить, заключается в том, что exec()
не возвращает совпадений в одном большом массиве - он продолжает возвращать совпадения до тех пор, пока он не будет запущен , и в этом случае он возвращает null
.
Итак, например, вы можете сделать что-то вроде этого:
var pattern = /t(e)(s)t/g; // Alternatively, "new RegExp('t(e)(s)t', 'g');"
var match;
while (match = pattern.exec(text)) {
// Do something with the match (["test", "e", "s"]) here...
}
Еще одно замечание: RegExp.prototype.exec()
и RegExp.prototype.test()
выполнить регулярное выражение в предоставленной строке и вернуть первый результат. Каждый последовательный вызов будет проходить через обновление набора результатов RegExp.prototype.lastIndex
на основе текущей позиции в строке.
Вот пример: // помните, что в примере и шаблоне есть 4 совпадения. lastIndex начинается с 0
pattern.test(text); // pattern.lastIndex = 4
pattern.test(text); // pattern.lastIndex = 9
pattern.exec(text); // pattern.lastIndex = 14
pattern.exec(text); // pattern.lastIndex = 19
// if we were to call pattern.exec(text) again it would return null and reset the pattern.lastIndex to 0
while (var match = pattern.exec(text)) {
// never gets run because we already traversed the string
console.log(match);
}
pattern.test(text); // pattern.lastIndex = 4
pattern.test(text); // pattern.lastIndex = 9
// however we can reset the lastIndex and it will give us the ability to traverse the string from the start again or any specific position in the string
pattern.lastIndex = 0;
while (var match = pattern.exec(text)) {
// outputs all matches
console.log(match);
}
Вы можете найти информацию о том, как использовать RegExp
объекты на MDN (в частности, здесь представлена документация для exec()
функция [/ д2]).