Какова стоимость производительности присвоения единственного строкового использования значения +

После того, как пользователь выберет radio button, на radio button слушателе вы можете проверить, сколько radio buttons проверено, в зависимости от счетчика переключателей, который вы сможете выполнить (счетчик переключателей) * 1.50 = Итого Сумма.

Этапы.

  1. Фактически все radio buttons не проверены.
  2. Как только пользователь выбирает переключатель, проверьте состояние всех radio buttons проверенных / незафиксированных.
  3. Как только вы подсчитаете количество радио-кнопок, умножьте их на 1,5.

Псудо-код:

OnRadioSelectListner() {
  checkedCount = getCheckedRadioButtonCount()  //Gets the count of all checked radio butttons
  totalPrice = checkCount * 1.5;
}

getCheckedRadioButtonCount() {
  radioCheckedCount = 0;

  if(radio1.isChecked()) then radioCheckedCount++;
  if(radio2.isChecked()) then radioCheckedCount++;
  if(radio3.isChecked()) then radioCheckedCount++;
  .....
  .....

  return radioCheckedCount;
}

Я использую флажок для вашего случая. Логика остается прежней

Item.java

public class Item {
    String title;
    Double price;
    boolean checked;

    Item(String title, Double price) {
        this.title = title;
        this.price = price;
    }

    @Override
    public String toString() {
        return title + " - " + price;

    }
}

Program.java

import javax.swing.*;

public class Program {

    public static void main(String[] args) {
        ScreenOne screenOne = new ScreenOne();
        screenOne.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

ScreenOne.java

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

class ScreenOne extends JFrame {

    private Item items[] = {
            new Item("item1", 1.5),
            new Item("item2", 1.5),
            new Item("item3", 1.5),
    };

    private JPanel jPanel = new JPanel(new GridLayout(0, 1, 4, 4));

    private JLabel totalLabel;

    private JCheckBox[] boxes;

    ScreenOne() {
        initComponents();
    }

    private void initComponents() {
        jPanel.setBorder(new EmptyBorder(100, 100, 100, 100));
        setContentPane(jPanel);
        boxes = new JCheckBox[items.length];

        for (int i = 0; i < items.length; i++) {
            createCheckBox(i);
        }

        totalLabel = new JLabel("Total will appear here");
        totalLabel.setBorder(new EmptyBorder(10, 10, 10, 10));

        jPanel.add(totalLabel);

        setTitle("Multi Checkbox Demo");
        pack();
        setVisible(true);
        setResizable(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void createCheckBox(int index) {
        boxes[index] = new JCheckBox(items[index].toString());
        boxes[index].setBorder(new EmptyBorder(0, 0, 0, 0));
        boxes[index].addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                items[index].checked = boxes[index].isSelected();
                int totalItemsChecked = getCheckedCount();

                totalLabel.setText("Total: " + totalItemsChecked * 1.5);
            }
        });
        jPanel.add(boxes[index]);
    }

    private int getCheckedCount() {
        int count = 0;

        for (int i = 0; i < items.length; i++) {
            if(items[i].checked) {
                count++;
            }
        }
        return count;
    }
}

Вывод :

введите описание изображения здесь

введите описание изображения здесь

Надеюсь, этот ответ поможет вам.

Спасибо

11
задан Drew Noakes 2 March 2009 в 11:52
поделиться

8 ответов

Это, как гарантирует спецификация C#, будет идентично созданию строки в единственном литерале, потому что это - постоянное время компиляции. От раздела 7.18 из спецификации C# 3:

Каждый раз, когда выражение выполняет упомянутые выше требования, выражение оценено во время компиляции. Это верно, даже если выражение является подвыражением большего выражения, которое содержит непостоянные конструкции.

(См. спецификацию для точных деталей "упомянутых выше требований" :)

Спецификация языка Java указывает его около нижней части раздела 3.10.5:

Строки, вычисленные константными выражениями (§15.28), вычисляют во время компиляции и затем рассматривают, как будто они были литералами.

28
ответ дан 3 December 2019 в 00:46
поделиться

Действительно, в Java, компилятор повернется String в константу.

class LongLongString
{
    public LongLongString()
    {
        String newString = "This is a really long long long long long" +
            " long long long long long long long long long long long long " +
            " long long long long long long long long long string for example.";
    }

