Android 면접 경험 공유하기 [선택]

藏色散人
풀어 주다: 2020-07-31 17:07:00
앞으로
4862명이 탐색했습니다.

추천: "2020 안드로이드 면접 질문 모음 [Collection]"

저는 연초부터 많은 기업의 면접에 참여했고, 여러 대기업은 물론 다른 기업에서도 제의를 받았습니다. 경험을 요약하는 것은 과거에 대한 검토이자 요약이기도 합니다.

1. 이력서

프로그래머 이력서에 대한 안내는 인터넷에 많이 있으니 여기서는 반복하지 않겠습니다. 인터넷에서 다른 전문가들의 요약을 찾아보시고 본인의 상황에 맞게 수정하시면 됩니다. 몇 가지 제안 사항이 있습니다:

1. 프로그래머는 디자이너나 제품 운영자와 다릅니다. 이력서의 성공 여부는 기술 면접관에게 달려 있으며, 그들이 중요하게 생각하는 것은 프로젝트 경험입니다. 콘텐츠 및 기술에 대한 설명입니다.

2. 스킬 설명에는 자신이 알고 깊이 이해한 내용만 작성하세요. 새로운 기술이나 인기 있는 프레임워크를 적절하게 추가할 수 있지만, 소스 코드를 읽을 시간이 없다면 이해가 필요합니다. , 온라인에서 전문가의 요약을 많이 읽을 수 있습니다.

3. 어떤 기술이 사용되었는지, 어떤 디자인 패턴이 사용되었는지, 최적화된 데이터 비교, 자세한 요약 등 프로젝트 경험에 키워드를 추가해 보세요. 예를 들어 단순히 프로젝트의 내용(즉, 제품 관리자의 설명)을 소개하는 것이 아닌, 성능 최적화는 UI 성능 최적화, 메모리 최적화, 데이터베이스 최적화, 네트워크 최적화, 전력 소모 최적화 등으로 나누어집니다. 1. 문제를 발견하는 방법, 2. 문제를 해결하는 방법, 3. 해결 효과의 비교라는 측면에서 설명할 수 있습니다. 간단한 예를 들면 - UI 최적화, UI에서 어떤 문제가 발생하는지(고착되고 원활하지 않음), 문제를 찾는 방법(모바일 개발자 권한>GPU 오버드로잉 발견 레이어 문제, TraceView CPU 사용량 분석)을 살펴볼 수 있습니다. 문제 해결 방법(레벨 낮추기, 사용자 정의 View 도면 문제 등) 문제 해결 후 다시 성능을 비교해 보세요.

2. 스킬 리저브

(1) Java

1. HashMap과 Hashtable의 차이점은 무엇인가요?

이에 대한 소스 코드를 읽어야 합니다! 소스코드를 보세요! 소스코드를 보세요! 정말 참을 수 없다면 온라인에 접속하여 다른 사람들의 분석을 읽어보세요. 간략한 요약:

1. HashMap은 null Key를 지원하지만 Hashtable은 이를 허용하지 않습니다. 이는 HashMap이 null을 특별히 처리하고 null인 hashCode 값을 0으로 설정하여 해시 테이블의 0번째 버킷에 저장하기 때문이다.

2. HashMap은 스레드로부터 안전하지 않습니다. HashMap에서 스레드 안전을 구현하는 방법은 Map map = Collections.synchronziedMap(new HashMap())입니다. HashMap의 기본 길이는 16입니다. 확장은 원본의 2배입니다. 기본 길이는 11이고 확장은 원래 2n+1

4입니다. HashMap은 AbstractMap을 상속합니다. HashMap은 ConcurrentHashMap과 비교하고, HashMap은 SparseArray와 비교합니다. ArrayList와 비교, ArrayList는 Vector

와 비교 2. Java 가비지 수집 메커니즘

