【项目实战典型案例】09.数据类型不一致导致equals判断为false

文章讨论了Java中equals()方法的作用,特别是在数据类型不一致时如何影响对象的比较。它解释了Object类中的默认equals实现和String类对其的重写,强调了equals方法在比较内容而非引用的重要性。通过示例代码展示了当尝试用Long和String比较时,由于数据类型不同,equals返回false,导致可能的数据混乱问题。文章提醒开发者应根据业务需求考虑是否重写equals方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景介绍

在判断课程id和班级id的时候,如果类型一致就会更新课程信息,如果类型不一致就会插入一条新的数据。其实两个变量的值是一致的,只不过数据类型不一致,从而导致了,在判断的时候结果为false,就会往库中插入一条相同课程班级的数据。结果数据发生了混乱的情况。
在这里插入图片描述

二、概念说明

1、数据类型

数据类型是编程语言中用于定义变量、常量和函数返回值的属性。它指定了数据的种类、范围和操作。不同的数据类型具有不同的内存占用和操作规则,用于存储和处理不同类型的数据

2、数据类型分类

  • 整数类型(Integer):用于表示整数值,如整数型(int)、长整型(long)、短整型(short)和字节型(byte)等。 例如:int age = 25;
  • 浮点数类型(Floating-point):用于表示带有小数部分的数值,如单精度浮点型(float)和双精度浮点型(double)。 例如:double pi = 3.14159;
  • 字符类型(Character):用于表示单个字符,如字符型(char)。 例如:char grade = ‘A’;
  • 字符串类型(String):用于表示一串字符,如字符串型(String)。 例如:String name = “John”;
  • 布尔类型(Boolean):用于表示真或假的值,如布尔型(boolean)。 例如:boolean isTrue = true;
  • 数组类型(Array):用于存储多个相同类型的元素的集合。 例如:int[] numbers = {1, 2, 3, 4, 5};
  • 自定义类型(Custom):根据需要自定义的数据类型,如类和结构体等。

数据类型的选择取决于所要处理的数据的性质和需求。正确选择和使用数据类型可以提高程序的效率和可靠性,并确保数据的正确性和一致性。

三、分析equals()方法

Object类中的equals()方法用于检测一个对象是否等于另外一个对象

1、equals()语法

public boolean equals(Object obj) {
        return (this == obj);
    }

在Object类中,equals方法判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,则返回true,否则返回false。

2、equals()重写规则

  1. 自反性:对于任何非空引用x,x.equals(x)应该返回true
  2. 对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true
  3. 传递性:对于任何引用 x、y 和 z ,如果 x.equals(y) 返回 true,y.equals(z)返回true, x.equals(z) 也应该返回 true。
  4. 一致性:对于任何引用 x、y 和 z ,如果 x.equals(y) 返回 true,y.equals(z)返回true, x.equals(z) 也应该返回 true。
  5. 非空性:对于任意非空引用x,x.equals(null)应该返回false。

3、String类对equals重写

Java instanceof用法详解

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

四、验证equals()方法过程

package com.wangsiqi.equals;

/**
 * @BelongsProject: 反射的使用
 * @BelongsPackage: com.wangsiqi.equals
 * @Author: wangsiqi
 * @Description: 数据类型不一致导致equals判断为false
 * @CreateTime: 2023-03-16 14:21
 * @Version: 1.0
 */

public class DataType {
    public static void main(String[] args) {
        Long one = 123L;
        String two = "123";
        String three = "123";
        System.out.println("类型不一致" + one.equals(two));
        System.out.println("类型一致" + two.equals(three));
    }
}

从执行结果来看,类型不一致会导致调用equals方法为false
在这里插入图片描述

五、总结

  1. equals方法不能作用于基本数据类型的变量
  2. 如果没有对Object中equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址,反之则比较的是内容
  3. equals方法如果没有进行重写操作的话去比较两个对象的地址
  4. 如果对equals方法进行重写,按照重写的逻辑进行。比如判断值或者即判断值又判断地址。
  5. 对象的数据类型必须相同:如果要比较的两个对象的数据类型不同,那么它们一定不相等,equals方法会直接返回false。
  6. 对象的数据类型必须相同:如果要比较的两个对象的数据类型不同,那么它们一定不相等,equals方法会直接返回false。

六、升华

我们平时在调用String、Integer等包装类型时的equals方法时是比较的内容是否一致而不是地址一是否致,如果是地址一致,那所有的String类型比较都是相等的,所以包装类类型都重写了equals方法。我们可以根据业务场景的不同来选择是否重写equals方法。

