2016.04.22 16:03

Sparse arrays can be used to replace hash maps when the key is a primitive type. There are some variants for different key/value type even though not all of them are publicly available.

Benefits are:

  • Allocation-free
  • No boxing


  • Generally slower, not indicated for large collections
  • They won't work in non-android project

HashMap can be replaced by the followings:

SparseArray          <Integer, Object>
SparseBooleanArray   <Integer, Boolean>
SparseIntArray       <Integer, Integer>
SparseLongArray      <Integer, Long>
LongSparseArray      <Long, Object>
LongSparseLongArray  <Long, Long>   //this is not a public class                                 
                                    //but can be copied from  Android source code 

In terms of memory here is an example of SparseIntArray vs HashMap for 1000 elements


class SparseIntArray {
    int[] keys;
    int[] values;
    int size;

Class = 12 + 3 * 4 = 24 bytes
Array = 20 + 1000 * 4 = 4024 bytes
Total = 8,072 bytes


class HashMap<K, V> {
    Entry<K, V>[] table;
    Entry<K, V> forNull;
    int size;
    int modCount;
    int threshold;
    Set<K> keys
    Set<Entry<K, V>> entries;
    Collection<V> values;

Class = 12 + 8 * 4 = 48 bytes
Entry = 32 + 16 + 16 = 64 bytes
Array = 20 + 1000 * 64 = 64024 bytes
Total = 64,136 bytes

Source: Android Memories by Romain Guy from slide 90.

The numbers above are the amount of memory (in bytes) allocated on heap by JVM. They may vary depending on the specific JVM used.

java.lang.instrument package contains some helpful methods for advanced operation like checking the size of an object with getObjectSize(Object objectToSize).

Extra info are available from official Oracle documentation

Class = 12 byte + (n instance variables) * 4 byte
Array = 20 byte + (n elements) * (element size)
Entry = 32 byte + (1st element size) + (2ns elements size)

After some googling I try to add some information to the already posted anwers:

Isaac Taylor made a performance comparision for SparseArrays and Hashmaps. He states that

the Hashmap and the SparseArray are very similar for data structure sizes under 1,000


when the size has been increased to the 10,000 mark [...] the Hashmap has greater performance with adding objects, while the SparseArray has greater performance when retrieving objects. [...] At a size of 100,000 [...] the Hashmap loses performance very quickly

An comparision on Edgblog shows that a SparseArray need much less memory than a HashMap because of the smaller key (int vs Integer) and the fact that

a HashMap.Entry instance must keep track of the references for the key, the value and the next entry. Plus it also needs to store the hash of the entry as an int.

As a conclusion I would say that the difference could matter if you are going to store a lot of data in your Map. Otherwise, just ignore the warning.

Posted by hoonihoon85 hoonihoon
2015.10.23 10:06

서버에서 응답받은 json 을 

오브젝트 리스트형태로 변경하는법!

ArrayList<MyObject> list = new Gson().fromJson(jsonString, new TypeToken<List<MyObject>>() { }.getType());

Posted by hoonihoon85 hoonihoon
2015.07.09 10:30
  1. SparseArray

    • SparseArray는 Map과 사용방법이 같으며, 안드로이드에서 제공한다. (안드로이드에서는 HashMap보다 SparseArray의 사용을 권장한다.)
    • SparseArray는 Key가 int, long, boolean 으로 Object가 아닌 Primitive type으로 강제되어 있으며, 이는 Integer, Float 등 Wrapper 클래스의 대한 boxing,unboxing 오버헤드와 Object의 대한 메모리 소모를 줄일 수 있다.
    • SparseArray의  Key는 유일해야 한다. 내부 소스를 잠시 본 결과 Key가 같은경우 데이터를 덮어 씌운다.
    • SparseArray는 찾기 알고리즘으로 binarySerch를 사용한다. 
    • 클래스 관계도를 보면 Collection을 구현하고 있지 않으므로 사용시 주의해야 한다.