은 JVM, 메모리 분할 - 메소드 영역, 메모리 힙, 가상 머신 스택(스레드 프라이빗), 로컬 메소드 스택(스레드 프라이빗), 프로그램을 이해해야 합니다. 카운터(스레드 프라이빗), 재활용 알고리즘 이해 - 표시 및 지우기 알고리즘, 도달성 분석 알고리즘, 마크 정렬 알고리즘, 복제 알고리즘 및 생성 알고리즘의 장점과 단점을 이해할 수 있습니다.

자세한 내용은 다른 학생들이 작성한 내용을 읽고 클릭하여 링크를 열 수 있습니다.

3. 클래스 로딩 메커니즘

이를 핫 리페어와 결합하여 심층적으로 이해할 수 있습니다. 링크를 열려면 클릭하세요

4. 스레드와 스레드 풀, 동시성, 잠금 및 일련의 문제

스레드 풀을 직접 구현하는 방법은 무엇인가요?

5. HandlerThread와 IntentService 이해하기

6. 약한 참조와 소프트 참조의 차이점

7. int와 Integer의 차이점은 무엇입니까

주로 값 전달과 참조 전달 문제를 고려합니다

8. 필기 프로듀서 /소비자 모델

(2) Android

1. Android 시작 모드

Activity 스택과 taskAffinity

1.Standard를 이해해야 합니다. 기본적으로 시스템은 시작할 때 하나 이상의 Activity 인스턴스를 기본으로 설정합니다

2.SingleTop: 스택 상단 재사용(스택 상단에 있는 경우) 라이프 사이클은 onCreate() 및 onStart()를 거치지 않지만 onNewIntent()가 호출되며 이는 메시지 세부 정보 페이지를 푸시하는 데 적합합니다. , 뉴스 푸시 세부정보 등 Activity;

3.SingleTask: 스택에 존재하는 경우 스택 내에서 재사용하면 해당 활동이 스택에서 튀어나와 스택의 맨 위에 있게 됩니다. 라이프 사이클은 SingleTop과 동일합니다. 앱 홈페이지는 기본적으로 다음을 사용합니다.

4.SingleInstance: 이것은 SingleTask의 향상된 버전입니다. 시스템은 시작할 스택에 대해 별도의 인스턴스를 엽니다. 이 스택은 시스템 알람 시계 및 WeChat의 화상 채팅 인터페이스와 같이 독립적으로 열 수 있는 앱과 새로 열리는 활동에 적합합니다. 감사합니다!

그 밖에도 SingleTask와 SingleInstance가 onActivityResult 콜백에 영향을 미치는 것 같아서 구체적인 이슈는 검색하지 않겠습니다.

Intent 역시 Action, Data, Category의 사용법과 기능은 물론 일반적으로 사용되는

Intent.FLAG_ACTIVITY_SINGLE_TOP
Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_CLEAR_TOP
로그인 후 복사

등의 이해가 필요합니다. 자세한 내용은 소스 코드를 살펴보시기 바랍니다.

2. 그리기 프로세스 보기

ViewRoot
-> performTraversal()
-> performMeasure()
-> performLayout()
-> perfromDraw()
-> View/ViewGroup measure()
-> View/ViewGroup onMeasure()
-> View/ViewGroup layout()
-> View/ViewGroup onLayout()
-> View/ViewGroup draw()
-> View/ViewGroup onDraw()
로그인 후 복사

무효화 방법을 살펴보겠습니다. 매개변수가 없는 경우 측정 및 레이아웃을 트리거하고, 로컬 재측정을 구현하고 전역을 방지하는 방법은 무엇인가요? 재측정 문제.

3. 이벤트 배포 메커니즘

-> dispatchTouchEvent()
-> onInterceptTouchEvent()
-> onTouchEvent()
requestDisallowInterceptTouchEvent(boolean)
로그인 후 복사

및 onTouchEvent(), onTouchListener, onClickListener

순서

4. 메시지 배포 메커니즘

이 테스트는 매우 일반적입니다. 소스코드를 꼭 살펴보세요. 코드가 많지 않습니다. 몇 가지 질문으로 살펴보겠습니다.

