<AI>
setCellFactory の内部(updateItem メソッド内)で前後の値を比較するには、
古い値をフィールドに保持しておくか、直接 getItem() で取得して比較します。
1. updateItem の中で比較する
基本パターンsuper.updateItem(item, empty) を呼び出す前に getItem() で取得した値を「古い値」とし、新しく渡された item と比較します
java
setCellFactory(column -> new TableCell() {
    @Override
    protected void updateItem(String newItem, boolean empty) {
        // 現在の古い値を取得
        String oldItem = getItem();

        // 必須: スーパークラスのメソッドを呼び出す
        super.updateItem(newItem, empty);

        if (empty || newItem == null) {
            setText(null);
            setGraphic(null);
        } else {
            // new と old の値の比較
            if (newItem.equals(oldItem)) {
                // 値が変わっていない場合の処理
            } else {
                // 値が新しくなった(または変更された)場合の処理
                setText(newItem);
            }
        }
    }
});
2. セルのリサイクル(再利用)に注意
JavaFXのテーブルやリストのセルはスクロール時に再利用(リサイクル)されます。
このため、「表示されている行のデータ」が変更されたのか、「別の行へセルが使い回された」のかを判定するには、
getIndex() または行の参照データも一緒に比較する必要があります。
行のデータ自体(オブジェクト)を判定する場合は以下のようになります。

java
// セルリサイクル対応の比較例
if (newModel != null && oldModel != null && newModel.getId() == oldModel.getId()) {
    // データが同じ行のままで、値のみ変更された場合
} else {
    // 別の行にセルがリサイクルされた、または新規データ
}
3. より安全なプロパティ値の監視
プロパティの変更を検知する場合、itemProperty().addListener を活用するアプローチもあります