Java에서 array를 List로 바꾸려면 어떻게 해야될까?

for문을 쓰는것이 당연하지만 왠지 복잡해 보이고..

Arrays.asList가 List를 리턴한다. 간단해 보이므로 이걸쓰자.

 

하지만 잘 살펴보지 않으면 여기에 함정이 있다.

다음 코드를 살펴보자.

 

Integer[] arr = new Integer[]{1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(arr);
list.add(6);
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.base/java.util.AbstractList.add(AbstractList.java:153)
	at java.base/java.util.AbstractList.add(AbstractList.java:111)
	at ArrayAsList.main(ArrayAsList.java:10)

흠..List인데 add가 안된다?

 

Arrays.asList 구현을 보자.

public static <T> List<T> asList(T... a) {
	return new ArrayList<>(a);
}

ArrayList리턴인데 머지..?

 

하지만 이건 java.util.ArrayList 가 아니다.(머여그럼)

바로 밑에 코드를 보면 Arrays 안에 private static 으로 구현되어있다. 생성자로 array를 받고 전역변수로 array로 관리한다.

 

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }
        ...
 }

 

그리고 add 메소드가 구현이 안되어있다. AbstractList 로 따라가다 보면 다음과 같이 UnsupportedOperationException을 발생시키는걸 볼 수 있다.

public void add(int index, E element) {
	throw new UnsupportedOperationException();
}

Arrays.asList 에서 나오는 결과로는 동적 List를 만들 수 없다. 

 

동적 List로 만들고 싶다면 오브젝트를 생성하여 반복문으로 새로 값을 할당해야 한다.

'Java' 카테고리의 다른 글

[Java] Wrapper 클래스 Cache  (0) 2020.06.18
[Java] Java에서 Map 관련 Iterate(반복문) 방법  (0) 2016.11.10

 

 

 

다음 코드를 보자.

Integer a = 1000;
Integer b = 1000;

System.out.println(a==b);

출력 : false

 

매우 당연하다. a와 b는 값이 같아도 다른 오브젝트이기 때문이다.

 

그럼 다음 코드를 보자.

Integer a = 127;    
Integer b = 127;

System.out.println(a==b);

출력 : true

 

잉? 당연히 출력이 false일 것이라 예상했지만 아니다.

Java의 일부 Wrapper 클래스들은 내부에서 캐시값을 가지고 있다.

 

Integer 클래스 내부 코드를 살펴보자.

private static class IntegerCache {
	static final int low = -128;
	static final int high;
	static final Integer cache[];

	static {
	// high value may be configured by property
		int h = 127;
		String integerCacheHighPropValue =
		VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
		if (integerCacheHighPropValue != null) {
			try {
				int i = parseInt(integerCacheHighPropValue);
				i = Math.max(i, 127);
				// Maximum array size is Integer.MAX_VALUE
				h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
			} catch( NumberFormatException nfe) {
				// If the property cannot be parsed into an int, ignore it.
			}
		}
		high = h;

		cache = new Integer[(high - low) + 1];
		int j = low;
		for(int k = 0; k < cache.length; k++)
			cache[k] = new Integer(j++);

		// range [-128, 127] must be interned (JLS7 5.1.7)
		assert IntegerCache.high >= 127;
	}

	private IntegerCache() {}
}

private statc으로 IntegerCache 클래스를 가지고 있다.

-128 ~ 127 까지의 오브젝트를 array로 생성해 놓고 있다.

 

high값은 "java.lang.Integer.IntegerCache.high" 세팅으로 수정이 가능하다.

 

그리고 오브젝트를 생성할 때 사용한다.

public static Integer valueOf(int i) {
	if (i >= IntegerCache.low && i <= IntegerCache.high)
	return IntegerCache.cache[i + (-IntegerCache.low)];
	return new Integer(i);
}

 

그러면 캐싱을 왜 사용할까?

 

Java Language Specification(JLS)의 Boxing Conversion 에서 다음과 같이 나와있다.

 

If the value p being boxed is an integer literal of type int between -128 and 127 inclusive (§3.10.1), or the boolean literal true or false (§3.10.3), or a character literal between '\u0000' and '\u007f' inclusive (§3.10.4), then let a and b be the results of any two boxing conversions of p. It is always the case that a == b.

위의 문구에서 숫자 -128~127 까지의 reference가 동일하다고 얘기하고 있다. (boolean 포함, character도 0~127)

 

Ideally, boxing a primitive value would always yield an identical reference. In practice, this may not be feasible using existing implementation techniques. The rule above is a pragmatic compromise, requiring that certain common values always be boxed into indistinguishable objects. The implementation may cache these, lazily or eagerly. For other values, the rule disallows any assumptions about the identity of the boxed values on the programmer's part. This allows (but does not require) sharing of some or all of these references. Notice that integer literals of type long are allowed, but not required, to be shared.
This ensures that in most common cases, the behavior will be the desired one, without imposing an undue performance penalty, especially on small devices. Less memory-limited implementations might, for example, cache all char and short values, as well as int and long values in the range of -32K to +32K.

 

간단히 요약하면 이상적으로는 모든 primitive 값이 boxing이 되면 같은 reference를 가져야 하지만 실제적으로 이것을 모든 부분에 구현하는것은 어렵기 때문에 그래서 일단 일정 범위에 대해서만 java에서 적용하고 실제 구현에 있어서 프로그래머가 알아서 하라고 하는것이다.

'Java' 카테고리의 다른 글

Arrays.asList는 동적 List가 아니다.  (0) 2020.06.19
[Java] Java에서 Map 관련 Iterate(반복문) 방법  (0) 2016.11.10

chrome://settings/content/sound

불러오는 중입니다...

 