1. 스레드에 Looper가 하나만 있고 MessageQueue가 하나만 있는 이유는 무엇입니까?

2. 현재 스레드의 루퍼를 얻는 방법은 무엇입니까? 어떻게 달성됩니까? (ThreadLocal 이해)

3. 어떤 스레드라도 핸들러를 인스턴스화할 수 있나요? 제약이 있나요?

4.Looper.loop는 무한 루프입니다. 처리해야 하는 메시지를 가져올 수 없으면 차단됩니다. 그러면 UI 스레드에서 ANR이 발생하지 않는 이유는 무엇입니까?

5. Handler.sendMessageDelayed()는 지연을 어떻게 구현하나요? Looper.loop() 루프, Message=messageQueue.next() 및 MessageQueue.enqueueMessage() 분석과 결합됩니다.

5. AsyncTask 소스코드 분석

장단점 분석 인터넷에 너무 많아서 반복하지 않겠습니다.

6. 서비스가 종료되지 않도록 하는 방법은 무엇입니까? 프로세스가 종료되지 않았는지 확인하는 방법은 무엇입니까?

면접시 3개 회사에서 이 두 가지 질문을 했습니다.

7. 바인더 메커니즘, 프로세스 통신

Android에서 사용하는 프로세스 통신의 최하층은 기본적으로 Binder, AIDL, Messager, Broadcast 및 ContentProvider입니다. 별로 깊게 이해가 안되는데 최소한 ADIL 사용법과 Messager 사용법은 쓰고 읽을 수 있습니다. 또한, 직렬화(Parcelable 및 Serilizing)도 비교해야 합니다. Ren Yugang의 개발 탐구 책.

8. 동적 권한 적응 문제 및 스킨 변경 구현 원칙

이와 관련하여 Hongyang의 블로그 게시물을 살펴보겠습니다.

9. SharedPreference 원칙, 크로스 프로세스가 가능합니까? 달성하는 방법?

(3) 성능 최적화 문제

1. UI 최적화

a. RelativeLayout, LinearLayout, FrameLayout을 합리적으로 선택하면 하위 뷰 호출 onMeasure가 두 번 발생하며 레이아웃이 상대적으로 복잡한 경우 onMeasure는 상대적으로 복잡합니다. 비효율적입니다. LinearLayout은 가중치>0일 때 하위 뷰가 onMeasure를 두 번 호출하도록 허용합니다. LinearLayout 중량 측정 분포 원리.

b.

c를 사용하세요. 레이아웃 수준을 낮추려면 모바일 개발자 옵션>GPU 전환 그리기를 통해 볼 수 있습니다. 일반적으로 수준은 4개 레이어 내에서 제어됩니다. 5개 레이어를 초과하면 레이아웃을 재배치할지 고려해야 합니다.

d. View를 맞춤설정할 때 onDraw() 메서드를 재정의하고 이 메서드에서 새 객체를 생성하지 마세요. 그렇지 않으면 쉽게 GC가 발생하여 성능 저하가 발생합니다.

e ListView를 사용할 때는 contentView를 재사용하고 홀더를 사용해야 합니다. findViewById 로딩 뷰를 줄입니다.

f. 불필요한 배경 제거, getWindow().setBackgroundDrawable(null)

g. ImageView+TextView 레이아웃 대신 TextView의 leftDrawabel/rightDrawable 사용

2. 메모리 최적화

주로 OOM 및 잦은 GC 성능 저하를 방지하기 위해

a.Bitmap.recycle(),Cursor.close,inputStream.close()

b. 많은 수의 비트맵을 로드할 때 뷰 크기에 따라 비트맵을 로드하고 inSampleSize, RGB_565 인코딩 방법을 사용하십시오.

c. Handler, Thread, AsyncTask와 같은 내부 클래스 대신 정적 내부 클래스 + WeakReference를 사용하세요.