  2. 결론 
    • 많은 데이터를 Map의 사용방법으로 쓰고자 할 때 SparseArray 사용을 생각해 보자.
    • HashMap을 사용하는 경우 Java가 지원하는 표준 컬렉션으로 이점이 아예없는 것이 아니기 때문에, 데이터의 크기가 많지 않은경우 HashMap을 사용하는 것도 나쁘지는 않다

출저 : http://freegramer.tistory.com/16  자유로운 프로그래머

'Android' 카테고리의 다른 글

[Android] SparseArray 와 HashMap 차이  (0) 2015.07.09
메모리누수 OutOfMemoryError  (0) 2013.11.25
Posted by hoonihoon85 hoonihoon
2014.12.03 16:37

아래와 같은 솔루션을 이용하자.

setonItemselectedListener 전에  setselection(position, false); 를 넣으면 된다.

The use of Runnables is completely incorrect.

Use setSelection(position, false); in the initial selection before setOnItemSelectedListener(listener)

This way you set your selection with no animation which causes the on item selected listener to be called. But the listener is null so nothing is run. Then your listener is assigned.

So follow this exact sequence:

Spinner s = (Spinner)Util.findViewById(view, R.id.sound, R.id.spinner);
s.setSelection(position, false);

Posted by hoonihoon85 hoonihoon
2014.12.03 14:32

volley post get 방법

출저  : http://stackoverflow.com/questions/16626032/volley-post-get-parameters

For the GET parameters there are two alternatives:

First: As suggested in a comment bellow the question you can just use String and replace the parameters placeholders with their values like:

String uri = String.format("http://somesite.com/some_endpoint.php?param1=%1$s&param2=%2$s",

StringRequest myReq = new StringRequest(Method.GET,

where num1 and num2 are String variables that contain your values.

Second: If you are using newer external HttpClient (4.2.x for example) you can use URIBuilder to build your Uri. Advantage is that if your uri string already has parameters in it it will be easier to pass it to the URIBuilder and then use ub.setQuery(URLEncodedUtils.format(getGetParams(), "UTF-8"));to add your additional parameters. That way you will not bother to check if "?" is already added to the uri or to miss some & thus eliminating a source for potential errors.

For the POST parameters probably sometimes will be easier than the accepted answer to do it like:

StringRequest myReq = new StringRequest(Method.POST,
                                        createMyReqErrorListener()) {

    protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
        Map<String, String> params = new HashMap<String, String>();
        params.put("param1", num1);
        params.put("param2", num2);
        return params;

e.g. to just override the getParams() method.

You can find a working example (along with many other basic Volley examples) in the Andorid Volley Examples project.

출저  : http://stackoverflow.com/questions/16626032/volley-post-get-parameters

Posted by hoonihoon85 hoonihoon
2014.11.27 15:10

주제:   안드로이드에서 로그인 관련 기능 중에 핸드폰 고유값을 서버에 전송할 수 있을지 알아 보았다.

분석:    아래와 같은 코드로 핸드폰 고유의 값 3가지를 가져올수 있다.

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

// IMEI 

Log.d("kth", "telephonyManager.getDeviceId(); " + telephonyManager.getDeviceId());

// 핸드폰 번호

Log.d("kth", "telephonyManager.getLine1Number(); " + telephonyManager.getLine1Number());

// UDID 

String deviceId= Secure.getString(G.mainactivity.getContentResolver(), Secure.ANDROID_ID); 

Log.d("kth", "deviceId: " + deviceId);

결론:  위에 사용 되는 코드는 모두 서버로 전송하면 안된다. 

[테스트 내역]

1. IMEI 수집시에 압수수색  http://www.asiae.co.kr/news/view.htm?idxno=2010083114402683628

    md5 암호화해도 불법.

2. 폰 번호 수집  불법  


3. 다비이스 고유값 (UDID)

   애플에서 UDID 값 수집시 마켓 등록 거절.

다른방법 :  GCM에서 생성해준 디바이스key 값을 이용하는 방법으로 선택.

                단, 어플을 지우고 새로 받으면 디바이스 key 값을 새로 받기 때문에 주의해야 한다.

Posted by hoonihoon85 hoonihoon
2014.07.10 13:45

Android Support Library 가 업데이트 되면서 v7 Support Library에 하위 호환성을 가진 ActionBarActivity 가 추가되었습니다. 이 라이브러리가 나오기 전에는 ActionBarShelock을 이용해서 3.0 미만 버전에서 ActionBar를 사용할 수 있었지만 v7 라이브러리를 사용하면 구글에서 제공해주는 라이브러리를 통해서 ActionBarShelock를 사용할 수 있습니다. v7 라이브러리 중 v7 appcompat을 사용하면 ActionBarActivity를 사용할 수 있습니다. 이것에 대해서 아래 Development 문서에 자세하게 나와 있습니다.

 v7 라이브러리 불러오는 법 : http://developer.android.com/tools/support-library/setup.html

 개발 문서에는 이클립스에서의 적용법과 Android Studio에서의 적용법 2가지가 나와있습니다. Android Studio에서의 적용법은 아주 간단하게 추가가 가능하지만 이클립스는 2개의 프로젝트를 필요로 합니다. 1 번째 프로젝트는 v7 appcompat 소스코드를 불러와서 라이브러리 형태로 만들고, 사용해야할 프로젝트를 생성하여 라이브러리를 include 하는 방식으로 사용하게 됩니다.

 저는 이클립스에서 라이브러리르 호출하는 방식으로 간단하게 액션바를 사용하는 예제를 작성합니다.

ActionBar Compat 예제 실행 및 Lib

 ActionBar Compat 예제를 불러오기 전에 안드로이드 SDK를 최신으로 업데이트하시면 됩니다. SDK Manager에서 Extras -> Android Support Library와 안드로이드 4.3 또는 4.2.2의 Sample Project를 다운로드 받으시면 됩니다.

 ActionBar Compat 예제를 먼저 불러와야 합니다. 불러오는 방법은 2가지가 있습니다. v7 라이브러리 사용법을 설명하는 개발 문서에서의 방법이 하나 있고, Sample Project를 불러와서 처리하는 방법 2가지가 있습니다. 이 글에서는 Sample Project를 불러와서 처리하는 방법을 설명하겠습니다.

 새로운 프로젝트 File -> New -> Other... 을 선택하시고, Android의 Android Sample Project를 선택합니다.

 최신으로 업데이트한 Android 4.3의 Sample Project를 선택하겠습니다.

 아래와 같이 Select Sample의 lagacy > ActionBarCompat 프로젝트를 선택합니다.

 생성된 프로젝트는 아래와 같습니다. 이 프로젝트를 불러와서 라이브러리 형태로도 사용이 가능하며, 해당 프로젝트에는 예제 코드가 들어있어 바로 실행도 가능합니다. ActionBarCompat 예제는 아래와 같이 파일이 추가되어있습니다.

 2.3.3에서 실행하면 아래와 같은 결과를 얻을 수 있고, 4.3에서 실행해도 동일한 UI의 ActionBar를 볼 수 있습니다.

라이브러리로 변경

 해당 프로젝트의 설정으로 들어갑니다. 오른쪽 마우스를 클릭하고, Properties를 선택하고, 메뉴에서 Android를 접속합니다.

 아래의 Is Library 를 선택하신다음 OK를 누르시면 라이브러리로 사용이 가능합니다.

새로운 프로젝트에 적용

 새로운 프로젝트에서 ActionBarActivity를 사용할 수 있습니다. 위에서 라이브러리로 사용하도록 설정하였으니 여기에서 그 라이브러리를 불러와서 사용하면 됩니다. 새로 만든 프로젝트에서 오른쪽 마우스의 Properties를 선택하고, Android 탭으로 이동합니다. 여기에서 Add... 버튼을 클릭합니다.

 위에서 적용한 라이브러리의 체크 하지 않으면 보이지 않으니 다시 라이브러리를 추가하시면 됩니다. ActionBarCompat를 선택하여 추가합니다.

 아래와 같이 추가되었습니다. 이제 Activity를 상속받는 Class를 ActionBarActivity로만 변경하시면 됩니다. 100% 코드 그대로 사용이 가능하기에 상속받는 메소드 명만 변경하면 됩니다.

ActionBarActivity 코드

// ActionBarActivity를 추가하면 아래와 같이 실행됩니다.
import com.example.android.actionbarcompat.ActionBarActivity;

 * Activity를 ActionBarActivity로만 변경하시면 됩니다.
 * 기존 코드 그대로 v7 라이브러리만 추가되면 모두 동일하게 사용할 수 있습니다.
 * /
public class MainActivity extends ActionBarActivity {

	protected void onCreate(Bundle savedInstanceState) {


ActionBarActivity를 적용한 예제

 2.3.3에서 ActionBarActivity를 적용한 예제입니다. 아래와 같이 실행되며, 4.3에서 실행해도 동일하게 볼 수 있습니다.


 ActionBarShelock를 적용하는 예제를 작성하려고 했으나 밀리고 밀려서.. 결국 v7 라이브러리의 ActionBar 적용법을 작성하게 되었습니다. ActionBarShelock를 적용하면 조금 많은 메소드가 변경이되어야 하지만 v7 라이브러리는 안드로이드의 기존 코드 그대로 쉽게 적용이 가능하다는 장점이 있습니다. C:\android-sdk-windows\extras\android\support\v7\appcompat\libs 의 경로에 보시면 android-support-v7-appcompat.jar 있기는 하지만 제가 실수를 한건지 동작하지 않아서 이 방법으로 글을 작성해보았습니다.

출저: http://thdev.net/m/post/487

'Android > good info' 카테고리의 다른 글

Android support v7-appcompt  (0) 2014.07.10
Posted by hoonihoon85 hoonihoon
2014.03.03 15:26


<?xml version="1.0" encoding="utf-8"?>


<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

출저: 옥수수농장 http://ocsoosoo.tistory.com/117

'Android > Animation' 카테고리의 다른 글

Listview Animation  (0) 2014.03.03
Posted by hoonihoon85 hoonihoon
2014.01.02 17:13

private ArrayList<ContentBoardVO> list;

JSONArray jArray = (JSONArray) jObject.get(ServiceConfig.DATA);

Gson gson = new Gson();

Type listType = new TypeToken<ArrayList<ContentBoardVO>>(){}.getType();

list = gson.fromJson(jArray.toString(), listType);

초 간 단 !!

Posted by hoonihoon85 hoonihoon
2013.12.16 17:26


회사에서 Tomcat 컨테이너를 이용해 서버를 하나 만들었다. 내부 IP만 연결되어 폰에서는 불가능하고,

에뮬레이터에서 접속을 해야만 했다.

그런데 웹브라우저에  http://localhost:8080 입력하면 페이지를 찾을 수 없다고 나온다.

해결방법: 접속하면 서버에 연결 된다.

Posted by hoonihoon85 hoonihoon