주소로 가서 설정하면 됩니다.




안드로이드에서는 Alpha 채널을 이용해 컬러에 투명도를 표시 할 수 있다. colors.xml 에 컬러값을 지정 해 놓고 쓰면된다.


1
2
<color name="black">#000000</color>
<color name="black">#99000000</color> 
cs


2번째에서 앞의 99가 Alpha 값이다. Hex값이기 때문에 얼마나 투명한지 정도를 알려면 계산이 좀 들어가야하는데 귀찮으니 정리해놓았다.

100% — FF
99% — FC
98% — FA
97% — F7
96% — F5
95% — F2
94% — F0
93% — ED
92% — EB
91% — E8
90% — E6
89% — E3
88% — E0
87% — DE
86% — DB
85% — D9
84% — D6
83% — D4
82% — D1
81% — CF
80% — CC
79% — C9
78% — C7
77% — C4
76% — C2
75% — BF
74% — BD
73% — BA
72% — B8
71% — B5
70% — B3
69% — B0
68% — AD
67% — AB
66% — A8
65% — A6
64% — A3
63% — A1
62% — 9E
61% — 9C
60% — 99
59% — 96
57% — 94
56% — 91
56% — 8F
55% — 8C
54% — 8A
53% — 87
52% — 85
51% — 82
50% — 80
49% — 7D
48% — 7A
47% — 78
46% — 75
45% — 73
44% — 70
43% — 6E
42% — 6B
41% — 69
40% — 66
39% — 63
38% — 61
37% — 5E
36% — 5C
35% — 59
34% — 57
33% — 54
32% — 52
31% — 4F
30% — 4D
28% — 4A
28% — 47
27% — 45
26% — 42
25% — 40
24% — 3D
23% — 3B
22% — 38
21% — 36
20% — 33
19% — 30
18% — 2E
17% — 2B
16% — 29
15% — 26
14% — 24
13% — 21
12% — 1F
11% — 1C
10% — 1A
9% — 17
8% — 14
7% — 12
6% — 0F
5% — 0D
4% — 0A
3% — 08
2% — 05
1% — 03
0% — 00










자바의 String.contain() 처럼 php에서도 단어가 포함되었는지 찾는 함수가 있다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sentence = '문자열 찾기';
 
$search = '찾기';
 
 
 
if(strpos($sentence , $search)!==false){
 
echo '찾음';
 
} else {
 
echo '못찾음';
 
}
cs



strpos() 는 포함된 단어의 시작 포지션을 리턴해 준다. 주의해야 할 점은 꼭 !== 를 써야한다는 것이다. strpos() 문서에 나와있듯이 함수가 찾는 단어가 없을 경우 FALSE를 리턴 하지만 non-Boolean FALSE를 리턴하는 경우도 있다(포지션이 0인 경우).












FPP - "처음사용자용" 


실물 패키지 형태 (USB포함) 

시리얼이 메인보드에 귀속되지 않아 여러 PC 옮겨가며 사용가능 합니다. PC변경 후 사용가능 합니다.

(2개 이상 PC 동시에 사용 불가능)




ESD 

기능은 FPP와 동일하지만 실물 패키지아 아닌 디지털 다운로드 입니다.

이메일로 시리얼만 받습니다.




DSP

업체용 시리얼로 설치시 메인보드에 귀속됩니다. 추후 변경 불가입니다. 




OEM 

많이 들어본 단어죠? 대기업, 중소기업 브랜드 PC용 입니다. 역시 구매가 불가능하며  메인보드에 귀속됩니다.







가격은 FPP>=ESD>DSP>OEM 이고 


현재 ESD버전은 MS 홉페이지에서 ₩172,000에 판매중입니다.(Windows 10 Home, 2017년 7월)


FPP는 오픈마켓 등을 통해 구매가능합니다. (보통 할인이 있는 경우가 많음)


DSP 버전은 PC조립 판매업체나 오픈마켓을 통해 대개 10~13만원 정도에 판매되어지고 있습니다.


주의하실 점!


가끔 정상적이지 않은 가격으로 키를 파는 사람들이 있습니다. 


이베이 등 여러 곳에서 3만원, 5만원 등 엄청쌉니다. 여기에 혹하시지 마시고 제대로된 가격으로 구매하세요.


이는 대부분 BizSpark로 얻은 키, OEM 키를 불법적으로 판매하는 경우입니다.


BizSpark는 기간한정이고 시간이 지난 후 인증이 풀려 없어집니다.


OEM은 일반사용자가 구매할 수 없기 때문에 언제든지 인증이 풀릴 수 있습니다.


크랙이나 다른 경로로 쓰겟다고 하시는 분들은 본인 선택이지만 정품을 구매하여 사용하는 습관을 들이도록 합시다. 



'프로그램' 카테고리의 다른 글

크롬 탭 음소거 사라졌을때 설정법  (0) 2019.06.22
네이버 캡쳐 프로그램 다운로드  (0) 2017.03.27



이제는 받을 수 없는 네이버 캡쳐 프로그램


네이버가 툴바에 포함시키고 다운 막아버림 ㄷㄷ


업데이트도 없고 광고도 없다.




※ 네이버캡쳐 설치 후에 네이버툴박스, 네이버업데이터


꼭 삭제하시기 바랍니다.







naver_capture.exe












현재 앱의 Hash Key를 가져오는 메소드


페북이나 카카오톡 등 연동할 때 쓰자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void getAppKeyHash() {
        try {
            PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md;
                md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String something = new String(Base64.encode(md.digest(), 0));
                DLog.w("Hash key", something);
            }
        } catch (Exception e) {
            DLog.e("name not found", e.toString());
        }
    }
cs




+ Recent posts