d. 스레드 풀을 사용하여 스레드를 관리하고 새 스레드를 방지하세요.

e 컨텍스트를 유지하려면 싱글톤을 사용하세요. 해제하거나 전역 컨텍스트를 사용하세요.

g. 속성 애니메이션으로 인해 메모리 누수가 발생합니다.

h. webView.removeAllViews() 및 webView.destory()

준비: LeakCanary를 사용하여 메모리 누수 감지

3. 응답 속도 최적화

액티비티가 5초 이내에 화면 터치 이벤트 및 키보드 입력 이벤트에 응답하지 못하면 ANR이 발생합니다. ANR을 10초 이내에 수행하지 않으면 BroadcastReceiver도 나타나게 되며, ANR을 피하기 위해 하위 스레드를 시작하여 시간이 많이 걸리는 작업을 수행할 수 있습니다. UI이므로 스레드 통신에는 핸들러 메시지 메커니즘, AsyncTask 및 IntentService가 필요합니다.

준비: ANR이 발생하면 adb pull data/anr/tarces.txt와 로그 분석

IV. 기타 성능 최적화

a. HashMap 대신 SparseArray를 사용하세요

c. . 스레드 풀 관리 스레드

d를 사용합니다. ArrayList 탐색은 foreach

e를 사용합니다. 문자열 접합을 위해 StringBuilder 및 StringBuffer를 우선시합니다.

g. 데이터베이스 저장은 일괄 삽입 + 트랜잭션을 사용합니다.

(4) 디자인 패턴

1. 싱글톤 패턴: 여러 가지 쓰기 방법이 있으며 장단점 분석이 필요합니다. 휘발성은 일반적으로 이중 확인 잠금에 사용되며 휘발성의 원리를 분석해야 합니다

2. 관찰자 모드: 손으로 작성할 수 있어야 합니다. 일부 면접관은 프로젝트에서 사용한 적이 있는지 묻습니다. 실제로 들어보지 못한 사람들을 위해 관찰자 모드를 사용하는 EventBus에 대해 이야기할 수 있습니다.

3. 어댑터 모드: 손으로 작성할 수 있어야 합니다. 일부 회사에서는 두 모드의 차이점이 무엇인지 묻습니다. 데코레이터 모드와 프록시 모드?

4. 빌더 모드 + 팩토리 모드: 손으로 작성할 수 있어야 합니다

5. 전략 모드: 자주 묻는 질문은 아니지만 일부 전자상거래 사람들이 묻습니다.

6.MVC, MVP, MVVM: 유사점과 차이점을 비교하고, 자신이 잘하는 것을 선택하여 집중하세요

(5) 데이터 구조

1. HashMap, LinkedHashMap, ConcurrentHashMap의 사용법과 원리의 차이점은 무엇입니까? 많은 회사에서 HashMap 원리를 테스트하고 이를 통해 중국 13억 인구의 연령 정렬 문제를 확장합니다. 인구와 연령에 해당하는 버킷의 개수, 동일한 연령, 동일한 해시의 문제는 유사합니다.

2. ArrayList와 LinkedList를 비교하면 비교적 간단합니다.

3. 균형 이진 트리, 이진 검색 트리 및 레드-블랙 트리에서도 테스트를 거쳤습니다.

4. Set 원리는 HashMap 테스트와 다소 유사합니다. 테스트는 일반적으로 사용되는 해시 알고리즘에 관한 것입니다. HashSet은 내부적으로 HashMap

을 사용합니다. (6) 알고리즘

알고리즘은 주로 시험 문제를 정리하는 데 사용됩니다.

(7) 소스 코드 이해

오픈 소스 프레임워크는 프로젝트에서 어느 정도 사용됩니다. 많은 회사에서는 원리와 소스 코드를 본 적이 있는지 묻기를 좋아합니다. 예를 들어 네트워크 프레임워크인 Okhttp가 가장 일반적으로 사용됩니다. . 이제 Retrofit+RxJava도 매우 인기가 있습니다.

