Android 개발 인터뷰에서 면접관이 가장 많이 묻는 질문은 무엇입니까?

저자: 샤오 시에

"어떤 수준의 Android 인터뷰를 보셨나요?"

[외부 링크 이미지 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다(img-3Pc1xZw5-1691675604271)(//upload-images.jianshu.io/upload_images/ 24388310-aa3c732481d0749f.png?imageMogr2 /auto-orient/strip|imageView2/2/w/1200)]

며칠전 Zhihu에서 본 핫토픽인데 보고나서 관심이 생겨서 스크롤을 내려보니 아래 답변들이 모두 제 인터뷰 경험, 인터뷰 소감, 인터뷰 후 반성 및 결론에 대해 공유하고 이야기하는 내용이었습니다. 인터뷰. 훌륭하다고 말합시다.

그런데 질문을 던진 시간이 3년 전인 것을 보면 3년이 지난 지금도 폭염이 계속되는 이유는 무엇일까요?

이 질문에 대해 생각하면서 Q&A 전체를 읽었습니다. 질문 시간을 생각하고, 받은 푸쉬 시간을 생각했다. 그제서야 '황금구은10기 구직 황금기'가 다가오고 있다는 걸 실감했고, 대부분의 프로그래머들이 의욕을 불태우고 있어 3년 전 질의응답이 다시 한 번 폭염을 일으켰다.

생각해보세요. 저는 3년 동안 인터넷 업계에 있었고 지난 몇 년 동안 10개 이상의 주요 회사를 인터뷰했습니다. 그리고 제의를 받은 회사는 샤오미, 넷이즈, 시나 3개인데 지금은 ByteDance에서 낚이고 있으니 기회가 된다면 함께 갑시다! 내가 받은 제안의 평균 수준은 약 24K-27K(1-2년 근무)이며, 나는 인터뷰 리뷰의 물결을 만들기 위해 질문과 답변의 기회를 잡았다.

1. A사

1. 프로젝트 소개

예전에 뉴스 앱을 만들었는데, 오늘의 헤드라인을 조금 모방한 수준입니다!

기본 기술:

  • 시작 페이지 로드(3초, 건너뛰려면 클릭) - 활동 관련

  • 사용자 등록/로그인 - SQLite 애플리케이션

  • 뉴스 카테고리를 표시하는 가로 슬라이딩 목록 - TabLayout, ViewPager, FragmentPagerAdapter 적용

  • 하단 메뉴바 전환 - Fragment 적용

  • 홈 페이지(뉴스 목록 표시) - ListView

  • 설정(애플리케이션 종료, 로그아웃, 캐시 지우기) - 활동 관리, SharePreference

  • 내(계정 보안, 뉴스 즐겨찾기) - SQLite

  • 뉴스 목록 풀다운, 슬라이드 업으로 새로 고침 - 사용자 정의 ListView

  • 뉴스를 하나씩 수집, 뉴스 삭제 - SharePreference

  • 모조 UI 인터페이스 - 다양한 컨트롤 적용

  • 뉴스 세부 정보를 보려면 클릭하십시오 - WebView

  • 사용자 인터페이스 아바타 교체 기능 - Android 런타임 권한, 멀티미디어, Content Provider

2. 활동 수명 주기에 대해 간단히 말씀해 주시겠습니까?

다음 그림은 Activity 상태 전이 다이어그램입니다.

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다(img-vJsbyXJt-1691675604273)(//upload-images.jianshu.io/upload_images/24388310 -a2e09c41ef074d05?imageMogr2/auto -orient/strip|imageView2/2/w/795)]

3. RecyclerView 캐싱 메커니즘에 대해 간략하게 설명해주세요.

RecyclerView는 Android 애플리케이션에서 목록 보기를 대체했다고 할 수 있습니다. RecyclerView의 유연하고 조립된 설정 및 다중 캐싱 메커니즘은 Android 개발에서 다중 목록의 다양한 요구에 적응할 수 있습니다.

RecyclerView의 캐싱 메커니즘에 대해서는 항상 조금 생각해보고 싶었는데, 간단히 말해서 RecyclerView는 listview의 캐싱 메커니즘에 2개의 캐싱 지원 레이어가 있습니다.Listview는 2레벨 캐시이고 RecyclerView는 4단계 캐시(물론 대부분의 경우 L3 캐시).

4. 목록 보기에서 각 항목에는 애니메이션(gif) 보기가 있으며 항목의 버튼을 클릭하면 애니메이션(gif)이 재생됩니다. 애니메이션이 재생 중일 때 목록 보기를 슬라이딩하면 가끔 항목이 잘못 배치되는 이벤트가 발생합니다. 이유가 무엇입니까?

이는 아이템 재사용의 문제이며, 비동기 로딩으로 인해 이미지 위치가 잘못되었습니다.

5. 활동에 핸들러가 여러 개인 경우 메시지 메시지가 혼동됩니까? 현재 메시지를 처리하는 핸들러를 구별하는 방법은 무엇입니까?

Handler가 메시지를 보내는 혼란이 없을 것이며 그 때 이 핸들러에 의해 처리될 것입니다. 메시지를 보낼 때 Handler 자체인 대상을 바인딩하며, 핸들러가 메시지를 처리하기 위해 dispatchMessage(msg)를 호출해야 하는 경우 Handler는 메시지를 보낼 때 바인딩된 핸들러입니다.

메시지를 보내는 데 어떤 방법을 사용하든 결국 enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis)를 호출하여 메시지를 보냅니다.

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
        msg.target = this;
        if (mAsynchronous) {
            msg.setAsynchronous(true);
        }
        return queue.enqueueMessage(msg, uptimeMillis);
    }

이것은 현재 핸들러입니다. 메시지를 처리하기 위해 Handler가 필요한지, 어떤 Handler가 사용되는지를 살펴보면 아래에 주요 소스 코드가 게시되어 있습니다.

public static void loop() {
  ......
        for (;;) {
            Message msg = queue.next(); // might block
            if (msg == null) {
                // No message indicates that the message queue is quitting.
                return;
            }

            // This must be in a local variable, in case a UI event sets the logger
         ......
            if (traceTag != 0 && Trace.isTagEnabled(traceTag)) {
                Trace.traceBegin(traceTag, msg.target.getTraceName(msg));
            }

            final long dispatchStart = needStartTime ? SystemClock.uptimeMillis() : 0;
            final long dispatchEnd;
            try {
                msg.target.dispatchMessage(msg);
                dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
            } finally {
                if (traceTag != 0) {
                    Trace.traceEnd(traceTag);
                }
            }
           ......

            msg.recycleUnchecked();
        }
    }

이것은 메시지를 반복할 때 코드의 일부이며, 메시지 처리 코드는 msg.target.dispatchMessage(msg)이며 여기서 대상은 당시 메시지를 보낸 핸들러입니다.

2. B사

1. 프로젝트 소개

그냥 말했다, 더 이상 소개

2. Java의 강한 참조, 약한 참조 및 소프트 참조에 대한 이해에 대해 알려주십시오.

강한 참조: 이러한 종류의 참조는 우리가 평소에 자주 사용하는 참조 유형입니다.JVM은 기본적으로 이 유형의 참조를 사용합니다.예를 들어 A a = new A(), 이것은 강한 참조입니다.

이 유형에서는 메모리 공간이 부족할 때 JVM이 오히려 OOM을 수행하여 프로그램이 중단되고 비정상적으로 종료되며 임의로 재활용하지 않고 개체가 참조되지 않는 경우에만 JVM에서 재활용합니다.

소프트 참조: SoftReference sr = new SoftReference(new A())와 같이 이러한 종류의 참조를 사용할 수 있습니다. JVM에 충분한 메모리가 있는 경우 sr.get()을 사용하여 이 유형의 참조 객체인 이 객체를 가져올 수 있습니다. 그는 재활용되며 JVM의 메모리가 부족하면 이러한 개체가 재활용됩니다. 이 참조 유형은 캐시로 사용하기에 적합합니다.

약한 참조: 이러한 종류의 참조는 여기에서 사용할 수 있습니다. WeakReference wr = new WeakReference(new A()); 그런 다음 wr.get()을 사용하여 이 객체를 가져옵니다. 이러한 종류의 참조 유형 객체는 수명 주기가 더 짧습니다. , 가비지 컬렉터가 JVM의 메모리 영역을 스캔하고 이러한 유형의 참조 객체를 발견하면 이러한 객체는 현재 메모리가 충분한지 여부에 관계없이 재활용됩니다.

3. 교착상태란? 필요한 조건은 무엇입니까? 그것을 피하는 방법?

  • 교착 상태는 여러 프로세스가 다른 프로세스가 보유한 리소스를 무한정 기다리는 상황입니다. 둘 이상의 프로세스가 동시에 여러 개의 상호 배타적인 리소스 사용을 요청하면 교착 상태가 발생할 수 있습니다.

  • 상호 배타적 조건: 즉, 한 번에 하나의 프로세스만 자원을 사용할 수 있고 다른 프로세스는 다른 프로세스에 할당된 자원에 액세스할 수 없습니다.

  • 보류 및 대기: 프로세스가 다른 프로세스가 리소스를 해제하기를 기다리는 경우 리소스를 보류하는 것으로 알려져 있습니다.

  • 비선점형 : 자신에게 할당된 자원을 다른 프로세스가 강제로 점유할 수 없음

  • 순환 대기: 닫힌 체인이 있고 체인의 프로세스가 체인의 다음 프로세스에 필요한 리소스를 하나 이상 점유합니다.

교착 상태 회피:

  • 뮤텍스 방지: 금지 불가능

  • 소유 및 대기 방지: 프로세스가 모든 리소스에 한 번에 적용되도록 합니다.

  • 비선점 방지: (1) 자원 점유 프로세스가 추가로 자원을 신청하면 거절한 후 현재 점유 중인 자원을 강제로 해제한다. 필요한 경우 다시 신청할 수 있습니다. (2) 프로세스가 다른 프로세스가 점유하고 있는 자원을 요청할 때 운영체제는 자원 점유 프로세스를 선점할 수 있다. 리소스 해제를 요청합니다. 두 번째 옵션은 두 프로세스의 우선 순위가 다른 경우에만 사용할 수 있습니다.

  • 순환 대기 방지: 리소스 액세스의 선형 시퀀스 정의

4. TCP와 UDP의 차이점

  1. 연결 기반 대 비연결.

  2. TCP에는 더 많은 시스템 리소스가 필요하고 UDP에는 더 적은 리소스가 필요합니다.

  3. UDP 프로그램 구조는 비교적 간단합니다.

  4. 스트림 모드(TCP) 및 데이터그램 모드(UDP).

  5. TCP는 데이터 정확성을 보장하고 UDP는 패킷을 잃을 수 있습니다.

**5. 알고리즘 질문: **비어 있지 않은 문자열 s와 비어 있지 않은 단어 목록을 포함하는 사전 wordDict가 주어지면 s가 사전에 나타나는 하나 이상의 단어로 분할될 수 있는지 여부를 결정합니다.

기계적 인조 인간

1. 사용자 지정 보기를 위해 다시 작성해야 하는 메서드는 무엇입니까?

(실제 필요와 결합하여 슬라이드가 필요한 경우 onTouchEvent를 다시 작성하고, 자체 레이아웃을 제어해야 하는 경우 onMeasure, onLayout을 다시 작성하십시오.)

2. 레이아웃을 최적화하는 방법은 무엇입니까?

3. 핸들러 메시지 메커니즘

4. UI 최적화에 대한 이해에 대해 이야기하십시오.

3. C사

1. 프로젝트 소개

그냥 말했다, 더 이상 소개

2. 플러그인에 대해 배운 적이 있습니까? 플러그인과 컴포넌트화의 차이점은 무엇입니까?

3. Application Context를 사용할 때와 Activity Context를 사용할 때

4. 메인 스레드에서 UI를 업데이트해야 합니까? 하위 스레드에서 업데이트할 수 있습니까?

5. Kotlin은 Java와 어떻게 호환됩니까?

실제로 많은 재생 후 신중한 친구들은 Dachang 인터뷰가 Java 기반 및 Android 기반에 더 많은 관심을 기울이고 있음을 알 수 있으므로 인터뷰 전에 지식의 물결을 정리할 필요가 있습니다.

지식을 샅샅이 뒤져 전자책, 인터뷰 노트 등 학습 문서도 많이 준비했는데, 이 노트에는 다양한 지식 포인트(많은 내용 포함: Android 기본 사항, Java 기본 사항, Android 소스 코드 관련 분석, 일반적인 일부 포함)가 포함되어 있습니다. 기본 질문 등):https://qr18.cn/CgxrRy

추천

출처blog.csdn.net/weixin_61845324/article/details/132219366