### 使用 PyTorch 进行深度学习的企业级项目实战案例 #### 1. 图像分类器构建 图像分类是计算机视觉中的基础任务之一。通过使用卷积神经网络 (CNN),可以有效地识别和分类不同类型的图片。在企业环境中,这可用于产品自动分类、质量控制等领域。 ```python import torch from torchvision import datasets, transforms, models transform = transforms.Compose([transforms.Resize(255), transforms.CenterCrop(224), transforms.ToTensor()]) dataset = datasets.ImageFolder('path_to_images', transform=transform) dataloader = torch.utils.data.DataLoader(dataset, batch_size=64, shuffle=True) model = models.resnet50(pretrained=True) for param in model.parameters(): param.requires_grad = False classifier = nn.Sequential(OrderedDict([ ('fc1', nn.Linear(2048, 512)), ('relu', nn.ReLU()), ('dropout', nn.Dropout(p=0.2)), ('output', nn.Linear(512, num_classes))])) model.fc = classifier criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.fc.parameters(), lr=0.003) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device); epochs = 5 steps = 0 running_loss = 0 print_every = 5 for epoch in range(epochs): for inputs, labels in dataloader: steps += 1 inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() logps = model.forward(inputs) loss = criterion(logps, labels) loss.backward() optimizer.step() running_loss += loss.item() if steps % print_every == 0: test_loss = 0 accuracy = 0 with torch.no_grad(): model.eval() for inputs, labels in validloader: inputs, labels = inputs.to(device), labels.to(device) logps = model.forward(inputs) batch_loss = criterion(logps, labels) test_loss += batch_loss.item() ps = torch.exp(logps) top_p, top_class = ps.topk(1, dim=1) equals = top_class == labels.view(*top_class.shape) accuracy += torch.mean(equals.type(torch.FloatTensor)).item() train_losses.append(running_loss/print_every) validation_losses.append(test_loss/len(validloader)) accuracies.append(accuracy/len(validloader)) print(f"Epoch {epoch+1}/{epochs}.. " f"Train loss: {running_loss/print_every:.3f}.. " f"Validation loss: {test_loss/len(validloader):.3f}.. " f"Accuracy: {(accuracy/len(validloader))*100}%") running_loss = 0 model.train() ``` 这段代码展示了如何利用预训练模型 ResNet50 来创建一个简单的图像分类器,并对其进行微调以适应特定的数据集[^1]。 #### 2. 自然语言处理应用——情感分析 自然语言处理(NLP) 是另一个广泛应用领域,在客户服务支持系统中尤为突出。下面是一个基于 LSTM 的文本情绪检测例子: ```python class SentimentRNN(nn.Module): def __init__(self, vocab_size, output_size, embedding_dim, hidden_dim, n_layers, drop_prob=0.5): super(SentimentRNN, self).__init__() self.output_size = output_size self.n_layers = n_layers self.hidden_dim = hidden_dim self.embedding = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM(embedding_dim, hidden_dim, n_layers, dropout=drop_prob, batch_first=True) self.dropout = nn.Dropout(drop_prob) self.fc = nn.Linear(hidden_dim, output_size) self.sigmoid = nn.Sigmoid() def forward(self, x, hidden): batch_size = x.size(0) embeds = self.embedding(x.long()) lstm_out, hidden = self.lstm(embeds, hidden) lstm_out = lstm_out.contiguous().view(-1, self.hidden_dim) out = self.dropout(lstm_out) out = self.fc(out) sig_out = self.sigmoid(out) sig_out = sig_out.view(batch_size, -1) sig_out = sig_out[:, -1] return sig_out, hidden def init_hidden(self, batch_size): weight = next(self.parameters()).data hidden = (weight.new(self.n_layers, batch_size, self.hidden_dim).zero_(), weight.new(self.n_layers, batch_size, self.hidden_dim).zero_()) return hidden ``` 此部分实现了循环神经网络(RNN)结构来预测电影评论的情感倾向(正面或负面),这对于监控在线平台上的公众舆论非常有用[^2]。 #### 3. 时间序列预测—股票价格走势建模 对于金融行业来说,时间序列分析至关重要。这里介绍了一个采用 GRU 单元的时间序列回归问题解决方案,用于估计未来几天内的股价变动趋势。 ```python def create_sequences(data, seq_length): xs = [] ys = [] for i in range(len(data)-seq_length-1): x = data[i:(i+seq_length)] y = data[i+seq_length] xs.append(x) ys.append(y) return np.array(xs), np.array(ys) train_x, train_y = create_sequences(train_data.values.reshape(-1,1), SEQ_LENGTH) valid_x, valid_y = create_sequences(val_data.values.reshape(-1,1), SEQ_LENGTH) gru_model = Sequential() gru_model.add(GRU(units=50, return_sequences=True, input_shape=(SEQ_LENGTH, 1))) gru_model.add(Dropout(0.2)) gru_model.add(GRU(units=50)) gru_model.add(Dropout(0.2)) gru_model.add(Dense(units=1)) gru_model.compile(optimizer='adam', loss='mean_squared_error') history = gru_model.fit(train_x, train_y, epochs=EPOCHS, batch_size=BATCH_SIZE, verbose=1, validation_split=0.1) ``` 上述片段说明了怎样运用门控循环单元(Gated Recurrent Unit,GRU)来进行短期股市行情预报,有助于投资者做出更明智的投资决策[^3].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃芋圆的兔子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值