1. 네트워크 프레임워크 라이브러리 Okhttp

okhttp 소스 코드를 읽어보세요. 여기에 포함된 몇 가지 주요 클래스와 연결 풀 및 인터셉터를 이해해야 합니다. 특정 도메인 이름의 URL에 헤더를 추가하는 방법을 질문받았는데, 코드를 직접 캡슐화한 경우 캡슐화된 Request에서 해결할 수도 있고, 인터셉터를 추가해서 인터셉터를 통해 할 수도 있습니다.

OKhttp를 설명하는 좋은 글 추천

2. 메시지 알림 EventBus

1. EventBus 원리: 소스 코드를 살펴보는 것이 좋습니다. 내용이 많지 않습니다. 내부 구현: 관찰자 모드 + 주석 + 반사

2. EventBus는 크로스 프로세스를 수행할 수 있나요? EventBus를 대체하는 방법(RxBus)

3. 이미지 로딩 라이브러리(Fresco, Glide, Picasso)

1. 프로젝트에서 어떤 이미지 로딩 라이브러리를 선택했나요? 왜 그것을 선택합니까? 다른 도서관이 나쁜가요? 이들 라이브러리의 차이점

2. Glide(약한 참조와 결합된 LruCache)와 같은 프로젝트의 이미지 라이브러리 원리를 선택하면 면접관이 LruCache의 원리에 대해 질문한 다음 LinkedHashMap의 원리에 대해 질문합니다. , 겹겹이 물어보시니 이해가 안되는 부분이 있으면 들어가서 읽어보시는 걸 추천드립니다. 예를 들어 MVC 디자인 패턴에서는 Fresco가 사용되는데, 5.0 이하에서는 공유 메모리를 사용합니다. Fresco에서 둥근 모서리를 만드는 방법은 무엇입니까? Fresco에서 캐시를 어떻게 구성하나요?

4. 메시지 푸시

1. 프로젝트에서 메시지 푸시를 직접 하신 건가요, 아니면 제3자를 이용하신 건가요? 오로라처럼. 다른 것을 사용해 보셨나요? 이들 회사의 장점과 차이점은 무엇이며, 이 회사를 선택한 이유는 무엇입니까?

2. 메시지 푸시의 원리는 무엇인가요? 하트비트 연결을 구현하는 방법은 무엇입니까?

5. TCP/IP, Http/Https

네트워크 영역에서는 이력서에 TCP/IP 프로토콜과 Http/Https 프로토콜에 대해 잘 알고 있다고 기재되어 있으면 반드시 물어보고 검증하겠습니다. 일반적으로 네트워크 계층 관계, TCP와 UDP의 차이점, TCP 3방향 핸드셰이크(명확하게 설명해야 하며 SYN, ACK와 같은 플래그 비트 및 메시지 구조에 익숙해야 함)에 대해 답변합니다. 네 번 흔드세요. 왜 세 번의 악수를 해야 할까요? DDoS 공격. 왜 세 번 악수하고 네 번 손을 흔들어야 합니까? Http 메시지 구조, 네트워크 요청 프로세스는 무엇입니까? HTTP와 HTTPS의 차이점은 무엇입니까? SSL/TLS는 암호화된 핸드셰이크를 어떻게 수행합니까? 인증서를 확인하는 방법은 무엇입니까? 대칭 암호화 알고리즘과 비대칭 암호화 알고리즘이란 무엇입니까? 익숙한 암호화 알고리즘을 선택하고 간략하게 소개하시겠습니까? DNS 확인은 어떻게 작동하나요?

6. 핫 업데이트, 핫 수리, 플러그인(이 영역은 더 까다로우며 일반적으로 수석 엔지니어가 이해해야 함)

classLoader 이해

7. 새로운 기술

