Czy to poprawny sposób konwersji znaku na ciąg znaków w Javie? [duplikować]


20

Pisząc testy jednostkowe dla funkcji zwracającej, booleanktóra zajmuje dwa Strings, musiałem przetestować każdy znak alfabetu ( 'a'-'z' ) w sekwencji jako jeden z parametrów, jeden po drugim, więc napisałem to, aby to zrobić:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, new String(c));
} 

Myślałbym, że to jest dopuszczalne, ale tak nie było, więc po prostu zrobiłem to w ten sposób:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
} 

Czy jest to niezawodna metoda konwersji charna Stringjęzyk Java? Czy to preferowany sposób? Nie znam się dużo na Javie, dlatego chciałbym coś wyjaśnić.


2
Nie bezpośrednio na twoje pytanie, ale chciałbymIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
— Elliott Frisch

3
@ElliottFrisch, ale dlaczego? Strumienie są tutaj niepotrzebne, ale nawet jeśli nalegasz na użycie strumieni dla każdej pętli, dlaczego przynajmniej nie użyć IntStream.rangeClosed('a', 'z')?
— PhilipRoman

1
Nie ma jednego „poprawnego” sposobu. Prawdopodobnie jest to co najmniej pięć sposobów: wybór zależy zarówno od mody, jak i od faktów naukowych. Przez większość czasu to po prostu nie ma znaczenia, a program testowy jest z pewnością jednym z takich przypadków.
— user207421

@PhilipRoman Ponieważ tam jest (Edmund Hillary). Bo mogę. Ponieważ chcemy (Billie Piper, tak myślę). To też fajne podejście.
— Elliott Frisch

Myślałbym, że to jest dopuszczalne. Myślałeś, że można przywołać Stringkonstruktora, który nie istnieje? Popraw mnie, jeśli się mylę, ale o ile mi wiadomo, w klasie nie ma konstruktora, Stringktóry bierze jeden charargument. Pamiętaj, że charto nie to samo co char[].
— Abra

Odpowiedzi:


33

Najkrótsze rozwiązanie:

char c = 'a';
String s = "" + c;

Najczystsze (i prawdopodobnie najbardziej wydajne 1 ) rozwiązania:

char c = 'a';

String s1 = String.valueOf(c);
// or
String s2 = Character.toString(c);

W porównaniu z twoim podejściem powyższe zapobiega nakładaniu się konieczności umieszczania prymitywnego Characterobiektu w obiekcie.


1 Niewielka nieefektywność konkatenacji łańcuchów w pierwszym podejściu może zostać zoptymalizowana przez kompilator lub środowisko wykonawcze, więc jeden (jeśli byłby tak skłonny) naprawdę musiałby uruchomić mikroprocesor, aby określić rzeczywistą wydajność. Takie mikrooptymalizacje rzadko są warte wysiłku, a poleganie na konkatenacji w celu wymuszenia konwersji łańcucha po prostu nie wygląda zbyt ładnie.


6
Ostatnim razem, gdy patrzyłem, javackompilator firmy Sun automatycznie przekształca String s = "" + c;się String s = String.valueOf(c);, więc wydajność będzie taka sama.
— Neil

4
@Neil Whew! Zaczynałem myśleć, że osoba, dla której napisałem ten przypis, już nie istnieje w Stack Overflow :)
— Robby Cornelissen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.