You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Sarmalayan sınıfların ctor'ları Java 9 ile birlikte deprecated olmuştur.
/*---------------------------------------------------------------------------------------------------------------------- 26.09.2020 Sarmalayan sınıfların ctor'ları Java 9 ile birlikte deprecated olmuştur. Yani kutulama işlemi için ctor'lar kullanılmamalıdır. Zaten ileride anlatılacak sebeplerden dolayı Java 5'den itibaren zaten ctor kullanımı tavsiye edilmemektedir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
IntegeriVal = newInteger(10);
DoubledVal = newDouble(20.2);
//...
}
}
Kutulama için sarmalayan sınıfların valueOf metotları ctor yerine kullanılmalıdır
Integer sınıfının (aslında tamsayı türlerine ilişkin tüm sarmalayan sınıfların) valueOf metotları ve cache
/*---------------------------------------------------------------------------------------------------------------------- Integer sınıfının (aslında tamsayı türlerine ilişkin tüm sarmalayan sınıfların) valueOf metotları [-128, 127] aralığındaki değerleri bir önbellekte (cache) tutar. Böylelikle daha efektif bir çalışma sağlanır. Not: IntValue sınıfının kodlarını tekrar inceleyiniz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
IntegeriVal1 = Integer.valueOf(100);
IntegeriVal2 = Integer.valueOf(100);
System.out.println(iVal1 == iVal2);
//...
}
}
[-128, 127] aralığı dışında kalan değerler için önbellek kullanılacağı garanti değildir.
/*---------------------------------------------------------------------------------------------------------------------- [-128, 127] aralığı dışında kalan değerler için önbellek kullanılacağı garanti değildir. Bu JDK yazanlara bırakılmıştır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
IntegeriVal1 = Integer.valueOf(100);
IntegeriVal2 = Integer.valueOf(100);
System.out.println(iVal1 == iVal2);
//...
}
}
Character sınıfı [0, 127] (standart ASCII karkaterleri) aralığındaki karakterlere ilişkin sıra numarasını önbellekte tutar.
/*---------------------------------------------------------------------------------------------------------------------- Character sınıfı [0, 127] (standart ASCII karkaterleri) aralığındaki karakterlere ilişkin sıra numarasını önbellekte tutar. Diğer karakterlere ilişkin sıra numaralarının önbellekte tutulacağının bir garantisi yoktur----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Characterc1 = Character.valueOf('C');
Characterc2 = Character.valueOf('C');
Characterc3 = Character.valueOf('Ş');
Characterc4 = Character.valueOf('Ş');
System.out.println(c1 == c2);
System.out.println(c3 == c4);
}
}
Number sınıfının xxxValue metotları nümerik sarmalayan sınıflar için ilişkin olduğu temel türe göre tür dönüştürme kurallarına uygun olarak çalışır.
/*---------------------------------------------------------------------------------------------------------------------- Number sınıfının xxxValue metotları nümerik sarmalayan sınıflar için ilişkin olduğu temel türe göre tür dönüştürme kurallarına uygun olarak çalışır. Yani örneğin, bir int değerin short türüne explicit olarak atanması durumunda elde edilen değer Integer sınıfı ile sarmalanmış bir değere ilişkin nesnenin shortValue metodunun döndürdüğü değer ile aynıdır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
intval = 200000;
IntegeriVal = Integer.valueOf(val);
shorta = (short)val;
shortb = iVal.shortValue();
System.out.printf("a=%d%n", a);
System.out.printf("b=%d%n", b);
}
}
Kutulama işlemi ile kutulanmış bir değere ilişkin nesnenin referansı da Object referansı ile tutulabilir
/*---------------------------------------------------------------------------------------------------------------------- Kutulama işlemi ile kutulanmış bir değere ilişkin nesnenin referansı da Object referansı ile tutulabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Objectobject = Integer.valueOf(10);
System.out.println(object.getClass().getName());
intval = ((Integer)object).intValue();
System.out.printf("val=%d%n", val);
}
}
Java 5 ile birlikte temel türlere ilişkin sarmalayan sınıf referanslarına ilgili türden bir değer doğrudan atanabilmektedir.
/*---------------------------------------------------------------------------------------------------------------------- Java 5 ile birlikte temel türlere ilişkin sarmalayan sınıf referanslarına ilgili türden bir değer doğrudan atanabilmektedir. Bu işlem aslında derleyici tarafından aşağıdaki gibi bir kod üretilmesini sağlar. Yani programcı bu atamayı yaptığında derleyici uygun kodu üretir. Bu işleme "auto-boxing (otomatik kutulama)".----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
IntegeriVal1 = 10; //auto-boxing: Integer.valueOf(10);IntegeriVal2 = 10; //auto-boxing: Integer.valueOf(10);System.out.println(iVal1 == iVal2);
DoubledVal = 3.4; //auto-boxing: Double.valueOf(3.4);
}
}
Otomatik kutulama Object türü için de geçerlidir
/*---------------------------------------------------------------------------------------------------------------------- Otomatik kutulama Object türü için de geçerlidir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Objecto = 10;
System.out.println(o.getClass().getName());
}
}
Aşağıdaki metot çağrılarında otomatik kutulama yapılır
Temel türden bir değer o türe ilişkin sarmalayan sınıf referansına doğrudan atanabilir
/*---------------------------------------------------------------------------------------------------------------------- Temel türden bir değer o türe ilişkin sarmalayan sınıf referansına doğrudan atanabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Doubled = 10; //error: Integer.valueOf(10);//...
}
}
Java 5 ile birlikte sarmalayan sınıf referansı ilişkin olduğu türe doğrudan atanabilir.
/*---------------------------------------------------------------------------------------------------------------------- Java 5 ile birlikte sarmalayan sınıf referansı ilişkin olduğu türe doğrudan atanabilir. Bu durumda yine derleyici aşağıdaki gibi kod üretir. Bu işleme "auto unboxing (otomatik kutu açma)" denir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
IntegeriVal = 10; //auto boxinginta = iVal; //auto unboxing: iVal.intValue();System.out.printf("a=%d%n", a);
DoubledVal = 2.3;//auto boxingdoubleb = dVal; //auto unboxing: dVal.doubleValue();System.out.printf("b=%f%n", b);
}
}
Aşağıdaki durumda error oluşmaz çünkü Derleyicinin ürettiği kodda çağrılan intValue metodunun geri dönüş değeri int türdendir
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki durumda error oluşmaz çünkü Derleyicinin ürettiği kodda çağrılan intValue metodunun geri dönüş değeri int türdendir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
IntegeriVal = 10; //auto boxingdoublea = iVal; //auto unboxing: iVal.intValue();System.out.printf("a=%f%n", a);
}
}
Aşağıdaki durumda error oluşur. Çünkü int türünün short türüne atanması geçersizdir
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki durumda error oluşur. Çünkü int türünün short türüne atanması geçersizdir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
IntegeriVal = 10; //auto boxingshorta = iVal; //error: iVal.intValue();//...
}
}
Otomatik kutu açma tür dönüştürme operatörü ile aşağıdaki gibi Object türü ile de kullanılabilir.
/*---------------------------------------------------------------------------------------------------------------------- Otomatik kutu açma tür dönüştürme operatörü ile aşağıdaki gibi Object türü ile de kullanılabilir. Yine derleyici aşağıda belirtilen kodları üretir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
inta = 10;
Objectobject = a; //auto boxing: Integer.valueOf(a);intval = (int)object; //auto unboxing: ((Integer)object).intValue();System.out.printf("val=%d%n", val);
}
}
Otomatik kutu açma uygun türe yapılmalıdır. Aşağıdaki örnekte exception oluşur. Yani haksız dönüşüm vardır
/*---------------------------------------------------------------------------------------------------------------------- Otomatik kutu açma uygun türe yapılmalıdır. Aşağıdaki örnekte exception oluşur. Yani haksız dönüşüm vardır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
inta = 10;
Objectobject = a; //auto boxing: Integer.valueOf(a);doubleval = (double)object; //auto unboxing: ((Double)object).doubleValue();System.out.printf("val=%f%n", val);
}
}
Yukarıdaki problem aşağıdaki gibi çözülebilir
/*---------------------------------------------------------------------------------------------------------------------- Yukarıdaki problem aşağıdaki gibi çözülebilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
inta = 10;
Objectobject = a; //auto boxing: Integer.valueOf(a);doubleval = (int)object; //auto unboxing: ((Integer)object).intValue();System.out.printf("val=%f%n", val);
}
}
Aşağıdaki örnekte önce int türüne otomatik kutu açılmış, elde edilen değer short türüne dönüştürülmüştür.
Sarmalayan sınıflar ilişkin olduğu türler gibi davranabilmektedir.
/*---------------------------------------------------------------------------------------------------------------------- Sarmalayan sınıflar ilişkin olduğu türler gibi davranabilmektedir. Aslında bu işlemler otomatik kutulama ve otomatik kutu açma işlemleri ile yapılabilmektedir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
for (Integeri = 0; i < 10; ++i)
System.out.printf("%d ", i);
System.out.println();
}
}
Sarmalayan sınıflar immutable olduğundan aşağıdaki örnekte ++ operatörü aslında yeni nesne yaratılıp eski nesnenin kopartılması biçiminde yapılmaktadır.
/*---------------------------------------------------------------------------------------------------------------------- Sarmalayan sınıflar immutable olduğundan aşağıdaki örnekte ++ operatörü aslında yeni nesne yaratılıp eski nesnenin kopartılması biçiminde yapılmaktadır. Şüphesiz bu işlem de otomatik kutulama ve otomatik kutu açma ile kolayca yapılabilmektedir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Integeri = 10;
++i; // i = i.intValue() + 1inta = i;
System.out.println(i);
}
}
++ operatörü ile nesnenin içeriğinin değiştirilmediğinin ispatı
final anahtar sözcüğü ile bildirilen bir sınıftan türetme yapılamaz. Yani bu sınıf türetmeye kapatılmış olur
/*---------------------------------------------------------------------------------------------------------------------- final anahtar sözcüğü ile bildirilen bir sınıftan türetme yapılamaz. Yani bu sınıf türetmeye kapatılmış olur----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classAextendsSample { //error//...
}
finalclassSample {
//...
}
final sınıflar başka bir sınıftan türetilmiş olabilir
/*---------------------------------------------------------------------------------------------------------------------- final sınıflar başka bir sınıftan türetilmiş olabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classCextendsB { //error//...
}
finalclassBextendsA {
//...
}
classA {
}
final sınıf olmasaysı türetmeye kapatmak için aşağıdaki işlemlerin yapılması gerekirdi
/*---------------------------------------------------------------------------------------------------------------------- final sınıf olmasaysı türetmeye kapatmak için aşağıdaki işlemlerin yapılması gerekirdi----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Ax = A.getInstance();
//...
}
}
classBextendsA { //error
}
classA {
privateA()
{}
publicstaticAgetInstance()
{
returnnewA();
}
//...
}
ctor'u private olarak bildirilmiş bir sınıftan zaten türetme yapılamayacağından bu tarz sınıfların final olarak bildirilmesi iyi bir tekniktir.
/*---------------------------------------------------------------------------------------------------------------------- ctor'u private olarak bildirilmiş bir sınıftan zaten türetme yapılamayacağından bu tarz sınıfların final olarak bildirilmesi iyi bir tekniktir. Örneğin Math sınıfı final olarak bildirilmiştir----------------------------------------------------------------------------------------------------------------------*//*---------------------------------------------------------------------------------------------------------------------- StringUtil sınıfı----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.util;
importjava.util.Random;
importstaticjava.lang.Character.*;
publicfinalclassStringUtil {
privatestaticfinalStringALPHABET_TR = "abcçdefgğhıijklmnoöprsştuüvyz";
privatestaticfinalStringALPHABET_EN = "abcdefghijklmnopqrstuwxvyz";
privateStringUtil()
{
}
publicstaticStringcapitalize(Strings)
{
if (s.isEmpty())
returns;
returntoUpperCase(s.charAt(0)) + s.substring(1).toLowerCase();
}
publicstaticintcountString(Strings1, Strings2)
{
intcount = 0;
for (inti = -1; (i = s1.indexOf(s2, i + 1)) != -1; ++count)
;
returncount;
}
publicstaticStringgetLetters(Strings)
{
Stringstr = "";
intlength = s.length();
for (inti = 0; i < length; ++i) {
charch = s.charAt(i);
if (isLetter(ch))
str += ch;
}
returnstr;
}
publicstaticStringgetLongestPalindrome(Strings)
{
Stringtext = "";
intendIndex = s.length();
while (endIndex != 0) {
intbeginIndex = 0;
while (beginIndex != endIndex) {
Stringstr = s.substring(beginIndex++, endIndex);
if (str.length() > 1 && StringUtil.isPalindrome(str) && str.length() > text.length())
text = str;
}
--endIndex;
}
returntext;
}
publicstaticStringgetRandomText(Randomr, intn, StringmainText)
{
char [] c = newchar[n];
for (inti = 0; i < n; ++i) {
charch = mainText.charAt(r.nextInt(mainText.length()));
if (r.nextBoolean())
ch = toUpperCase(ch);
c[i] = ch;
}
returnString.valueOf(c);
}
publicstaticStringgetRandomTextEN(intn)
{
returngetRandomTextEN(newRandom(), n);
}
publicstaticStringgetRandomTextEN(Randomr, intn)
{
returngetRandomText(r, n, ALPHABET_EN);
}
publicstaticStringgetRandomTextTR(intn)
{
returngetRandomTextTR(newRandom(), n);
}
publicstaticStringgetRandomTextTR(Randomr, intn)
{
returngetRandomText(r, n, ALPHABET_TR);
}
publicstaticbooleanisPalindrome(Strings)
{
intleft = 0;
intright = s.length() - 1;
while (left < right) {
charchLeft = toLowerCase(s.charAt(left));
if (!isLetter(chLeft)) {
++left;
continue;
}
charchRight = toLowerCase(s.charAt(right));
if (!isLetter(chRight)) {
--right;
continue;
}
if (chLeft != chRight)
returnfalse;
++left;
--right;
}
returntrue;
}
publicstaticbooleanisPangram(Stringtext, Stringalphabet)
{
intlength = alphabet.length();
for (inti = 0; i < length; ++i)
if (!text.contains(alphabet.charAt(i) + ""))
returnfalse;
returntrue;
}
publicstaticbooleanisPangramEN(Stringtext)
{
returnisPangram(text.toLowerCase(), ALPHABET_EN);
}
publicstaticbooleanisPangramTR(Stringtext)
{
returnisPangram(text.toLowerCase(), ALPHABET_TR);
}
publicstaticStringpadLeft(Strings, intlength)
{
returnpadLeft(s, length, ' ');
}
publicstaticStringpadLeft(Strings, intlength, charch)
{
length -= s.length();
if (length <= 0)
returns;
returnrepeat(length, ch) + s;
}
publicstaticStringpadRight(Strings, intlength)
{
returnpadRight(s, length, ' ');
}
publicstaticStringpadRight(Strings, intlength, charch)
{
length -= s.length();
if (length <= 0)
returns;
returns + repeat(length, ch);
}
publicstaticStringremoveWhitespaces(Strings)
{
intlength = s.length();
Stringstr = "";
for (inti = 0; i < length; ++i) {
charch = s.charAt(i);
if (!isWhitespace(ch))
str += ch;
}
returnstr;
}
publicstaticStringrepeat(intn, charch)
{
char [] c = newchar[n];
while (n-- > 0)
c[n] = ch;
returnString.valueOf(c);
}
publicstaticStringreverse(Stringstr)
{
char [] c = str.toCharArray();
ArrayUtil.reverse(c);
returnString.valueOf(c);
}
publicstaticString [] split(Stringstr, Stringdelimiters)
{
returnsplit(str, delimiters, StringSplitOptions.NONE);
}
publicstaticString [] split(Stringstr, Stringdelimiters, StringSplitOptionsstringSplitOptions) // Bazı az kulanılan detaylar gözmezden gelindi
{
Stringpattern = "[";
intlength = delimiters.length();
for (inti = 0; i < length; ++i) {
chardelim = delimiters.charAt(i);
pattern += delim == '[' || delim == ']' ? "\\" + delim : delim;
}
pattern += stringSplitOptions == StringSplitOptions.REMOVE_EMPTY_ENTRIES ? "]+" : "]";
returnstr.split(pattern);
}
publicstaticStringtrimLeft(Strings)
{
inti;
intlen = s.length();
for (i = 0; i < len && isWhitespace(s.charAt(i)); ++i)
;
returns.substring(i);
}
publicstaticStringtrimRight(Strings)
{
inti;
for (i = s.length() - 1; i >= 0 && isWhitespace(s.charAt(i)); --i)
;
returns.substring(0, i + 1);
}
}
NumberUtil sınıfı
/*---------------------------------------------------------------------------------------------------------------------- NumberUtil sınıfı----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.util;
importstaticjava.lang.Math.*;
publicfinalclassNumberUtil {
privatestaticfinalString [] ONES_TR = {"", "bir", "iki", "üç", "dört", "beş", "altı", "yedi", "sekiz", "dokuz"};
privatestaticfinalString [] TENS_TR = {"", "on", "yirmi", "otuz", "kırk", "elli", "altmış", "yetmiş", "seksen", "doksan"};
privatestaticint[] getDigits(longval, intn)
{
longvalue = Math.abs(val);
intcount = value == 0 ? 1 : (int)Math.log10(value) / n + 1;
int [] digits = newint[count];
intpowerOfTen = (int)Math.pow(10, n);
for (inti = count - 1; i >= 0; digits[i] = (int)(value % powerOfTen), value /= powerOfTen, --i)
;
returndigits;
}
privatestaticStringnumberToText3DigitsTR(intval)
{
if(val == 0)
return"sıfır";
Stringtext = val < 0 ? "eksi" : "";
intvalue = Math.abs(val);
inta = value / 100;
intb = value / 10 % 10;
intc = value % 10;
if (a != 0) {
if (a != 1)
text += ONES_TR[a];
text += "yüz";
}
if (b != 0)
text += TENS_TR[b];
if (c != 0)
text += ONES_TR[c];
returntext;
}
privateNumberUtil()
{
}
publicstaticintfactorial(intn)
{
if (n < 0)
return -1;
intresult = 1;
for (inti = 2; i <= n; ++i)
result *= i;
returnresult;
}
publicstaticint[] getDigits(intval)
{
returngetDigits((long)val);
}
publicstaticint[] getDigits(longval)
{
returngetDigits(val, 1);
}
publicstaticint[] getDigitsInTwos(longval)
{
returngetDigits(val, 2);
}
publicstaticint[] getDigitsInThrees(longval)
{
returngetDigits(val, 3);
}
publicstaticintgetDigitsCount(longval)
{
returnval == 0 ? 1 : (int)log10(abs(val)) + 1;
}
publicstaticintgetDigitsPowSum(intval)
{
intcount = getDigitsCount(val);
intsum = 0;
while (val != 0) {
sum += pow(val % 10, count);
val /= 10;
}
returnsum;
}
publicstaticintgetDigitsSum(intval)
{
val = abs(val);
intsum = 0;
while (val != 0) {
sum += val % 10;
val /= 10;
}
returnsum;
}
publicstaticintgetFibonacciNumber(intn)
{
if (n <= 0)
return -1;
if (n <= 2)
returnn - 1;
intprev1 = 1, prev2 = 0, val = 0;
for (inti = 2; i < n; ++i) {
val = prev1 + prev2;
prev2 = prev1;
prev1 = val;
}
returnval;
}
publicstaticintgetNextFibonacciNumber(intval)
{
if (val < 0)
return0;
intprev1 = 1, prev2 = 0, result;
for (;;) {
result = prev1 + prev2;
if (result > val)
returnresult;
prev2 = prev1;
prev1 = result;
}
}
publicstaticintgetPrime(intn)
{
if (n <= 0)
return -1;
intcount = 0;
intval = 2;
for (inti = 2; count < n; ++i)
if (isPrime(i)) {
++count;
val = i;
}
returnval;
}
publicstaticintgetReverse(intval)
{
intreverse = 0;
while (val != 0) {
reverse = reverse * 10 + val % 10;
val /= 10;
}
returnreverse;
}
publicstaticbooleanisArmstrong(intval)
{
if (val < 0)
returnfalse;
returngetDigitsPowSum(val) == val;
}
publicstaticbooleanisEven(intval)
{
returnval % 2 == 0;
}
publicstaticbooleanisOdd(intval)
{
return !isEven(val);
}
publicstaticbooleanisPrime(intval)
{
if (val <= 1)
returnfalse;
if (val % 2 == 0)
returnval == 2;
if (val % 3 == 0)
returnval == 3;
if (val % 5 == 0)
returnval == 5;
if (val % 7 == 0)
returnval == 7;
intsqrtVal = (int)sqrt(val);
for (inti = 11; i <= sqrtVal; i += 2)
if (val % i == 0)
returnfalse;
returntrue;
}
publicstaticbooleanisNotPrime(intval)
{
return !isPrime(val);
}
publicstaticintmax(inta, intb, intc)
{
returnMath.max(Math.max(a, b), c);
}
publicstaticintmin(inta, intb, intc)
{
returnMath.min(Math.min(a, b), c);
}
publicstaticStringnumberToTextTR(longval)
{
Stringtext;
//TODO: Homework-012-3. sorutext = numberToText3DigitsTR((int)val);
returntext;
}
publicstaticintpow(inta, intb)
{
if (b <= 0)
return1;
intresult = 1;
while (b-- > 0)
result *= a;
returnresult;
}
}
ArrayUtil sınıfı
/*---------------------------------------------------------------------------------------------------------------------- ArrayUtil sınıfı----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.util;
importjava.util.Random;
publicfinalclassArrayUtil {
privatestaticvoidbubbleSortAscending(int [] a)
{
for (inti = 0; i < a.length - 1; ++i)
for (intk = 0; k < a.length - 1 - i; ++k)
if (a[k + 1] < a[k])
swap(a, k, k + 1);
}
privatestaticvoidbubbleSortDescending(int [] a)
{
for (inti = 0; i < a.length - 1; ++i)
for (intk = 0; k < a.length - 1 - i; ++k)
if (a[k + 1] > a[k])
swap(a, k, k + 1);
}
privatestaticvoidselectionSortAscending(int [] a)
{
intmin, minIndex;
for (inti = 0; i < a.length - 1; ++i) {
min = a[i];
minIndex = i;
for (intk = i + 1; k < a.length; ++k) {
if (a[k] < min) {
min = a[k];
minIndex = k;
}
}
a[minIndex] = a[i];
a[i] = min;
}
}
privatestaticvoidselectionSortDescending(int [] a)
{
intmax, maxIndex;
for (inti = 0; i < a.length - 1; ++i) {
max = a[i];
maxIndex = i;
for (intk = i + 1; k < a.length; ++k) {
if (a[k] > max) {
max = a[k];
maxIndex = k;
}
}
a[maxIndex] = a[i];
a[i] = max;
}
}
privateArrayUtil()
{
}
publicstaticint [][] addMatrices(int [][] a, int [][] b)
{
if (isNotMatrix(a) || isNotMatrix(b) || a.length != b.length || a[0].length != b[0].length) {
System.out.println("Invalid matrices for add operation");
System.exit(-1); //exception işlemlerine kadar sabredin
}
int [][] total = newint[a.length][a[0].length];
for (inti = 0; i < total.length; ++i)
for (intj = 0; j < total[i].length; ++j)
total[i][j] = a[i][j] + b[i][j];
returntotal;
}
publicstaticvoidbubbleSort(int [] a, booleandescending)
{
if (descending)
bubbleSortDescending(a);
elsebubbleSortAscending(a);
}
publicstaticvoidbubbleSort(int [] a)
{
bubbleSort(a, false);
}
publicstaticvoiddisplay(int [] a)
{
display(1, a);
}
publicstaticvoiddisplay(intk, int [] a)
{
display(k, a.length, a);
}
publicstaticvoiddisplay(intk, intcount, int [] a)
{
Stringfmt = String.format("%%0%dd ", k); //"%02d " -> k = 2for (inti = 0; i < count; ++i)
System.out.printf(fmt, a[i]);
System.out.println();
}
publicstaticvoiddisplay(String [] strings)
{
for (Stringstring : strings)
System.out.println(string);
}
publicstaticvoiddisplay(int [][] a)
{
display(1, a);
}
publicstaticvoiddisplay(intk, int [][] a)
{
for (int [] array : a)
display(k, array);
}
publicstaticvoiddrawHistogram(int [] data, intn, charch)
{
intmaxVal = max(data);
for (intval : data) {
intcount = (int)Math.floor(val * n / (double)maxVal);
while (count-- > 0)
System.out.print(ch);
System.out.println();
}
}
publicstaticvoidfillRandomArray(int [] a, intmin, intmax)
{
fillRandomArray(newRandom(), a, min, max);
}
publicstaticvoidfillRandomArray(Randomr, int [] a, intmin, intmax)
{
for (inti = 0; i < a.length; ++i)
a[i] = r.nextInt(max - min) + min;
}
publicstaticint[] getHistogramData(int [] a, intn) //[0, n]
{
int [] histData = newint[n + 1];
for (intval : a)
++histData[val];
returnhistData;
}
publicstaticint [] getRandomArray(intn, intmin, intmax) //[min, max)
{
returngetRandomArray(newRandom(), n, min, max);
}
publicstaticint [] getRandomArray(Randomr, intn, intmin, intmax) //[min, max)
{
int [] a = newint[n];
fillRandomArray(r, a, min, max);
returna;
}
publicstaticint[][] getRandomMatrix(intm, intn, intmin, intmax) //[min, max)
{
returngetRandomMatrix(newRandom(), m, n, min, max);
}
publicstaticint[][] getRandomMatrix(Randomr, intm, intn, intmin, intmax) //[min, max)
{
int [][] a = newint[m][];
for (inti = 0; i < m; ++i)
a[i] = getRandomArray(r, n, min, max);
returna;
}
publicstaticint [][] getRandomSquareMatrix(intn, intmin, intmax)
{
returngetRandomSquareMatrix(newRandom(), n, min, max);
}
publicstaticint [][] getRandomSquareMatrix(Randomr, intn, intmin, intmax)
{
returngetRandomMatrix(r, n, n, min, max);
}
publicstaticbooleanisMatrix(int [][] a)
{
intcount = a[0].length;
for (inti = 1; i < a.length; ++i)
if (a[i].length != count)
returnfalse;
returntrue;
}
publicstaticbooleanisNotMatrix(int [][]a)
{
return !isMatrix(a);
}
publicstaticbooleanisSquareMatrix(int [][] a)
{
returnisMatrix(a) && a[0].length == a.length;
}
publicstaticbooleanisNotSquareMatrix(int [][] a)
{
return !isSquareMatrix(a);
}
publicstaticStringjoin(String [] strings, chardelimiter)
{
returnjoin(strings, delimiter + "");
}
publicstaticStringjoin(String [] strings, Stringdelimiter)
{
Stringstr = "";
for (Strings : strings)
str += s + delimiter;
returnstr.substring(0, str.length() - delimiter.length());
}
publicstaticintmax(int [] a)
{
intmaxVal = a[0];
for (inti = 1; i < a.length; ++i)
if (a[i] > maxVal)
maxVal = a[i];
returnmaxVal;
}
publicstaticintmin(int [] a)
{
intminVal = a[0];
for (inti = 1; i < a.length; ++i)
if (a[i] < minVal)
minVal = a[i];
returnminVal;
}
publicstaticintpartition(int [] a, intthreshold)
{
intpartitionIndex = 0;
while (partitionIndex != a.length && a[partitionIndex] < threshold)
++partitionIndex;
if (partitionIndex == a.length)
returnpartitionIndex;
for (inti = partitionIndex + 1; i < a.length; ++i)
if (a[i] < threshold)
swap(a, i, partitionIndex++);
returnpartitionIndex;
}
publicstaticvoidreverse(int [] a)
{
inthalfLen = a.length / 2;
for (inti = 0; i < halfLen; ++i)
swap(a, i, a.length - 1 - i);
}
publicstaticvoidreverse(char [] a)
{
inthalfLen = a.length / 2;
for (inti = 0; i < halfLen; ++i)
swap(a, i, a.length - 1 - i);
}
publicstaticvoidselectionSort(int [] a)
{
selectionSort(a, false);
}
publicstaticvoidselectionSort(int [] a, booleandescending)
{
if (descending)
selectionSortDescending(a);
elseselectionSortAscending(a);
}
publicstaticintsum(int [] a)
{
inttotal = 0;
for (intval : a)
total += val;
returntotal;
}
publicstaticintsum(int [][] a)
{
inttotal = 0;
for (inti = 0; i < a.length; ++i)
for (intk = 0; k < a[i].length; ++k)
total += a[i][k];
returntotal;
}
publicstaticintsumDiagonal(int [][] a)
{
inttotal = 0;
for (inti = 0; i < a.length; ++i)
total += a[i][i];
returntotal;
}
publicstaticvoidswap(int [] a, inti, intk)
{
inttemp;
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
publicstaticvoidswap(char [] a, inti, intk)
{
chartemp;
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
publicstaticint [][] transpose(int [][] a)
{
int [][] t = newint[a[0].length][a.length];
for (inti = 0; i < t.length; ++i)
for (intj = 0; j < t[i].length; ++j)
t[i][j] = a[j][i];
returnt;
}
}
immutable sınıflardan genel olarak (tabii ki her zaman değil) türetme taban sınıf bölümü değiştirilemediğinden anlamsız olduğundan bu tarz sınıflar final yapılır.
/*---------------------------------------------------------------------------------------------------------------------- immutable sınıflardan genel olarak (tabii ki her zaman değil) türetme taban sınıf bölümü değiştirilemediğinden anlamsız olduğundan bu tarz sınıflar final yapılır. Ancak bu durum sadece genellenebilir. Konuya göre sınıfın final olmaması anlamlı olabilir. Örneğin String sınıfı ve sarmalayan sınıflar final olarak bildirilmiştir.----------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------- Heap'de tahsis edilen nesnelere dinamik olarak tahsis edilen (dinamik ömürlü) nesneler denir. Bu nesnelerin yok edilmesi çöp toplayıcı (garbage collector) denilen ve arka planda çalışan bir program tarafından yapılır. Çöp toplayıcı artık kullanılmayan (garbage collected, eligible) yani çöp olan nesneleri yok eder. Burada 3(üç) tane temel soru sorulabilir: 1. Programcı bir nesneyi yok edebilir mi? (HAYIR) 2. Çöp olan (garbage collected) bir nesne çöp olur olmaz yok edilir mi, yani çöp toplayıcı program hemen devreye girer mi? (GİRMEYEBİLİR) 3. Çöp toplayıcı yok edilmesi gereken bir nesneyi nasıl anlar? Java' da programcı bir nesneyi yok edemez. Yani tahsis edilmiş bir alanın geri bırakamaz (free, delete). Programcı kod akışı içerisinde bir nesneyi yok edilebilir (garbage collected) duruma getirebilir. Çöp toplayıcı programın ne zaman devreye gireceği standartlarda belirtilmemiştir. Bu çöp toplayıcı programla beraber JVM ve JRE yazanlara bırakılmıştır (implementation dependent.) Hemen devreye gireceği garanti değildir. Programcı bu bilinçle ve etkinliğine güvenerek kod yazar. Bir nesnenin yok edilebilir yani çöp durumuna gelmesi o nesneyi gösteren hiçbir referansın kalmaması kalmaması demektir. Yani nesnenin adresinin hiçbir referans tarafından tutulmuyor duruma gelmesidir. Bir nesnenin adresinin hangi referanslar tarafından tutulduğu ve özellikle kaç referans tarafından tutulduğunın takibi çeşitli algoritmalar kullanılarak yapılmaktadır. Bu algoritmanın ne olacağı da standtartlarda belirtilmemiştir (implementation dependent.) Biz burada referans sayma (reference counting) algoritması kullanılıyor varsayımıyla açıklama yapacağız. Referans sayacı yönteminde her yaratılan nesne için bir sayaç tutulur (bu sayaç genelde nesne içerisinde tutulur.). Bu yöntemde nesnenin adresi yeni bir referansa atandığından o nesne için sayaç 1(bir) artırılır. Nesne bir referanstan kopartıldığında sayaç 1(bir) azaltılır. Sayacı sıfır olam yani hiç bi referans tarafından gösterilmeyen bir nesne çöp durumuna gelmiş olur. Şüphesiz bir program sonlandığında tüm nesneler yok edilir.----------------------------------------------------------------------------------------------------------------------*/
Aşağıdaki örnekte referans sayacı yönteminin çalışması gösterilmiştir
/*---------------------------------------------------------------------------------------------------------------------- Programcı isterse çöp toplayıcı programın devreye girmesini sağlayabilir. Bunun için System sınıfının gc isimli metodu veya Runtime sınıfının gc isimli metodu çağrılabilir. Ancak bu çoğunlukla yapılmaması gereken bir durumdur. Programcı çöp toplayıcı programın devre girmesi konusundaki etkin çalışmaya güvenmelidir. Çünkü çöp toplayıcı programın gereksi yere arka planda çalışması da uygulamayı göreceli yavaşlatabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Samples;
s = newSample(); //rc1:1
{
Samplek;
k = s; //rc1:2Mample.foo(k);//rc1:3 -> rc1:4//rc1:2
} //rc1:1s = newSample(); //rc1:0 (garbage collected), rc2:1System.gc(); // ~ Runtime.getRuntime().gc();//...
}
}
classMample {
publicstaticvoidfoo(Samples)
{
Samplek;
//...k = s;
//...
}
}
classSample {
//...
}
Non-static, static metotlar ve this referansı
/*---------------------------------------------------------------------------------------------------------------------- 27.09.2020 Arakod düzeyinde non-static metot kavramı yoktur. Aslında aşağı seviyede böyle bir kavram yoktur. Bundan dolayı derleyici non-static metotları adeta static metotlar biçiminde arakoda yazar. Bunu non-static metoda ait olduğu sınıf türünden ekstra bir referans parametresi ekleyerek yapar. Bu parametrenin ilk parametre ya da son parametre ya da arada bir parametre olup olmadığının önemi yoktur. non-static bir metodun çağrısı da o metot çağrılırken kullanılan referansın arakoddaki karşılığı olan static metoda argüman olarak geçilmesiyle yapılır. Aşağıdaki örnekte non-static bir metodun bildirimi ve çağrılmasının arakoddaki temsili karşılıkları gösterilmiştir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Samples = newSample();
s.setVal(10);
//Arakoddaki karşılığımım temsiliSample.setVal(s, 10);
s.display();
//Arakoddaki karşılığımım temsiliSample.display(s);
}
}
classSample {
privateintm_val;
publicvoidsetVal(intval)
{
m_val = val;
}
//Arakoddaki karşılığının temsilipublicstaticvoidsetVal(Samples, intval)
{
s.m_val = val;
}
publicvoiddisplay()
{
System.out.printf("m_val=%d%n", m_val);
}
//Arakoddaki karşılığının temsilipublicstaticvoiddisplay(Samples)
{
System.out.printf("m_val=%d%n", s.m_val);
}
}
non-static metotlara gizlice geçirilen adrese metot bildiriminde this referansı ile erişilebilir.
/*---------------------------------------------------------------------------------------------------------------------- non-static metotlara gizlice geçirilen adrese metot bildiriminde this referansı ile erişilebilir. non-static bir metot içerisinde this referansı o metodu çağıran referans yani arakoddaki static metoda geçilen argümana karşılık gelir. this referansının türü hangi sınıf içerisinde kullanılmışsa o türdendir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Samples = newSample();
s.setVal(10);
s.display();
Samplek = newSample();
k.setVal(23);
k.display();
}
}
classSample {
privateintm_val;
publicvoidsetVal(intval)
{
this.m_val = val;
}
publicvoiddisplay()
{
System.out.printf("m_val=%d%n", this.m_val);
}
}
this referansı sabit kabul edilir. Yani this referansına atama yapılamaz
/*---------------------------------------------------------------------------------------------------------------------- this referansı sabit kabul edilir. Yani this referansına atama yapılamaz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample();
s.foo(10);
Samplek = newSample();
k.foo(20);
}
}
classSample {
privateintm_val;
publicvoidfoo(intval)
{
this = newSample(); //errorthis.m_val = val;
System.out.printf("m_val=%d%n", this.m_val);
this.bar();
}
publicvoidbar()
{
System.out.println("bar");
}
}
static metotlara this geçirilmez. Yani static metotlar içerisinde this referansı kullanılamaz
/*---------------------------------------------------------------------------------------------------------------------- static metotlara this geçirilmez. Yani static metotlar içerisinde this referansı kullanılamaz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
}
}
classSample {
privatestaticintms_val;
publicstaticvoidfoo(intval)
{
this.ms_val = val; //error
}
}
this referansının kullanıldığı yerler ve okunabilirlik
/*---------------------------------------------------------------------------------------------------------------------- Biz programcı olarak veri elemanları için this referansını gerekmedikçe kullanmayacağız. Ancak metot çağrılarında okunabilirlik açısından (ifadeyi karmaşık hale getirmesi durumları hariç) kullanmayı tercih edeceğiz. Çünkü non-static bir metodu this ile çağırmak static metotların okunabiliğini artırır. Bu kurala uyarak yazılmış bir kod içerisinde this ile çağrılmamış bir metodun static olduğu kolayca anlaşılır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample();
s.foo(10);
}
}
classSample {
privateintm_val;
publicstaticvoidtar()
{
System.out.println("tar");
}
publicvoidfoo(intval)
{
m_val = val;
this.bar();
tar();
}
publicvoidbar()
{
System.out.println("bar");
}
}
this referansı ve sınıf veri elemanları
/*---------------------------------------------------------------------------------------------------------------------- Bazı programcılar sınıfların veri elemanlarının isimlendirmesinde önek ya da sonek kullanmazlar. Bilindiği gibi biz sınıfın private veri elemanlarını m_, static ise ms_ önekleri ile isimlendiriyoruz. Ancak sınıfın veri elemanları public ise biz de bir önek kullanmıyoruz. Böylesi bir durumda bir metodun parametresi ile veri elemanı aynı isimde yapıldığında artık veri elemanına doğrudan erişilemez. Bu şekilde tasarımda this referansı ile bu işlem yapılabilir----------------------------------------------------------------------------------------------------------------------*/
static veri elemanlarını herhangi bir karışıklık durumuna karşı nitelendirmek gerekir.
/*---------------------------------------------------------------------------------------------------------------------- Yukarıdaki durumun benzeri static veri elemanları için de oluşabilir. Bu durumda niteliklendirmek için sınıf ismi kullanılmalıdır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Sample.setX(10);
System.out.printf("Sample.x=%d%n", Sample.x);
}
}
classSample {
publicstaticintx;
publicstaticvoidsetX(intx)
{
Sample.x = x;
}
}
this referansı ile zincir çağırma kavramı (fluent pattern)
/*---------------------------------------------------------------------------------------------------------------------- Bir sınıfın metotlarının aynı nesnenin referansı üzerinden zincir biçiminde aşağıdaki gibi çağrılabilmesi için sınıfın tasarımında this referansı kullanılmalıdır (fluent pattern)----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample();
s.foo(19).bar(45).tar(3).zar(6).foo(7);
System.out.println(s.getVal());
}
}
classSample {
privateintm_val;
publicintgetVal()
{
returnm_val;
}
publicSamplefoo(intval)
{
m_val += val;
returnthis;
}
publicSamplebar(intval)
{
m_val *= val;
returnthis;
}
publicSampletar(intval)
{
m_val /= val;
returnthis;
}
publicSamplezar(intval)
{
foo(-val);
returnthis;
}
}
Aşağıdaki örnekte MutableIntValue sınıfı zincir çağırmaya uygun olarak yazılmıştır
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte MutableIntValue sınıfı zincir çağırmaya uygun olarak yazılmıştır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.MutableIntValue;
classApp {
publicstaticvoidmain(String[] args)
{
MutableIntValuemutableIntValue = newMutableIntValue();
mutableIntValue.setVal(10).add(20).multiply(4).increment();
System.out.println(mutableIntValue.getVal());
}
}
/*---------------------------------------------------------------------------------------------------------------------- Java'da kullanılmayan bir bytle'lık gözeneğin adresini temsil eden (null address) null isimli bir anahtar sözcük bulunur. null bir referansa atanabilir. Bir referansa null atandığında o referansın içerisnde bir adres vardır. Ancak bu adres kullanılmadığı için bir nesnenin adresi değildir. Anahtar Notlar: Modern sistemlerde null adres olarak sıfır numaralı gözeneğin adresi alınır. Yani bu sistemlerde sıfır numaralı adres herhangi bir bölge olarak kullanılmaz. Java programcısı için kullanılmayan adresin hangisi olduğu önemsizdir. null sabitinin varlık sebebi zaten bu adresi temsil etmektir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.Random;
classApp {
publicstaticvoidmain(String[] args)
{
Strings = null;
Samplesample = null;
Randomr = null;
intval = null; //error
}
}
classSample {
//..
}
Bir referansın default değeri null'dır.
/*---------------------------------------------------------------------------------------------------------------------- Bir referansın default değeri null'dır. Hatırlanacağı gibi Singleton kalıbının bir implementasyonunda null'ın default değer olup olmamasına göre kod yazılmıştır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Singletons = Singleton.getInstance();
Singletonk = Singleton.getInstance();
System.out.println(s == k);
}
}
classSingleton {
//...privatestaticSingletonms_instance;
privateSingleton()
{}
publicstaticSingletongetInstance()
{
if (ms_instance == null)
ms_instance = newSingleton();
returnms_instance;
}
}
Bir referansın null olması durumunda o referansın ilişkin olduğu türün elemanlarına erişim exception fırlatır
/*---------------------------------------------------------------------------------------------------------------------- Bir referansın null olması durumunda o referansın ilişkin olduğu türün elemanlarına erişim durumunda exception oluşur----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = null;
s.foo();
}
}
classSample {
publicvoidfoo()
{
}
}
null referans bir referansı nesneden kopartmak için de kullanılabilir
/*---------------------------------------------------------------------------------------------------------------------- null referans bir referansı nesneden kopartmak için de kullanılabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample();
//...Samplek = s;
s = null;
//...
}
}
classSample {
publicvoidfoo()
{
}
}
Bir referansa null atanması o referansın gösterdiği nesnenin garbage collected olacağı anlamına gelmez
/*---------------------------------------------------------------------------------------------------------------------- Bir referansa null atanması o referansın gösterdiği nesnenin garbage collected olacağı anlamına gelmez----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample();
//...Samplek = s;
s = null;
k.foo(10);
System.out.printf("val:%d%n", k.val);
}
}
classSample {
publicintval;
publicvoidfoo(intval)
{
this.val = val;
}
}
null referans bir metodun geri dönüş değerinin referans olması durumunda kontrol amaçlı kullanılabilir
/*---------------------------------------------------------------------------------------------------------------------- null referans bir metodun geri dönüş değerinin referans olması durumunda kontrol amaçlı kullanılabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.ArrayUtil;
importjava.util.Random;
classApp {
publicstaticvoidmain(String[] args)
{
Randomr = newRandom();
for (inti = 0; i < 30; ++i) {
intn = r.nextInt(30);
int[] a = ArrayUtil.getRandomArray(r, n, 1, 100);
ArrayUtil.display(2, a);
Integerresult = Util.max(a);
if (result != null)
System.out.printf("En büyük eleman:%d%n", result);
elseSystem.out.println("Boş dizi geçildi");
System.out.println("//////////////////////////");
}
}
}
classUtil {
publicstaticIntegermax(int [] a)
{
if (a.length == 0)
returnnull;
intresult = a[0];
for (inti = 1; i < a.length; ++i)
if (result < a[i])
result = a[i];
returnresult;
}
}
Bir metodun referans parametresi için null kontrolü yapılabilir.
/*---------------------------------------------------------------------------------------------------------------------- Bir metodun referans parametresi için null kontrolü yapılabilir. Bazı durumlarda metodun referans parametresine null geçilmesi metodun ilgili referansa ilişkin nesneyi kendisi yaratacağı anlamına geleblir. Aşağıdaki örneği inceleyiniz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.ArrayUtil;
importjava.util.Random;
importjava.util.Scanner;
classApp {
publicstaticvoidmain(String[] args)
{
Scannerkb = newScanner(System.in);
for (inti = 0; i < 5; ++i) {
System.out.print("min değerini giriniz:");
intmin = Integer.parseInt(kb.nextLine());
System.out.print("max değerini giriniz:");
intmax = Integer.parseInt(kb.nextLine());
System.out.print("Dizinin eleman sayısını giriniz:");
intn = Integer.parseInt(kb.nextLine());
int[] a = Util.getRandomArray(null, n, min, max);
if (a == null) {
System.out.println("min ve max değerleri geçersiz değerlerdir");
continue;
}
ArrayUtil.display(2, a);
System.out.println("//////////////////////////");
}
}
}
classUtil {
publicstaticint [] getRandomArray(Randomr, intn, intmin, intmax)
{
if (n <= 0 || min >= max)
returnnull;
if (r == null)
r = newRandom();
int [] a = newint[n];
for (inti = 0; i < n; ++i)
a[i] = r.nextInt(max - min) + min;
returna;
}
}
null referans "değer atanmamış hatası" nı gidermek için kullanılabilir.
/*---------------------------------------------------------------------------------------------------------------------- null referans aşağıdaki örnekte olduğu gibi derleyicinin "değer atanmamış bir değişkeni kullanıyor olabilirsin" error'unu vermemesi için kullanılabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.Scanner;
classApp {
publicstaticvoidmain(String[] args)
{
Scannerkb = newScanner(System.in);
System.out.print("Bir sayı giriniz:");
inta = Integer.parseInt(kb.nextLine());
if (a < 1 || a > 3) {
System.out.println("Geçersiz değer");
System.exit(-1);
}
Unitunit = null;
switch (a) {
case1:
unit = newUnit(23);
break;
case2:
unit = newUnit(78);
break;
case3:
unit = newUnit(90);
break;
}
System.out.println(unit.getVal());
}
}
classUnit {
privatefinalintm_val;
publicUnit(intval)
{
m_val = val;
}
publicintgetVal()
{
returnm_val;
}
}
Algoritma analizi
/*---------------------------------------------------------------------------------------------------------------------- Algoritma bir problemin çözümüne ulaştıran doğru adımlara denir. Algoritmaların anlatımında belli bir formal yöntem yoktur. Genel olarak sahte kodlar (pseudo codes) kullanılarak algoritmalar açıklanır. Algoritmalar genel olarak dilden bağımsızdır. Ancak ince noktalara gelindiğinde algorimalar da dile bağımlı hale gelebilir. Örneğin, bir dilde belli bir işi daha kolay yapan deyimler olabilir. Bu durumda algoritma o deyimlerle gerçekleştirilebilir. Bir algoritmanın işleyişinin masaya yatırılıp incelenmesine "algoritma" analizi denir. Bu analiz genel olarak matematiksel yöntemlerle yapılır. İki algoritmanın karşılaştırılabilmesi için kullanılan ölçüye algoritmanın karmaşıklığı denir. Algoritmanın karmaşıklığı için iki temel ölçüt vardır: Hız (speed), kaynak kullanımı (resource usage) Burada baskın ölçüt hızdır. Yani daha çok algoritmalar hızlarına göre karşılaştırılır. Ancak bazı durumlar da (bu durumlar hıza göre az olsa da kritik durumlardır) kaynak kullanımı da gözönüne alınabilir. Şüphesiz iki ölçütün de en iyi olduğu durum her zaman mümkün olmaz. Örneğin aşağıdaki gibi yazılmış en büyük sayıyı bulma algoritması için: int [] a = {...}; int max; int n; n = a.length; max = a[0]; for (int i = 1; i < n; ++i) if (max < a[i]) max = a[i]; Burada toplam işlemin sayısı max = a[i] işlemine bağlıdır. Bu algoritmada dizinin elemanları bilinmeden bu anlaşılamaz. İşte algoritma analizinde işlemlerin sayısını hesaplarken üç durum dikkate alınabilmektedir: 1. Ortalama durum (average case condition) 2. En kötü durum (worst case condition) 3. En iyi durum (best case condition) En kötü durum olabileceklerin en kötüsüdür. Yukarıdaki örnekte en kötü durumda max = a[i] işlemi "n - 1" kez yapılır. Ortalama durum tüm olasılıkların ortalamasını temsil eder. Yukarıdaki örnekte ortalama max = a[i] işlemi "(n - 1) / 2" kez yapılmaktadır. En iyi durum olabileceklerin en iyisini temsil eder. Yani max = a[i] işlemi hiç yapılmaz. Algoritma analizinde en iyi durumun çok yararı yoktur. Çünkü aşırı iyimserlik programlamada çok değerli değildir. En kötü durum senaryosu önemlidir. Çünkü bazı durumlarda en kötü duruma hazırlıklı olmak gerekebilir. En önemli durum ortalama durumdur. Ortalama durum algoritmanın karakterini en iyi belirten durumdur. Genellikle algoritma ele alınırken hem ortalama durum hem de en kütü durum analizi yapılır. Algoritmalarda işlem sayısına ilişkin analizler çok kolay değildir. Özellikle ortalama durumu hesaplamak bazen çok karmaşık olabilmektedir. Algoritmaları pratik bakımdan kıyaslamak için asimtotik notasyonlardan yararlanılmaktadır. Bu notasyonların en yaygın kullanılanı "Big O" notasyondur. Bu notasyonda belli karakterdeki algoritmalar aynı kategoride kabul edilir. Eğer algoritma birden fazla kategoriye sahipse en kötü duruma ilişkin kategori gerçek kategorisini belirtir. Algoritmanın karmaşıklığının Big O notasyonu ile iyiden kötüye doğru ketegorileri şunlardır: - Polinomsal (polynomial) karmaşıklıklar O(1) -> sabit karmaşıklık: döngü yok. Örneğin:üçgenin alanının bulunması, dizinin bir elemanına erişim O(logn) -> logaritmik karmaşıklık (2 tabanında): Tek bir döngü var. Her adımda dönme sayısı yarı yarıya azalıyor. Örnek: binary search O(n) -> doğrusal karmaşıklık: Tek döngü. Örneğin: Bir dizinin elemanları toplamının bulunması, en büyük elemanın bulunması O(n * logn) -> nlogn karmaşıklı: İçiçe iki döngü var, birisinde her adımda dönme sayısı yarı yarıya azalıyor. Örneğin: quick sort algoritması O(n ^ 2) -> karesel karmaşıklık: İçiçe iki döngü var. Örneğin: Bir matrisin elemanları toplamının bulunması O(n ^ 3) -> küpsel karmaşıklık: İçiçe üç döngü var. Örneğin: Bir kübün üzerindeki noktaların toplamının bulunması, matrislerin çarpımı ... O(n ^ k) -> k-sal karmaşıklık (k sabit): İçiçe k tane döngü var - Polinomsal olmayan (non-polynomial) karmaşıklıklar O(k ^ n) -> Üstel karmaşıklık (k sabit): Örneğin: N elemanlı bir kümenin alt kümelerinin sayısının bulunması O(n!) -> Faktöriyel karmaşıklık. Örneğin: gezgin satıcı problemi Bir algoritma çoğu zaman herhangi bir karmaşıklıktayken bazı zamamnlar (bu az olmalıdır) üst bir karmaşıklıkta çalışır. Bu tarz karmaşıklıklara amortize edilmiş (amortized) karmaşıklıklar denir. Örneğin, bir algoritma çogu zaman O(1) karmaşıklıkta iken bazı zamanlar O(n) karmaşıklıkta çalışıyor ise amortize edilmiş sabit zamanlı (amortized constant time) karmaşıklık denir----------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte a dizisinin elemanlarını da içeren 10 elemanlı bir dizi elde edilmiştir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.ArrayUtil;
classApp {
publicstaticvoidmain(String[] args)
{
int [] a = {1, 2, 3, 4, 5};
int [] b;
b = ArrayUtil.enlarge(a, 10);
ArrayUtil.display(a);
ArrayUtil.display(b);
}
}
Dizinin mantıksal büyümesi
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte a dizisi eski diziden koparılıp yeni bir diziyi görmesi sağlandığından mantıksal olarak büyütülmüştür----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.ArrayUtil;
classApp {
publicstaticvoidmain(String[] args)
{
int [] a = {1, 2, 3, 4, 5};
a = ArrayUtil.enlarge(a, 10);
ArrayUtil.display(a);
}
}
Dinamik dizi veri yapısı
/*---------------------------------------------------------------------------------------------------------------------- Dinamik büyüyen dizi veri yapıları diziyi eklenen eleman sayısı kadar büyütmez. Dizinin büyütülmesi gerektiği durumda büyütme işlemini biraz fazlaca yapar. İşte bu tarz veri yapılarında dizinin uzunluğuna capacity değeri denir Ancak dizide mantıksal tutulan elaman sayısına size denir. size hiç bir zaman capacity değerinden büyük olamaz. Capacity değeri size değerinden büyük veya size değerine eşit olabilir.----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.Scanner;
classApp {
publicstaticvoidmain(String[] args)
{
DeviceAppapp = newDeviceApp(2);
app.run();
}
}
classDeviceApp {
privateDevice [] m_devices;
privateintm_index;
privatevoidenlargeDevices(intnewLength)
{
Device [] temp = newDevice[newLength];
for (inti = 0; i < m_index; ++i)
temp[i] = m_devices[i];
m_devices = temp;
}
publicDeviceApp(intn)
{
m_devices = newDevice[n];
}
publicvoidrun()
{
Scannerkb = newScanner(System.in);
for (;;) {
System.out.print("İsim giriniz:");
Stringname = kb.nextLine();
if (name.equals("quit"))
break;
System.out.print("Host giriniz:");
Stringhost = kb.nextLine();
System.out.print("Port giriniz:");
intport = Integer.parseInt(kb.nextLine());
if (m_index == m_devices.length)
this.enlargeDevices(m_devices.length * 2);
m_devices[m_index++] = newDevice(name, host, port);
System.out.printf("Capacity:%d%n", m_devices.length);
System.out.printf("Size:%d%n", m_index);
}
System.out.println("Final:");
System.out.printf("Capacity:%d%n", m_devices.length);
System.out.printf("Size:%d%n", m_index);
//...
}
}
classDevice {
privateStringm_name;
privateStringm_host;
privateintm_port;
publicDevice(Stringname, Stringhost, intport)
{
m_name = name;
m_host = host;
m_port = port;
}
publicStringgetName()
{
returnm_name;
}
publicvoidsetName(Stringname)
{
m_name = name;
}
publicStringgetHost()
{
returnm_host;
}
publicvoidsetHost(Stringhost)
{
m_host = host;
}
publicintgetPort()
{
returnm_port;
}
publicvoidsetPort(intport)
{
m_port = port;
}
publicStringtoString()
{
returnString.format("[%s]%s:%d", m_name, m_host, m_port);
}
}
ArrayList sınıfında capacity kullanılır ancak nasıl büyütüleceği söylenmez.
/*---------------------------------------------------------------------------------------------------------------------- ArrayList sınıfında capacity kullanılır ancak nasıl büyütüleceği söylenmez. Bu sebeple ArrayList sınıfının capacity değerini veren bir metodu yoktur. Dolayısıyla capacity bilgisi gereken kodlarda Vector sınıfı ile örnekler yazılacaktır. Vector sınıfı burada anlatılmayan farklılıkları ve capacity bilgisini elde edebilmemiz dışında ArrayList ile aynı düşünülebilir----------------------------------------------------------------------------------------------------------------------*/
ArrayList/Vector sınıfının default ctor elemanı capacity değerini 10(on) alarak nesnenin yartılmasını sağlar.
/*---------------------------------------------------------------------------------------------------------------------- ArrayList/Vector sınıfının capacity parametreli ctor elemanı Şüphesiz bu metot gerektiğinde capacity değerini de uygun şekilde (amortized constant time) büyütür. Vector sınıfının default capacity büyütmesi var olan capacity değerinin iki katı olacak şekildedir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.Vector;
classApp {
publicstaticvoidmain(String [] args)
{
Vectornumbers = newVector(6);
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
for (inti = 0; i < 12; ++i)
numbers.add(i * 10);
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
numbers.add(67);
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
}
}
ArrayList/Vector sınıfının index parametreli add metodu araya ekleme yapmak için kullanılabilir.
/*---------------------------------------------------------------------------------------------------------------------- ArrayList/Vector sınıfının index parametreli add metodu araya ekleme yapmak için kullanılabilir. Bu metot O(n) karmaşıklıktadır. Şüphesiz bu metot gerektiğinde capacity değerini uygun şekilde büyütür----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.Vector;
classApp {
publicstaticvoidmain(String [] args)
{
Vectornumbers = newVector(6);
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
for (inti = 0; i < 12; ++i)
numbers.add(0, i * 10);
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
numbers.add(2, 67);
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
}
}
ArrayList sınıfının get metodu ile bir indeksteki eleman elde edilebilir
/*---------------------------------------------------------------------------------------------------------------------- ArrayList sınıfının get metodu ile bir indeksteki eleman elde edilebilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.ArrayList;
classApp {
publicstaticvoidmain(String [] args)
{
ArrayListnumbers = newArrayList(6);
for (inti = 0; i < 12; ++i)
numbers.add(i * 10);
intsize = numbers.size();
for (inti = 0; i < size; ++i) {
intval = (int)numbers.get(i);
System.out.printf("%d ", val);
}
System.out.println();
}
}
ArrayList sınıfının get metoduna pozitif ya da negatif bakımdan sınırlar dışında bir indeks numarası verildiğinde exception oluşur.
/*---------------------------------------------------------------------------------------------------------------------- ArrayList sınıfının get metoduna pozitif ya da negatif bakımdan sınırlar dışında bir indeks numarası verildiğinde exception oluşur. Burada sınır size olarak düşünülmelidir. Capacity değeri yani dizinin asıl uzunluğu içsel olarak kullanılır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.ArrayList;
classApp {
publicstaticvoidmain(String [] args)
{
ArrayListnumbers = newArrayList(10);
for (inti = 0; i < 12; ++i)
numbers.add(i * 10);
intsize = numbers.size();
intval = (int)numbers.get(13);
System.out.println(val);
}
}
ArrayList sınıfı for-each döngü deyimi ile dolaşılabilir (iterable) bir sınıftır.
/*---------------------------------------------------------------------------------------------------------------------- ArrayList sınıfı for-each döngü deyimi ile dolaşılabilir (iterable) bir sınıftır. for-each döngü deyiminin her adımında içeride tutulan eleman sırasıyla elde edilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.ArrayList;
classApp {
publicstaticvoidmain(String [] args)
{
ArrayListnumbers = newArrayList(6);
for (inti = 0; i < 10; ++i)
numbers.add(i * 10);
for (Objectobj : numbers) {
intval = (int)obj;
System.out.printf("%d ", val);
}
System.out.println();
}
}
Aşağıdaki örnekte quit girilene kadar alınan isimler bir listeye atılmıştır.
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte quit girilene kadar alınan isimler bir listeye atılmıştır. Bu işlemden sonra liste for-each döngü deyimi ile dolaşılarak elemanlar elde edilmiştir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.ArrayList;
importjava.util.Scanner;
classApp {
publicstaticvoidmain(String [] args)
{
ArrayListnames = newArrayList();
Scannerkb = newScanner(System.in);
for (;;) {
System.out.print("İsim giriniz:");
Stringname = kb.nextLine();
if (name.equals("quit"))
break;
names.add(name);
}
for (Objectobject : names) {
Stringname = (String)object;
System.out.println(name.toUpperCase());
}
}
}
ArrayList sınıfının isEmpty metodu ile ArrayList'in boş olup olmadığı test edilebilir
/*---------------------------------------------------------------------------------------------------------------------- ArrayList sınıfının isEmpty metodu ile ArrayList'in boş olup olmadığı test edilebilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.ArrayList;
importjava.util.Scanner;
classApp {
publicstaticvoidmain(String [] args)
{
ArrayListnames = newArrayList();
Scannerkb = newScanner(System.in);
for (;;) {
System.out.print("İsim giriniz:");
Stringname = kb.nextLine();
if (name.equals("quit"))
break;
names.add(name);
}
if (!names.isEmpty()) {
for (Objectobject : names) {
Stringname = (String) object;
System.out.println(name.toUpperCase());
}
}
elseSystem.out.println("Hiç isim girilmedi");
}
}
ArrayList sınıfının set metodu, birinci parametresi ile aldığı index numarasındaki elemanı ikinci parametresi ile aldığı elaman ile değiştirir.
/*---------------------------------------------------------------------------------------------------------------------- ArrayList sınıfının set metodu, birinci parametresi ile aldığı index numarasındaki elemanı ikinci parametresi ile aldığı elaman ile değiştirir. Metot eski elemana ilişkin referansı döndürür. Metoda pozitif ya da negatif bakımdan sınırlar dışında index numarası gönderildiğinde exception fırlatır.----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.ArrayList;
classApp {
publicstaticvoidmain(String [] args)
{
ArrayListnumbers = newArrayList();
for (inti = 0; i < 20; ++i)
numbers.add(i * 10);
System.out.println("Elements:");
for (Objecto : numbers) {
intval = (int)o;
System.out.printf("%d ", val);
}
System.out.println();
intoldValue = (int)numbers.set(2, 67);
System.out.println("Elements:");
for (Objecto : numbers) {
intval = (int)o;
System.out.printf("%d ", val);
}
System.out.println();
System.out.printf("Old Value:%d%n", oldValue);
}
}
ArrayList/Vector sınıfının toString metodu ile ArrayList'in elemanları [] içerisinde virgülle ayrılacak şekilde bir String elde edilebilir.
/*---------------------------------------------------------------------------------------------------------------------- ArrayList/Vector sınıfının toString metodu ile ArrayList'in elemanları [] içerisinde virgülle ayrılacak şekilde bir String elde edilebilir. Bu String'in oluşturulma detayları ileride ele alınacaktır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.Vector;
classApp {
publicstaticvoidmain(String [] args)
{
Vectornumbers = newVector();
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
for (inti = 0; i < 15; ++i)
numbers.add(i * 10);
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
System.out.println(numbers.toString());
}
}
ArrayList/Vector sınıfının clear metodu tüm elemanları siler.
/*---------------------------------------------------------------------------------------------------------------------- ArrayList/Vector sınıfının clear metodu tüm elemanları siler. Bu sınıflarda silme yapan metotlar yani size değerini azaltan metotlar capacity değerini değiştirmezler----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.Vector;
classApp {
publicstaticvoidmain(String [] args)
{
Vectornumbers = newVector();
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
for (inti = 0; i < 15; ++i)
numbers.add(i * 10);
System.out.println(numbers.toString());
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
numbers.clear();
System.out.println(numbers.toString());
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
}
}
ArrayList/Vector sınıfının remove metodu parametresi ile aldığı index numarasına ilişkin elemanı siler.
/*---------------------------------------------------------------------------------------------------------------------- ArrayList/Vector sınıfının remove metodu parametresi ile aldığı index numarasına ilişkin elemanı siler. Metot sildiği elemana ilişkin referansı döndürür. Metoda pozitif ya da negatif bakımdan sınırlar dışında index numarası gönderildiğinde exception fırlatır. Dizide eleman silmek O(n) karmaşıklıktadır.----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.Vector;
classApp {
publicstaticvoidmain(String [] args)
{
Vectornumbers = newVector();
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
for (inti = 0; i < 15; ++i)
numbers.add(i * 10);
System.out.println(numbers.toString());
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
intoldVal = (int)numbers.remove(2);
System.out.println(numbers.toString());
System.out.printf("Old value:%d%n", oldVal);
System.out.printf("Capacity:%d%n", numbers.capacity());
System.out.printf("Size:%d%n", numbers.size());
}
}
ArrayList/Vector sınıfının trimToSize metodu capacity değerini size değerine getirir.
/*---------------------------------------------------------------------------------------------------------------------- ArrayList/Vector sınıfının trimToSize metodu capacity değerini size değerine getirir. Bu metodun sürekli çağrılmaması gerekir. Çünkü bu metot da O(n) karmaşıklıktadır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.StringUtil;
importjava.util.Random;
importjava.util.Vector;
classApp {
publicstaticvoidmain(String [] args)
{
Vectorpasswords = newVector();
Randomr = newRandom();
for (inti = 0; i < 15; ++i)
passwords.add(StringUtil.getRandomTextTR(r, 10));
System.out.println(passwords.toString());
System.out.printf("Size:%d%n", passwords.size());
System.out.printf("Capacity:%d%n", passwords.capacity());
passwords.trimToSize();
System.out.printf("Size:%d%n", passwords.size());
System.out.printf("Capacity:%d%n", passwords.capacity());
}
}
Vector sınıfının trimToSize metodu size sıfır ise capacity değerini de sıfır yapar
/*---------------------------------------------------------------------------------------------------------------------- ArrayList/Vector sınıfının ensureCapcity metodu capacity değerini aşağıdaki şekilde değiştirmekte (veya değiştirememekte) kullanılabilir: - Yeni capacity değeri var olan capacity değerinden küçük veya eşitse değişiklik yopmaz - Yeni capacity değeri var olan capacity değerinin artması gereken değerinden küçük veya eşitse artması gereken değere çeker - Yeni capacity değeri var olan capacity değerinin artması gereken değerinden büyükse yeni capacity değerine çeker----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.StringUtil;
importjava.util.Random;
importjava.util.Vector;
classApp {
publicstaticvoidmain(String [] args)
{
Vectorpasswords = newVector();
Randomr = newRandom();
for (inti = 0; i < 15; ++i)
passwords.add(StringUtil.getRandomTextTR(r, 10));
System.out.printf("Size:%d%n", passwords.size());
System.out.printf("Capacity:%d%n", passwords.capacity());
passwords.ensureCapacity(17);
System.out.printf("Size:%d%n", passwords.size());
System.out.printf("Capacity:%d%n", passwords.capacity());
passwords.ensureCapacity(30);
System.out.printf("Size:%d%n", passwords.size());
System.out.printf("Capacity:%d%n", passwords.capacity());
passwords.ensureCapacity(87);
System.out.printf("Size:%d%n", passwords.size());
System.out.printf("Capacity:%d%n", passwords.capacity());
}
}
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/