RxJava, RxBus, RxAndroid, 이것은 내가 하는 일입니다. 면접 때 고려하고 싶은 것 회사에서 일할 때 그 패키지를 디컴파일해서 사용하는지 확인해 보면 되고, 사용된다면 면접 과정에서 필연적으로 물어보게 되겠지만, 강한 의지를 가지고 있는 학생들입니다. 학습능력은 비교라고 보시면 됩니다.

Retrofit, okhttp에 익숙한 학생들은 RxJava와 결합하는 것이 매우 멋지다고 들었습니다.

Kotlin

3. 마지막으로

이력서 홍보의 첫 번째 선택은 빠르고 효율적인 내부 추천입니다! 그러면 갈고리, 보스, 마이마이, 거리를 살펴보실 수 있습니다. 이력서에는 어떤 기술에 익숙하다면 반드시 익숙해야 한다고 나와 있습니다. 그렇지 않으면 질문을 받을 때 당황하지 않을 것입니다! 어떤 프로젝트를 진행하셨나요? 프로젝트 규모가 크지 않더라도 구현 원칙을 숙지하셔야 합니다! 자신이 담당하는 부분이 아니라면 동료들이 어떻게 구현했는지도 살펴볼 수 있습니다. 당신이 무엇을 했는지, 무엇을 알고 있는지는 프로젝트의 내용에 따라 폭이 달라집니다. 그러나 당신이 무엇을 했는지, 어떤 상태에 이르렀는지는 당신 개인의 학습 능력과 문제 해결에 대한 태도와 관련된 심층적인 문제입니다. 대기업은 깊이를 보고, 중소기업은 폭을 봅니다. 대기업 면접에서는 아는 내용을 알지만, 중소기업 면접에서는 무엇을 사용하는지 아는가가 취업매칭 정도입니다.

가고 싶은 회사를 몇 군데 선택한 후, 먼저 몇몇 작은 회사에 가서 면접 기술을 연습하고 배우세요. 요약하자면, 동료나 제품과 PK를 할 때 면접 분위기에 익숙해질 수 있습니다. . 현장에 도착하면 정말 다릅니다. 당신이 하는 모든 일을 어떻게 설명하는지는 확실히 학문적인 질문입니다!

면접시 예의를 갖추세요! 면접관이 당신을 존중하지 않고 설명을 자주 방해한다고 느끼거나, 그가 당신만큼 좋지 않고 그가 묻는 질문에 전문성이 부족하다고 느끼더라도, 지금 당신을 선택하고 기다리고 있는 사람이기 때문에 그를 존경해야 합니다. 결국 그 사람을 선택한 사람은 바로 당신입니다.

또한 문제를 천천히 설명해주세요! 한 번에 많은 말을 하지 마세요. 느림은 당신이 차분하고 자신감이 있다는 것을 보여주며, 다음에 더 잘 말할 수 있는 방법에 대해 생각할 시간이 아직 남아 있다는 것을 의미합니다. 요즘은 개발이 IDE에 너무 의존하다보니 단점이 생기더라구요.. 인터뷰에서 설명할 때 특정 방법을 어떻게 발음해야 할지 모르기 쉬운게 단점인데... 그래서 공통점을 알아야 합니다. 주요 클래스 이름, 메소드 이름, 키워드를 정확하게 읽어야 합니다. 이때 어떤 면접관이 "어떤 것을 말하는 거죠?"라고 조급해할 것입니다. 정확한 발음 + 차분한 설명 + 좋은 목소리는 확실히 플러스!

가장 중요한 것은 멘탈! 심리! 심리! 중요한 말을 세 번 말하세요! 인터뷰 시간도 매우 짧고, 상대방이 짧은 시간 안에 자신의 배경을 알아낸다는 것은 상대적으로 비현실적입니다. 따라서 때로는 시력을 기반으로 하는 경우도 있습니다.

모두가 적합하고 만족스러운 직업을 찾을 수 있기를 바랍니다! 화이팅!

위 내용은 Android 면접 경험 공유하기 [선택]의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:jianshu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