    public static void main(String[] args)
    {
        new LongLongString();
    }
}

Компилируется в:

Compiled from "LongLongString.java"
class LongLongString extends java.lang.Object{
public LongLongString();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   ldc #2; //String This is a really long long long long long long long long long long long long long long long long long  long long long long long long long long long string for example.
   6:   astore_1
   7:   return

public static void main(java.lang.String[]);
  Code:
   0:   new #3; //class LongLongString
   3:   dup
   4:   invokespecial   #4; //Method "<init>":()V
   7:   pop
   8:   return

}

Как видно, одна строка загружается в в строке 4, а не несколько String экземпляры, загружаемые в.

Править: Исходный файл был скомпилирован с помощью javac версия 1.6.0_06. Смотря на Спецификацию языка Java, Третий Выпуск, (и тот же раздел упомянул в ответе Jon Skeet), я не смог найти любую ссылку для того, должен ли компилятор связать мультилинию String в сингл String, таким образом, это поведение является, вероятно, определенным для реализации компилятором.

14
ответ дан 3 December 2019 в 00:46
поделиться

Протестируйте это на себя. В коде C# (эквивалентный Java работал бы также):

string x = "A" + "B" + "C";
string y = "ABC";

bool same = object.ReferenceEquals(x, y); // true

Вы будете видеть, что результат true.

Как в стороне, Вы будете видеть, что строка также интернируется в строковом пуле времени выполнения:

bool interned = object.ReferenceEquals(x, string.Intern(x)); // true
6
ответ дан 3 December 2019 в 00:46
поделиться

Насколько я могу помнить, это не создаст несколько строк, просто та.

3
ответ дан 3 December 2019 в 00:46
поделиться

Никакой компромисс производительности. Оптимизация компилятора объединит это с единственной строкой (по крайней мере, в Java).

5
ответ дан 3 December 2019 в 00:46
поделиться

Пока все строки являются постоянными (как они находятся в Вашем примере), в Java (и я воображаю C#), компилятор преобразовывает это в единственную строку.

Вы только получаете проблемы производительности с + при конкатенации большого количества динамических строк, такой как в цикле. В этом случае используют StringBuilder или StringBuffer.

2
ответ дан 3 December 2019 в 00:46
поделиться

Эквивалентная.NET IL к ответу дополнительного coobird:

Для кода C#:

string s = "This is a really long long long long long" +
    " long long long long long long long long long long long long " +
    " long long long long long long long long long string for example.";
Console.WriteLine(s);

Компиляция отладки производит:

.method public hidebysig static void Main(string[] args) cil managed
{
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
  .maxstack 1
  .locals init (
      [0] string str)
  L_0000: ldstr "This is a really long long long long long long long long long long long long long long long long long  long long long long long long long long long string for example."
  L_0005: stloc.0 
  L_0006: ldloc.0 
  L_0007: call void [mscorlib]System.Console::WriteLine(string)
  L_000c: ret 
}

Так, как Вы видите, это - одна строка.

3
ответ дан 3 December 2019 в 00:46
поделиться

Отказ от ответственности: Это верно для Java. Я принял бы его истинное для c#

Мало того, что javac создаст единственную Строку, но и JVM, будет использовать одну Строку для всей другой Строки, которые содержат тот же текст.

String a = "He" + "llo th"+ "ere";
String b = "Hell" + "o the"+ "re";
String c = "Hello" +" "+"there";
assert a == b; // these are the same String object.
assert a == c; // these are the same String object.

Примечание: они будут тем же Строковым объектом во времени выполнения, даже если они будут в различных классах в различных БАНКАХ, скомпилированных различными компиляторами.

0
ответ дан 3 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: