精华内容
下载资源
问答
  • Logging architecture sidecar container filebeat logs collection 业务迁移到 k8s 平台之后,业务的日志采集和处理是一个非常关键和棘手的问题,本章节通过两种比较常用的日志收集手段,向学员们展示如何做日志...

    4646d5ee613433148963d10f1873e691.gif

    2.27日分享介绍

    1.Go 日志基础

    2.Go 日志统一格式

    • JSON 格式的结构优势

    • 标准化 Golang 日志

    3.Go 日志上下文

    4.Go 日志对性能的影响

    • 不要在 Goroutine 中使用日志

    • 使用异步库

    • 使用严重等级管理日志

    5.集中化 Go 日志

    6.享受 Go 日志之旅

    直播时间:2.27日21:00-22:00

    文末添加小助手获取直播链接

    你是如何使用 Golang 日志监控你的应用程序的呢?Golang 没有异常,只有错误。因此你的第一印象可能就是开发 Golang 日志策略并不是一件简单的事情。不支持异常事实上并不是什么问题,异常在很多编程语言中已经失去了其异常性:它们过于被滥用以至于它们的作用都被忽视了。

    在进一步深入之前,我们首先会介绍 Golang 日志的基础,并讨论 Golang 日志标准、元数据意义、以及最小化 Golang 日志对性能的影响。通过日志,你可以追踪用户在你应用中的活动,快速识别你项目中失效的组件,并监控总体性能以及用户体验。

    一Go 日志基础

    71d1fa7d99ac0b206fa0a7897d921178.png使用 Golang “log” 库

    Golang  给你提供了一个称为 “log” 的原生日志库。它的日志器完美适用于追踪简单的活动,例如通过使用可用的选项在错误信息之前添加一个时间戳。 下面是一个 Golang 中如何记录错误日志的简单例子:
    package main    "errors"     "log"if b ==     return    return10    if err != 
    如果你尝试除以0,你就会得到类似下面的结果:
    2020/

    为了快速测试一个 Golang 函数,你可以使用 go playground。为了确保日志总是能轻易访问,可以把 log 写在一个文件:

    package main import (

    可以找到 Golang 日志的完整指南,以及“log”库内可用函数的完整列表。现在你就可以记录它们的错误以及根本原因啦。另外,日志也可以帮你将活动流拼接在一起,查找需要修复的错误上下文,或者调查在你的系统中单个  请求如何影响其它应用层和 API。为了获得更好的日志效果,你首先需要在你的项目中使用尽可能多的上下文丰富你的 Golang 日志,并标准化你使用的格式。这就是 Golang 原生库能达到的极限。使用最广泛的库是 glog 和 logrus。必须承认还有很多好的库可以使用。如果你已经在使用支持 JSON  格式的库,你就不需要再换其它库了,后面我们会解释。

    二 Go 日志统一格式

    71d1fa7d99ac0b206fa0a7897d921178.pngJSON 格式的结构优势

    在一个项目或者多个微服务中结构化你的 Golang 日志可能是最困难的事情,但一旦完成就很轻松了。结构化你的日志能使机器可读。灵活性和层级是JSON 格式的核心,因此信息能够轻易被人类和机器解析以及处理。 下面是一个使用 Logrus/Logmatic.io 如何用 JSON 格式记录日志的例子:
    package main import (    "github.com/logmatic/logmatic-go"    log.SetFormatter(&logmatic.JSONFormatter{})
    会输出结果:
    {
        "date":"2016-05-09T10:56:00+02:00",
        "float":1.1,
        "int":1, "level":"info",
        "message":"My first ssl event from golang", "String":"foo"
    }
    标准化 Golang  日志 同一个错误出现在你代码的不同部分,却以不同形式被记录下来是一件可耻的事情。下面是一个由于一  个变量错误导致无法确定 web 页面加载状态的例子。一个开发者日志格式是:
    'unknown error: cannot determine loading status from unknown error: missing or invalid arg value client'
    另一个人的格式却是:
    unknown 
    强制日志标准化的一个好的解决办法是在你的代码和日志库之间创建一个接口。这个标准化接口会包括  所有你想添加到你日志中的可能行为的预定义日志消息。这么做可以防止出现不符合你想要的标准格式  的自定义日志信息。这么做也便于日志调查。 由于日志格式都被统一处理,使它们保持更新也变得更加简单。如果出现了一种新的错误类型,它只需要被添加到一个接口,这样每个组员都会使用完全相同的信息。 最常使用的简单例子就是在Golang 日志信息前面添加日志器名称和id。你的代码然后就会发送“事件” 到你的标准化接口,它会继续讲它们转化为Golang 日志消息。
    // 主要部分,我们会在这里定义所有消息。
    }"arg." + name,
    }

    因此如果我们使用前面例子中无效的参数值,我们就会得到相似的日志信息:

    "2017-02-24T23:12:31+01:00" level=error msg=

    JSON 格式如下:

    "arg.client":null,

    三Go日志上下文

    现在 Golang 日志已经按照特定结构和标准格式记录,时间会决定需要添加哪些上下文以及相关信息。为了能从你的日志中抽取信息,例如追踪一个用户活动或者工作流,上下文和元数据的顺序非常重要。

    例如在 logrus 库中可以按照下面这样使用 JSON 格式添加 hostname、appname 和 session 参数:
    // 对于元数据,通常做法是通过复用来重用日志语句中的字段。
    元数据可以视为 javascript 片段。 为了更好地说明它们有多么重要,让我们看看几个 Golang 微服务中元数据的使用。 你会清楚地看到是怎么在你的应用程序中跟踪用户的。 这是因为你不仅需要知道一个错  误发生了,还要知道是哪个实例以及什么模式导致了错误。 假设我们有两个按顺序调用的微服务。 上下  文信息保存在头部(header)中传输:
    func helloMicroService1(w http.ResponseWriter, r *http.Request) 
    if
    "x-session", session)"x-track", track) 
    ….

    e9cef43662c6bb73e1d1d36ba6033676.png

    ......

    b801f5947682ffe6dafa0c4d6c036ded.gif

    51Reboot 最新 go 课程第5期开课了

    试听地址:https://ke.qq.com/course/599343

    51Reboot 最新 k8s 课程第3期,python自动化运维进阶课程第十期正在火热招生中

    详情扫码咨询

    442277fe1918c8becd94e3355928cbab.png

    51Reboot 已经上线 go 课程,k8s 课程,后面会持续上线 python 基础入门课程、python 自动化运维进阶课程。众多免费课程也将陆续发布。关注我们保持学习不断进步。

    0db061a5067d794f0cbdf8697164016f.png

    https://ke.qq.com/course/803805?taid=5266841086477277&tuin=31589b0e

    内容如下:

    第一阶段:Golang 语法入门

    • Golang 常用开发工具介绍

    • Golang 语法熟悉

    • Golang 处理命令行参数

    • Golang 实现用 GIF 动画展示程序并发架构

    第二阶段:Golang 微服务实战

    • 实现一个简单的基于 Telnet 聊天室服务

    • 基于 Socket 手写一个简单的 HTTP 服务器

    • Socket 版 echo 协议服务器

    第三阶段:Golang 高并发实战

    • 并发的 Clock 服务

    • 并发的 Echo 服务

    • 并发的 Web 爬虫

    • 聊天服务

    第四阶段:分布式高可用实战

    • 分布式高可用监控 OpenFalcon 架构讲解

    • 通过 cgo 调用 C 代码

    • 深度解析 Golang Net/RPC 框架

    • 用户自定义监控项

    • Go 写入 ElasticSearch

    第五阶段:运维监控系统实战

    • 手写监控系统

    • 完成监控 Agent 的数据上报逻辑:将本端的数据进行采集,然后将数据交个网络模块,再由网络模块将数据传输给 server 端。

    95f1f5fa79e3aeb5bfc3b6566803689f.png

    https://ke.qq.com/course/450881?quicklink=1

    内容如下:

    Docker V1 Summary

    Warm UP

    • 如何快速安装 LNMP 环境?

    • 如何快速做环境需要迁移?

    • 如何快速部署百台千台 LNMP 环境?

    • 开发、测试、运行环境如何统一?

    • 如何提高服务器资源利用率?如果服务混部,如何解决服务依赖各系统组件版本冲突问题?

    Docker Basic 20%

    • Installing Docker

    • Docker Client,Server and Daemon

    • Containers lifecycle

    • Docker layers and caching

    • Docker registry

    • Dockerfile

    • Docker Building

    • Expose and binding ports

    通过以上学习,学员可以从0到1了解 Docker,包括 Docker 的架构、Docker 的运行机制、生命周期以及 Docker 镜像等,从安装到运行,以及日常工作中常用的基本的操作,可以达到 Docker 入门级别。

    Docker Digging Deeper 30%

    • Docker Compose

    • Docker Storage Driver

    • Docker Application Data Managerment

    • Docker Networking model

    • Docker Cgroups and Namespace

    • Docker Security

    • Docker Garbage Collection

    Docker LXCFS 通过以上深入学习,学员们可以深度掌握 Docker 技术内幕,比如:Storage Driver、网络模型、隔离和资源限制以及安全等,这会对以后工作中,解决相关问题时打下非常好的基础。

    Docker CI/CD 25%

    • Docker Harbor

    • Jeckins

    • Gitlab

    • Project exercise with CI/CD

    通过对上述的学习, 学员们可以了解到如何在企业内部应用 Docker 技术,通过做一个 CI/CD 的 Demo,让学员们能够掌握什么是 CI/CD,Docker 技术在企业的落地也就是从这里开始的,所以,本章节的重要程度不言而喻,掌握了它,就可以达到企业级 Docker 应用工程师级别。

    Docker For Ops 25%

    • Docker Monitors

    • Debugging Running containers

    通过对上述的学习,以及在学习过程中一起踩过的坑,学员们可以进一步掌握Docker技术运用技能,当企业的业务无论是已经进行了容器化还是在容器化的路上,对于 Docker 容器化运维技术和调试技术的要求也是随之更加强烈,所以,掌握了它,才能说真正的达到了docker工程师级别。

    • 某业务采用 Nginx 作为服务器,在申请容器时,配置是两核 CPU,ngxin 并发配置:nginx worker_processes=auto,但是运行过程中应用的是宿主机的全部 CPU 核数,为什么?如何处理?

    reference

    Kubernetes V1 SummaryKubernetes Introduction

    • What is Kubernetes?

    • Kubernetes Basic Architecture

    • Master Components

    - etcd         - kube­apiserver        - kube­scheduler         - kube­Controller­Manager
    • Node Components

    - kubelet         - kube­proxy         - Container Runtime
    • Fast Install K8S Cluster

    • kubectl

    通过上面的学习,可以了解到为什么需要使用 Kubernetes ?结合 Kubernetes 的架构,学习到各核心组件的工作机制,包括:Master Components 和 Node Components;最后让我们快速安装一个 K8S Cluster,达到入门级效果,为下一步深入学习 K8S 奠定基础。

    Kubernetes Concepts and Operations

    • k8s Node and labels

    • The smallest deployable object pod

    • Defining a Deployment

    • Defining a Statefulset

    因为 Kubernetes 是一套容器编排、管理和调度系统,那么通过上面的学习,可以掌握 Kubernetes 在的内部是如何管理和调度容器的;另外,为什么要把容器封装到 pod 里?为什么需要 Deployment 和Statefulset?Deployment 和 Statefulset 有什么区别?分别应用于哪种场景?至此,对于 K8S 已经具备了一定的认识,下一步是如何与服务建立联系,并且对外发布服务。

    PERSISTENCE & STORAGE

    • Managing stateful applications

    • HostPath

    • Persistent volume

    • Persistent volume claim

    • Dynamic provisioning

    • Managing configurations

    • Managing secrets

    通过上述学习, 学员可以掌握 k8s 为了支持有状态服务以及在数据存储方面所做的技术实现,本阶段我们将结合开源存储系统 Ceph 进行项目练习;让学员可以深刻掌握 k8s 在数据存储方面的技术实践。


    Kubernetes Service、 Load Balancing and Networking

    • Services

    • kube­proxy

    • Endpoints

    • Ingress

    本章节主要讲解了 Kubernetes Service、LB 和 Networking,其目的就是为了让大家能够快速的进入自己的角色,因为我们前面做的一切工作,都是为了让我们的服务能够顺利的对外发布,那么至此,我们的第一目标达到了;但是,距离达到企业生产线上的服务要求标准还差的很远,这也是我们下一步要学习的;留下思考:企业生产线上的服务运行时要求标准都有哪些?该如何适配?提示:为了能够在企业对k8s技术进行落地,需要从如下几个方面进行考量,包括 Overlay 网络能否满足需求、数据存储能否满足需求、业务部署在 k8s 平台之后,如何发布更新?如何保障服务稳定性?业务日志如何采集和管理?监控能否做到位,k8s 平台自身的可用性和稳定性如何保证等等。

    Cluster Network

    • ovs

    • flannel

    • contiv

    • macVlan

    • calico

    通过上述的学习,学员可以掌握几种网络技术的工作原理,以及 CNI 的工作原理,并根据企业内部的技术积累和当前网络拓扑情况,应该如何做技术选型。


    DEPLOYMENT

    • Rolling updates

    • Deployment history & rollbacks

    • Selectors and labelsCanary deployments

    • Blue­green deployments

    通过上述学习, 学员可以掌握k8s在支持部署方面所做的技术实现,本章节可以让学员们了解多种部署模式;方便日后在企业中可以根据企业内部情况进行部署技术的选型。

    Logging architecture

    • sidecar container

    • filebeat logs collection

    业务迁移到 k8s 平台之后,业务的日志采集和处理是一个非常关键和棘手的问题,本章节通过两种比较常用的日志收集手段,向学员们展示如何做日志收集,以及采集过程中需要注意哪些问题。


    ADVANCED SCHEDULING

    • Scheduler architecture

    • Predicated and priorities

    • Attaching pods to nodes

    • Node affinity/anti­affinity

    • Pod affinity/anti­affinity

    • Taints and tolerations

    • Custom scheduler

    本章节会介绍在企业中常用的高级调度策略,比如如何修改预选,如何指定 node 调度 pod,如何打散 pod 调度,如何创建独立集群,以及如何自定义调度器等等,掌握这些技术之后,基本满足企业级容器调度要求了;至此,为了让业务迁入k8s平台,功能上已经达到了满足。


    K8S For OPS

    • Authentication

    • Authorization

    • Resource metrics API

    • Custom resource metrics

    • Api­server access limits

    • kubectl access limits

    • RBAC

    • Admission controllers

    • Security contexts

    • Pod Security PoliciesDebugging pods

    • Monitor

    K8S For OPS 放到了最后,说明其重要性,本章节将重点介绍如何运维 k8s 集群,如何调试业务容器和 debug 集群,如何限制 apiserver 的访问,监控的重要性更不言而喻了。

    faf79ba49fe935e091b58400746bbf47.png
    展开全文
  • 宝马屏幕共享功能怎么用

    千次阅读 2021-06-09 09:38:58
    【太平洋汽车网】使用宝马屏幕共享要先打开车载电脑多媒体功能,再选择屏幕共享手机投屏,勾掉宝马互联选项,然后再打开手机wifi,选择BMW输入密码即可使用屏幕共享。车手机互联映射即车机互联,就是将手机投屏到...

    【太平洋汽车网】使用宝马屏幕共享要先打开车载电脑多媒体功能,再选择屏幕共享手机投屏,勾掉宝马互联选项,然后再打开手机wifi,选择BMW输入密码即可使用屏幕共享。

    72bd2e5c4304b5d9a8853adcd10b5a59.gif

    车手机互联映射即车机互联,就是将手机投屏到车载显示器上,通过显示器可以操作手机里的导航,视频,音乐,游戏等功能,汽车手机映射功能的加入,可以方便利用车内大屏观看手机中的视频,以及使用手机里的导航。

    苹果手机可以通过iOS系统来实现车机互联(需iOS 8.3及以上系统)第一步,在Iphone手机中,打开Carplay的访问权限:设置>通用>访问限制中进行设置;第二步,使用 iPHone 原装USB数据线将手机与车机连接并配对;第三步,苹果手机连接后,自动弹出Carplay(中国版),如需退出,点击【GEELY】图标退出;第四步,连接成功后,打开手机里面的导航软件,输入目的地,此时车载屏幕就会同步手机上的导航内容。如果的的车上有HDMI(高清晰度多媒体接口)接口,那可直接拿一根MHL线接上手机,那也可以直接实现手机和车载屏幕共享。同理,车载导航也能够同步手机导航功能。(图/文/摄:太平洋汽车网 郭珊珊-兼职)

    展开全文
  • 以下内容来自转载(非常感谢此文第一作者):1.安卓各组件介绍一、ListView二、ActionBar三、Menu四、ViewPager 、Gallery五、GridView六、ImageView七、ProgressBar八...手机安全管家4.星座连萌5.玲闹铃6.魔乐盒7....

    以下内容来自转载(非常感谢此文第一作者):


    1.安卓各组件介绍

    2.GitHub上优秀Android开源项目

    3. Android开发神器

    1.Java基础视频  《张孝祥JAVA视频教程》完整版[RMVB](东西网) 历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播客) 张孝祥2010年贺岁视频:Java高新技术(传智播客) Java多线程与并发库高级应用(传智播客) 尚学堂JAVA视频下载大全(持续更新中...请关注!)(尚学堂) 《动力节点,王勇JAVA系列视频教程》(东西网) 张孝祥Java高新技术(学习资料网) Java视频教程(最适合Java初学者的经典入门视频)(传智播客) 《马士兵 JAVA JSP视频教程》尚学堂科技(尚学堂) 《尚学堂科技_马士兵_JAVA视频教程》(百度空间) 《尚学堂马士兵 手把手java视频教程》第二版(东西网) java视频教程、java教学视频、java视频下载大全(尚学堂) Java语言资源列表(东西网) Java私塾Java初级教程(学习资料网) Java精品学习视频教程下载汇总(大家论坛) 上海交大最新版JAVA程序设计(学习资料网) JAVA私塾基础视频教程(PlaySoft网) JAVA教程/视频教程类专题资料(学习资料库网)

    2.SSH相关视频  hibernate视频教程(华为网盘) 王胜Hibernate(资源共享) 王胜Hibernate(零度软件园) 北京圣思园Hibernate视频教程(学习资料库) struts2实用简洁版视频(传智播客) 传智播客Hibernate视频教程(传智播客) 传智播客Spring5视频教程(传智播客) 咿呀网提供-SpringMVC0视频教程(iteye) JAVA系列教材-Spring6_尚学堂科技(西西软件园) 《Spring MVC0 WEB开发系列视频教程(全套共6讲--约400分钟)》(iVeryCD) 《hibernate视频教程,spring视频教程--老卢JAVA》(北风网) Struts+Spring+Hibernate开发入行真功夫(19一九下载) 《浪曦原创Struts.Hibernate.Spring.JS.分页视频教程(全)》(零度软件园) 《疯狂Java_疯狂软件_李刚老师_Struts2全套视频教程》(北风网) struts2实用简洁版视频(传智播客) 《浪曦视频教程 Struts 2应用开发详解系列》(东西网) 张卫_Struts1视频教程2012年第一版源码(华为网盘) 张卫_Struts1_Hibernate...教程2012年第一版源码(华为网盘) 《北京圣思园struts2教学视频》(SimpleCD) SpringMvc+Spring+Mybatis+Maven整合视频教程(百度云网盘) JNI视频教程(传智播客) 传智播客_FTP视频教程(传智播客) oracle视频教程(内部经典)(传智播客) OA+工作流(JBPM)(传智播客) Ajax和Jquery基础入门视频(传智播客) 8天快速掌握Android视频(完整版--适合有JavaWeb基础学习)(传智播客) 张孝祥Java就业面试宝典(传智播客) 《传智播客:spring3/jdbc/EJB0/ajax/hibernate/Struts/java视频教程》(传智播客) 30天轻松掌握JavaWeb视频(黑马) Java/.Net/PHP/网页平面设计(传智播客) 传智播客_张孝祥_java基础教程(华为网盘) 传智播客_方立勋JavaWeb视频教程_web开发入门(第四天)(华为网盘) 《传智播客_张孝祥java视频教程_11_javaweb/javascript/java》(java\javascript\javaweb\courses)(资源共享) 《传智播客张孝祥java视频教程_13_struts/javascript/java》(VeryCD) 《传智播客张孝祥java视频教程_13_struts/javascript/java》(iVeryCD) Hibernate视频教程(适合掌握了javaweb的学员)(黑马) 《传智播客:spring3\jdbc\EJB0\ajax\hibernate\Struts\java视频教程》(SPRING5\AJAX\JAVA\JNI\FTP\AJAX\ibatis\OA\JDBC)(VeryCD) 《spring5视频教程》AVI 传智播客(东西网) 传智播客_spring5视频教程(华为网盘) 传智播客_2010_struts2.1.8视频教程(华为网盘) Hibernate视频教程(尚学堂)
    3.JavaEE相关视频 《尚学堂科技.马士兵.JAVA视频教程(java培训内部视频)10年2月9日更新(更新Spring0)》(资源共享) 老卢JAVA(老卢JAVA网) JavaSE视频教程(最适合Java初学者的经典入门视频)(尚学堂) 传智播客JDBC视频教程(传智播客) JavaWEB开发(JSP+Servlet)视频(传智播客) 30天轻松掌握JavaWeb视频(传智播客) 北京圣思Java培训教学视频(资源共享网) 《张卫 JavaWeb视频教程》2011版(求索网) Lucene/WebService/SVN/Ant/SpringMVC视频(学习资料库网) JUnit和Ant视频教程(VeryCD社区) 广州Java培训WebService视频教程(疯狂软件) 北京圣思员Java.Web培训视频(迅雷快传) 传智播客EJB0视频教程(传智播客) 传智播客JPA详解视频教程(传智播客) ibatis视频教程(传智播客) 传智播客JAVA邮件开发视频教程(传智播客) 传智播客FCKeditor视频教程(传智播客) 传智播客_ibatis视频教程(华为网盘) 《幻想—iBATIS框架技术视频教程》(资源共享) 《Java教学视频_孔浩老师》开始更新JavaWeb方面的视频(更新了MyBatis部分的视频)(北风网)

    4.前端技术视频 传智播客AJax视频教程(传智播客) JavaScript详解高清视频教程打包下载(iteye) 精通JavaScript+jQuery 视频教程及源码(西西软件园) lamp兄弟连高洛峰JavaScript视频教程(华为网盘) 《JavaScript基础视频教程》不断更新...[压缩包](资源共享) 《21天学通JavaScript》视频教程+源码(东西网) JavaScript基础视频教程(学习资料库) 《北风网资深讲师李炎恢JavaScript视频教程》(19一九下载) 《JavaScript视频教程》(Top JavaScript Tech Videos)(iVeryCD) JavaScript视频教程》(Top JavaScript Tech Videos)(北风网) 《LAMP兄弟连JavaScript视频教程》11月14日更新(敏学网) 《后盾网盾友 JQuery 视频教程 》(资源共享) jquery视频教程下载(网易博客) JQuery实战(学习资料库) Jquery精品视频教程(iteye) JavaScript网页开发(传智播客) 毕向东Html、css、JavaScript视频教程(黑马) 传智播客.Net培训—JQuery(华为网盘) 网页平面设计视频(传智播客)

    5.Linux相关视频 《尚学堂 linux 3 天绝版》linux操作系统视频教程(东西网) 《Linux从入门到精通》随书视频教程(东西网) RHCE视频教程下载(Linux公社) 周立发linux视频教程(ChinaUnix) linux视频教程(百度云网盘) 韩顺平Linux(iteye) 韩顺平 linux视频教程(华为网盘) Linux视频教程(传智播客)

    6 .Android视频 Java/安卓/C++/.Net(ITjob网) Android项目视频教程(学习资料库) 《Sundy‘s《Android高级应用开发课程共享版》《Android开发视频教程》[压缩包](资源共享) Android视频全套教程免费批量下载(华为网盘) 《Android开发教程【更新项目实战】》发布项目实战第20课[MP4](VeryCD) Android开发视频教学(CSND) 8天快速掌握Android视频 Android黑马培训视频 Mars老师Android视频
    7.数据库相关视频 数据库SQL Server/Oracle/MySQL/DB2教程类专题资料(学习资料网络) 《2011版李兴华主讲-ORACLE实战 最强大的数据库课程[增加网盘下载]》(ORACLE)V2011(VeryCD) Oracle/Linux系列免费视频教程(cuug) 《oracle 视频教程》chinaitlab(敏学网) 《CBT Nuggets出品甲骨文11g数据库1Z0-051SQL基础考试视频教程》(资源共享) 尚观国际oracle入门到精通OCP认证教学视频(迅雷快传) oracle视频教程(内部经典)(黑马)   8.项目实战视频 巴巴运动网视频教程(传智播客) 银行业务调度系统(传智播客) 交通灯管理系统(传智播客) java网上在线支付实战视频(传智播客) 俄罗斯、贪吃蛇游戏-项目视频(传智播客)

     Java程序员进化为架构师掌握的知识 Android精品开源项目整理(持续更新中..) 如有更多更好的资源欢迎大家跟帖分享。。。 淘宝技术牛p博客整理 开发中最常用的GitHub上 优秀的 Android 开源项目整理(精品)       UI类:    一、ListView     1、android-pulltorefresh     一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView、ViewPager、WevView、ExpandableListView、GridView、(Horizontal )ScrollView、Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多。并且他实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验更好。 项目地址:https://github.com/chrisbanes/Android-PullToRefresh Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/pull-to-refreshview-demo.apk?raw=true APP示例:新浪微博各个页面       2、DragSortListView       3、SwipelistView      4、pinned-section-listview GroupName      二、ActionBar        1. ActionBarSherlock         2.ActionBar-PullToRefresh       三、 Menu          1.SlidingMenu      四、ViewPager           1.Android-ViewPagerIndicator      五、GridView              1、StaggeredGridView              六、ImageView           2.android-gif-drawable          3.CircleImageView                七、其他      1.android-square-progressbar      2.SwipeBackLayout       3.achartengine      4.AndroidWheel       5.android-lockpattern        工具类:         一、快速开发框架         1.Afinal        2.xUtils     3. Android-Universal-Image-Loader 4.Android Volley

    原文地址为http://www.trinea.cn/Android/android-open-source-projects-view/,作者Trinea


    主要介绍那些不错个性化的View,包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar及其他如Dialog、Toast、EditText、TableView、Activity Animation等等。

      

    一、ListView

     

    1. android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新
      ListView、ViewPager、WevView、ExpandableListView、GridView、(Horizontal
      )ScrollView、Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多。并且他实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验更好。
      项目地址:https://github.com/chrisbanes/Android-PullToRefresh
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/pull-to-refreshview-demo.apk?raw=true
      APP示例:新浪微博各个页面

    2. android-pulltorefresh-listview 下拉刷新ListView
      项目地址:https://github.com/johannilsson/android-pulltorefresh
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/pull-to-refresh-listview-demo.apk?raw=true
      PS:这个被很多人使用的项目实际有不少bug,推荐使用上面的android-pulltorefresh

    3. DropDownListView 下拉刷新及滑动到底部加载更多ListView
      项目地址:https://github.com/Trinea/AndroidCommon
      Demo地址:https://play.google.com/store/apps/details?id=cn.trinea.android.demo
      文档介绍:http://www.trinea.cn/?p=523

    4. DragSortListView 拖动排序的ListView
      同时支持ListView滑动item删除,各个Item高度不一、单选、复选、CursorAdapter做为适配器、拖动背景变化等
      项目地址:https://github.com/bauerca/drag-sort-listview
      Demo地址:https://play.google.com/store/apps/details?id=com.mobeta.android.demodslv
      APP示例:Wordpress Android

    5. SwipeListView 支持定义ListView左右滑动事件,支持左右滑动位移,支持定义动画时间
      项目地址:https://github.com/47deg/android-swipelistview
      Demo地址:https://play.google.com/store/apps/details?id=com.fortysevendeg.android.swipelistview
      APP示例:微信

    6. Android-SwipeToDismiss 滑动Item消失ListView
      项目地址:https://github.com/romannurik/Android-SwipeToDismiss
      支持3.0以下版本见:https://github.com/JakeWharton/SwipeToDismissNOA
      Demo地址:https://github.com/JakeWharton/SwipeToDismissNOA/SwipeToDismissNOA.apk/qr_code

    7. StickyListHeaders GroupName滑动到顶端时会固定不动直到另外一个GroupName到达顶端的ExpandListView,支持快速滑动,支持Android2.3及以上
      项目地址:https://github.com/emilsjolander/StickyListHeaders
      APP示例:Android 4.0联系人
      效果图:Renderings

    8. pinned-section-listview GroupName滑动到顶端时会固定不动直到另外一个GroupName到达顶端的ExpandListView
      项目地址:https://github.com/beworker/pinned-section-listview
      效果图:Renderings

    9. PinnedHeaderListView GroupName滑动到顶端时会固定不动直到另外一个GroupName到达顶端的ExpandListView
      项目地址:https://github.com/JimiSmith/PinnedHeaderListView

    10. QuickReturnHeader ListView/ScrollView的header或footer,当向下滚动时消失,向上滚动时出现
      项目地址:https://github.com/ManuelPeinado/QuickReturnHeader
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/quick-return-header-demo.apk?raw=true
      APP示例:google plus

    11. IndexableListView ListView右侧会显示item首字母快捷索引,点击可快速滑动到某个item
      项目地址:https://github.com/woozzu/IndexableListView
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/indexable-listview.apk?raw=true
      APP示例:微信通讯录、小米联系人

    12. CustomFastScrollView ListView快速滑动,同时屏幕中间PopupWindows显示滑动到的item内容或首字母
      项目地址:https://github.com/nolanlawson/CustomFastScrollViewDemo
      效果图:Renderings

    13. Android-ScrollBarPanel ListView滑动时固定的Panel指示显示在scrollbar旁边
      项目地址:https://github.com/rno/Android-ScrollBarPanel
      效果展示:https://github.com/rno/Android-ScrollBarPanel/raw/master/demo_capture.png

    14. SlideExpandableListView 用户点击listView item滑出固定区域,其他item的区域收缩
      项目地址:https://github.com/tjerkw/Android-SlideExpandableListView
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/slide-expandable-listView-demo.apk?raw=true

    15. JazzyListView ListView及GridView item以特殊动画效果进入屏幕,效果包括grow、cards、curl、wave、flip、fly等等
      项目地址:https://github.com/twotoasters/JazzyListView
      Demo地址:https://play.google.com/store/apps/details?id=com.twotoasters.jazzylistview.sample
      效果展示:http://lab.hakim.se/scroll-effects/

    16. ListViewAnimations 带Item显示动画的ListView,动画包括底部飞入、其他方向斜飞入、下层飞入、渐变消失、滑动删除等
      项目地址:https://github.com/nhaarman/ListViewAnimations
      Demo地址:https://play.google.com/store/apps/details?id=com.haarman.listviewanimations
      APP示例:Google plus、Google Now卡片式进入、小米系统中应用商店、联系人、游戏中心、音乐、文件管理器的ListView、Ultimate、Light Flow Lite、TreinVerkeer、Running Coach、Pearl Jam Lyrics、Calorie Chart、Car Hire、Super BART、DK FlashCards、Counter Plus、Voorlees Verhaaltjes 2.0

    17. DevsmartLib-Android 横向ListView
      项目地址:https://github.com/dinocore1/DevsmartLib-Android
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/horizontal-listview-demo.apk?raw=true

     

    二、ActionBar

     

    1. ActionBarSherlock 为Android所有版本提供统一的ActionBar,解决4.0以下ActionBar的适配问题
      项目地址:https://github.com/JakeWharton/ActionBarSherlock
      Demo地址:https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.demos
      APP示例:太多了。。现在连google都在用

    2. ActionBar-PullToRefresh 下拉刷新,ActionBar出现加载中提示
      项目地址:https://github.com/chrisbanes/ActionBar-PullToRefresh
      Demo地址:https://play.google.com/store/apps/details?id=uk.co.senab.actionbarpulltorefresh.samples.stock
      APP示例:Gmail,Google plus,知乎等

    3. FadingActionBar ListView向下滚动逐渐显现的ActionBar
      项目地址:https://github.com/ManuelPeinado/FadingActionBar
      Demo地址:https://play.google.com/store/apps/details?id=com.manuelpeinado.fadingactionbar.demo
      APP示例:google music,知乎

    4. NotBoringActionBar google music下拉收缩的ActionBar
      项目地址:https://github.com/flavienlaurent/NotBoringActionBar
      Demo地址:http://flavienlaurent.com/blog/2013/11/20/making-your-action-bar-not-boring/
      APP示例:Google音乐

    5. RefreshActionItem 带进度显示和刷新按钮的ActionBar
      项目地址:https://github.com/ManuelPeinado/RefreshActionItem
      Demo地址:https://play.google.com/store/apps/details?id=com.manuelpeinado.refreshactionitem.demo
      APP示例:The New York Times,DevAppsDirect.

    6. GlassActionBar 类似玻璃的有一定透明度的ActionBar
      项目地址:https://github.com/ManuelPeinado/GlassActionBar
      Demo地址:https://play.google.com/store/apps/details?id=com.manuelpeinado.glassactionbardemo
      APP示例:google music

     

    三、Menu

     

    1. MenuDrawer 滑出式菜单,通过拖动屏幕边缘滑出菜单,支持屏幕上下左右划出,支持当前View处于上下层,支持Windows边缘、ListView边缘、ViewPager变化划出菜单等。
      项目地址:https://github.com/SimonVT/android-menudrawer
      Demo地址:http://simonvt.github.io/android-menudrawer/
      APP示例:Gmail、Google Music等大部分google app

    2. SlidingMenu 滑出式菜单,通过拖动屏幕边缘滑出菜单,支持屏幕左右划出,支持菜单zoom、scale、slide up三种动画样式出现。
      项目地址:https://github.com/jfeinstein10/SlidingMenu
      Demo地址:https://play.google.com/store/apps/details?id=com.slidingmenu.example
      APP示例:Foursquare, LinkedIn, Zappos, Rdio, Evernote Food, Plume, VLC for Android, ESPN ScoreCenter, MLS MatchDay, 9GAG, Wunderlist 2, The Verge, MTG Familiar, Mantano Reader, Falcon Pro (BETA), MW3 Barracks
      MenuDrawer和SlidingMenu比较:SlidingMenu支持菜单动画样式出现,MenuDrawer支持菜单view处于内容的上下层

    3. ArcMenu 支持类似Path的左下角动画旋转菜单及横向划出菜单、圆心弹出菜单
      项目地址:https://github.com/daCapricorn/ArcMenu
      APP示例:Path
      效果图:
      https://dl.dropboxusercontent.com/u/11369687/preview1.png
      https://dl.dropboxusercontent.com/u/11369687/raymenu.png

    4. android-satellite-menu 类似Path的左下角动画旋转菜单
      项目地址:https://github.com/siyamed/android-satellite-menu
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/satellite-menu-demo.apk?raw=true
      APP示例:Path

    5. radial-menu-widget 圆形菜单,支持二级菜单
      项目地址:https://code.google.com/p/radial-menu-widget/
      效果图:http://farm8.staticflickr.com/7377/11621125154_d1773c2dcc_o.jpg

    6. Android Wheel Menu 圆形旋转选取菜单
      项目地址:https://github.com/anupcowkur/Android-Wheel-Menu
      效果图:Renderings

    7. FoldingNavigationDrawer滑动并以折叠方式打开菜单
      项目地址:https://github.com/tibi1712/FoldingNavigationDrawer-Android
      使用介绍:https://play.google.com/store/apps/details?id=com.ptr.folding.sample
      效果图:

     

    四、ViewPager 、Gallery

     

    1. Android-ViewPagerIndicator 配合ViewPager使用的Indicator,支持各种位置和样式
      项目地址:https://github.com/JakeWharton/Android-ViewPagerIndicator
      Demo地址:https://play.google.com/store/apps/details?id=com.viewpagerindicator.sample
      APP示例:太多了。。

    2. JazzyViewPager 支持Fragment切换动画的ViewPager,动画包括转盘、淡入淡出、翻页、层叠、旋转、方块、翻转、放大缩小等
      项目地址:https://github.com/jfeinstein10/JazzyViewPager
      Demo地址:https://github.com/jfeinstein10/JazzyViewPager/blob/master/JazzyViewPager.apk?raw=true
      效果类似桌面左右切换的各种效果,不过桌面并非用ViewPager实现而已

    3. Android-DirectionalViewPager 支持横向和纵向(垂直)的ViewPager
      项目地址:https://github.com/JakeWharton/Android-DirectionalViewPager
      Demo地址:https://market.android.com/details?id=com.directionalviewpager.sample

    4. android-pulltorefresh 支持下拉刷新的ViewPager
      项目地址:https://github.com/chrisbanes/Android-PullToRefresh
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/pull-to-refreshview-demo.apk?raw=true
      APP示例:新浪微博各个页面

    5. FancyCoverFlow支持Item切换动画效果的类似Gallery View
      项目地址:https://github.com/davidschreiber/FancyCoverFlow
      Demo地址:https://play.google.com/store/apps/details?id=at.technikum.mti.fancycoverflow.samples
      效果图:Renderings

    6. AndroidTouchGallery 支持双击或双指缩放的Gallery(用ViewPager实现)
      相比下面的PhotoView,在被放大后依然能滑到下一个item,并且支持直接从url和文件中获取图片,
      项目地址:https://github.com/Dreddik/AndroidTouchGallery
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/touch-gallery-demo.apk?raw=true
      APP示例:类似微信中查看聊天记录图片时可双击放大,并且放大情况下能正常左右滑动到前后图片

    7. Salvage view 带View缓存的Viewpager PagerAdapter,很方便使用
      项目地址:https://github.com/JakeWharton/salvage

     

    五、GridView

     

    1. StaggeredGridView 允许非对齐行的GridView
      类似Pinterest的瀑布流,并且跟ListView一样自带View缓存,继承自ViewGroup
      项目地址:https://github.com/maurycyw/StaggeredGridView
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/staggered-gridview-demo.apk?raw=true
      APP示例:Pinterest等

    2. AndroidStaggeredGrid 允许非对齐行的GridView
      类似Pinterest的瀑布流,继承自AbsListView
      项目地址:https://github.com/etsy/AndroidStaggeredGrid
      APP示例:Pinterest等

    3. PinterestLikeAdapterView 允许非对齐行的GridView
      类似Pinterest的瀑布流,允许下拉刷新
      项目地址:https://github.com/GDG-Korea/PinterestLikeAdapterView
      APP示例:Pinterest等

    4. DraggableGridView Item可拖动交换位置的GridView,类似桌面的单屏效果
      项目地址:https://github.com/thquinn/DraggableGridView
      Demo地址:https://github.com/thquinn/DraggableGridView/blob/master/bin/DraggableGridViewSample.apk?raw=true

     

    六、ImageView

     

    1. PhotoView 支持双击或双指缩放的ImageView
      在ViewPager等Scrolling view中正常使用,相比上面的AndroidTouchGallery,不仅支持ViewPager,同时支持单个ImageView
      项目地址:https://github.com/chrisbanes/PhotoView
      Demo地址:https://play.google.com/store/apps/details?id=uk.co.senab.photoview.sample
      APP示例:photup

    2. android-gif-drawable 支持gif显示的view
      项目地址:https://github.com/koral--/android-gif-drawable
      用jni实现的,编译生成so库后直接xml定义view即可,而且本身不依赖于其他开源项目所以相对下面的ImageViewEx简单的多

    3. ImageViewEx 支持Gif显示的ImageView
      项目地址:https://github.com/frapontillo/ImageViewEx
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/imageviewex-demo.apk?raw=true
      依赖很多,编译过程很繁琐!|_|!

    4. RoundedImageView 带圆角的ImageView
      项目地址:https://github.com/vinc3m1/RoundedImageView
      效果图:Renderings

     

    七、ProgressBar

     

    1. SmoothProgressBar 水平进度条
      项目地址:https://github.com/castorflex/SmoothProgressBar
      Demo地址:https://play.google.com/store/apps/details?id=fr.castorflex.android.smoothprogressbar.sample

    2. ProgressWheel 支持进度显示的圆形ProgressBar
      项目地址:https://github.com/Todd-Davies/ProgressWheel
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/progress-wheel-demo.apk?raw=true

    3. android-square-progressbar 在图片周围显示进度
      项目地址:https://github.com/mrwonderman/android-square-progressbar
      Demo地址:https://play.google.com/store/apps/details?id=net.yscs.android.square_progressbar_example
      APP示例:square
      效果图:

    4. HoloCircularProgressBar Android4.1 时钟App样式
      项目地址:https://github.com/passsy/android-HoloCircularProgressBar
      APP示例:Android4.1时钟App
      效果图:https://raw.github.com/passsy/android-HoloCircularProgressBar/master/raw/screenshot1.png

     

    八、其他

     

    1. achartengine 强大的图标绘制工具
      支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、拨号图/表、立方线图及各种图的结合
      项目地址:https://code.google.com/p/achartengine/
      官方网站:http://www.achartengine.org/
      效果图:Renderings
      http://www.achartengine.org/dimages/sales_line_and_area_chart.png
      http://www.achartengine.org/dimages/temperature_range_chart.png
      http://www.achartengine.org/dimages/combined_chart.png
      http://www.achartengine.org/dimages/budget_chart.png
      APP示例:Wordpress Android,Google Analytics

    2. GraphView 绘制图表和曲线图的View
      可用于Android上的曲形图、柱状图、波浪图展示
      项目地址:https://github.com/jjoe64/GraphView
      Demo工程:https://github.com/jjoe64/GraphView-Demos
      Demo地址:https://play.google.com/store/apps/details?id=com.sothree.umano
      APP示例:Wordpress Android,Google Analytics

    3. android-flip 类似Flipboard翻转动画的实现
      项目地址:https://github.com/openaphid/android-flip
      Demo地址:https://github.com/openaphid/android-flip/blob/master/FlipView/Demo/APK/Aphid-FlipView-Demo.apk?raw=true
      APP示例:flipboard

    4. FlipImageView 支持x、y、z及动画选择的翻转动画的实现
      项目地址:https://github.com/castorflex/FlipImageView
      Demo地址:https://play.google.com/store/apps/details?id=fr.castorflex.android.flipimageview

    5. SwipeBackLayout 左右或向上滑动返回的Activity
      项目地址:https://github.com/Issacw0ng/SwipeBackLayout
      Demo地址:https://play.google.com/store/apps/details?id=me.imid.swipebacklayout.demo
      APP示例:知乎

    6. Cards-UI 卡片式View,支持单个卡片,item为卡片的ListView
      项目地址:https://github.com/afollestad/Cards-UI
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/cards-ui-demo.apk?raw=true

    7. cardslib 卡片式View,支持单个卡片,item为卡片的ListView和GridView
      项目地址:https://github.com/gabrielemariotti/cardslib
      Demo地址:https://play.google.com/store/apps/details?id=it.gmariotti.cardslib.demo

    8. android-styled-dialogs 可自定义样式的dialog
      默认与Holo主题样式一致,在Android2.2以上同一样式
      项目地址:https://github.com/inmite/android-styled-dialogs
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/styled-dialogs-demo.apk?raw=true

    9. Crouton 丰富样式的Toast
      允许alert、comfirm、info样式及点击消失样式,允许设置Toast显示时间,允许自定义View。
      项目地址:https://github.com/keyboardsurfer/Crouton
      Demo地址:http://play.google.com/store/apps/details?id=de.keyboardsurfer.app.demo.crouton

    10. supertooltips 带动画效果的Tips显示
      项目地址:https://github.com/nhaarman/supertooltips
      Demo地址:https://play.google.com/store/apps/details?id=com.haarman.supertooltips

    11. Android ViewBadger为其他View添加角标等
      项目地址:https://github.com/jgilfelt/android-viewbadger
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/android-viewbadger.apk?raw=true
      效果图:https://github-camo.global.ssl.fastly.net/a705a3e88c75ae2394943bd7c56f725697616ea8/687474703a2f2f7777772e6a65666667696c66656c742e636f6d2f766965776261646765722f76622d31612e706e67

    12. Android Sliding Up Panel 可拖动的View,能在当前Activity上扶起一个可拖动的Panel
      项目地址:https://github.com/umano/AndroidSlidingUpPanel
      Demo地址:https://play.google.com/store/apps/details?id=com.sothree.umano
      APP示例:Google Music精简播放栏

    13. android-times-square Android日历部件
      支持选取单个日期,多个日期,及日期区间段和对话框形式显示
      项目地址:https://github.com/square/android-times-square
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/times-square-demo.apk?raw=true

    14. android-calendar-card 日历
      项目地址:https://github.com/kenumir/android-calendar-card
      Demo地址:https://play.google.com/store/apps/details?id=com.wt.calendarcardsample
      效果图:Renderings

    15. ColorPickerView 颜色选择器,支持PopupWindows或新的Activity中打开
      项目地址:https://code.google.com/p/color-picker-view/
      效果图:Renderings

    16. HoloColorPicker 颜色选择器
      项目地址:https://github.com/LarsWerkman/HoloColorPicker
      Demo地址:https://docs.google.com/file/d/0BwclyDTlLrdXRzVnTGJvTlRfU2s/edit

    17. AndroidWheel Android Wheel支持城市、多种日期时间、密码、图片
      项目地址:https://github.com/sephiroth74/AndroidWheel
      效果图:Renderings

    18. android-flowtextview文字自动环绕其他View的Layout
      项目地址:https://code.google.com/p/android-flowtextview/
      效果图:http://i949.photobucket.com/albums/ad332/vostroman1500/1.png

    19. Segmented Radio Buttons for AndroidiOS’s segmented controls的实现
      项目地址:https://github.com/vinc3m1/android-segmentedradiobutton
      Demo地址:https://github.com/thquinn/DraggableGridView/blob/master/bin/DraggableGridViewSample.apk?raw=true
      效果图:Renderings

    20. TableFixHeaders 第一列固定的Table
      项目地址:https://github.com/InQBarna/TableFixHeaders
      Demo地址:http://bit.ly/13buAIq

    21. Android Form EditText 验证输入合法性的编辑框
      支持输入、英文、ip、url等多种正则验证
      项目地址:https://github.com/vekexasia/android-edittext-validator
      Demo地址:https://play.google.com/store/apps/details?id=com.andreabaccega.edittextformexample

    22. UITableView ios风格控件
      包括Button、ListView、TableView
      项目地址:https://github.com/thiagolocatelli/android-uitableview
      Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/ui-tableview-demo.apk?raw=true

    23. ATableView ios风格控件
      项目地址:https://github.com/dmacosta/ATableView
      Demo地址:https://play.google.com/store/apps/details?id=com.nakardo.atableview.demo

    24. UndoBar屏幕底部显示取消或是确认的PopupWindows
      项目地址:https://github.com/soarcn/UndoBar
      效果图:Renderings

    25. Inscription可用于展示应用change和new feature信息
      项目地址:https://github.com/MartinvanZ/Inscription

    26. ActivityTransition Activity切换动画,包括渐变、flip、某个位置进入等等
      项目地址:https://github.com/ophilbert/ActivityTransition
      使用介绍:https://github.com/jfeinstein10/JazzyViewPager/blob/master/JazzyViewPager.apk?raw=true
      效果图:类似桌面左右切换的各种效果,不过桌面并非用ViewPager实现而已

    27. Cropper 图片局部剪切工具,可触摸控制选择区域或旋转
      项目地址:https://github.com/edmodo/cropper
      使用介绍:https://github.com/edmodo/cropper/wiki
      效果图:Renderings

    28. GlowPadBackport将Android4.2的锁屏界面解锁扩展到Android1.6及1.6+
      项目地址:https://github.com/rock3r/GlowPadBackport
      Demo地址:https://play.google.com/store/apps/details?id=net.sebastianopoggi.samples.ui.GlowPadSample
      效果图:

    29. GlowPadView Android4锁屏界面解锁
      项目地址:https://github.com/nadavfima/GlowPadView
      效果图:https://raw.github.com/nadavfima/GlowPadView/master/example.png

    30. android-lockpattern Android的图案密码解锁
      项目地址:https://code.google.com/p/android-lockpattern/
      Demo地址:https://play.google.com/store/apps/details?id=group.pals.android.lib.ui.lockpattern.demo
      使用介绍:https://code.google.com/p/android-lockpattern/wiki/QuickUse
      示例APP:Android开机的图案密码解锁,支付宝的密码解锁

      原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea





    GitHub上优秀Android开源项目

    原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea

    GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上。更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。为此,CSDN特整理了在GitHub平台上最受欢迎的Android及iOS开源项目,以飨开发者。

    下面,就让我们一起来看看,在GitHub平台上,究竟有哪些Android开源项目最火,也最受开发者欢迎。

    1. ActionBarSherlock

    ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便地使用所有版本的Android动作栏的设计模式。

    对于Android 4.0及更高版本,ActionBarSherlock可以自动使用本地ActionBar实现,而对于之前没有ActionBar功能的版本,基于Ice Cream Sandwich的自定义动作栏实现将自动围绕布局。能够让开发者轻松开发一款带动作栏(Action bar)的应用,并且适用于Android 2.x及其以上所有版本。

    详情请参考:ActionBarSherlock

    2. facebook-android-sdk

    Facebook SDK for Android是一个开源库,允许开发者将Facebook集成到所开发的Android应用中。

    如果想要获取更多关于示例、文档、将SDK集成到App中、源代码等信息,可直接登陆Facebook Developers查看。

    3. SlidingMenuSlidingMenu Demos

    SlidingMenu是一个开源的Android库,能够让开发者轻松开发一款应用,实现类似于Google+、Youtube和Facebook应用中非常流行的滑动式菜单。

      

    使用SlidingMenu的Android应用:

     

     

    4. cocos2d-x

    移动开发领域,将Cocos2D-X用于主流iOS/Android游戏开发的公司、开发团队多不胜数。cocos2d-x是一个开源的支持多平台的2D游戏框架,使用C++开发,基于cocos2d-iphone,在MIT许可证下发布。主分支在GitHub上使用OpenGL ES 2.0渲染,而旧版gles11分支则使用OpenGL ES 1.1渲染。

    支持iOS、Android、Windows Phone 8、Bada、BlackBerry、Marmalade、Windows、Linux等多个平台。支持C++、Lua、JavaScript编程语言。

    5. android

    GitHub Android App是GitHub开源的Android客户端,支持Issues、Gists,并集成了新闻Feed,能够让你及时跟进组织及关注的开发者、库等。同时,该应用还提供了一个用户快速访问你所创建、监控及发布issue的面板,可查看并将问题加入到收藏夹,可对标签、里程碑和任务进行过滤配置。

    android资源库包含了GitHub Android App的所有源代码。

    6. Android-ViewPagerIndicator

    ViewPager指针项目,在使用ViewPager的时候能够指示ViewPager所在的位置,就像Google Play中切换的效果一样,还能使用在应用初始化的介绍页面。

    兼容Android支持库的ViewPager及ActionBarSherlock,最初是基于Patrik Åkerfeldt的ViewFlow,开发者可以直接登陆Google Play下载该项目的演示应用。

    7. MonoGame

    MonoGame是一个Microsoft XNA 4.x Framework的开源跨平台实现。用于让XNA开发者将他们在Xbox 360、Windows & Windows Phone上开发的游戏移植到iOS、Android、Mac OS X、Linux及Windows 8 Metro上,目前,PlayStation Mobile & Raspberry PI的开发正在进行中。

    详情请参考:MonoGame

    8. Android-PullToRefresh

    该项目用于为Android提供一个可重用的下拉刷新部件。它最初来源于Johan Nilsson的库(主要是图形、字符串和动画),但这些后来都已被取代。

    9. android-async-http

    android-async-http是Android上的一个异步、基于回调的HTTP客户端开发包,建立在Apache的HttpClient库上。

    10. Android-Universal-Image-Loader

    Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。

    Universal Image Loader for Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载。它最初来源于Fedor Vlasov的项目,且自此之后,经过大规模的重构和改进。

    11. GreenDroid

    GreenDroid最初是由Cyril Mottier发起,是一个Android的UI开发类库,能够让UI开发更加简便,并且在应用中始终保持一致。

    详情请参考:Cyril Mottier's Blog

    12. Anki-Android

    AnkiDroid是一个免费、开源的Android的闪存应用,可直接从Google Play进行下载。

    详情请参考:ankidroid

    13. android-actionbar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式。在大多数的情况下,当开发者需要突出展现用户行为或在全局导航的activity中使用action bar,因为action bar能够使应用程序给用户提供一致的界面,且系统能够很好地根据不同的屏幕配置来适应操作栏的外观。

    Action bar的主要目的:

     

    • 提供一个用于识别应用程序的标示和用户的位置的专用空间。
    • 在不同的应用程序之间提供一致的导航和视觉体验。
    • 突出Activity的关键操作,并且在可预见的方法内给用户提供快捷的访问。

     

    14. android-viewflow

    android-viewflow是Android平台上的一个视图切换的效果库,ViewFlow相当于Android UI部件提供水平滚动的ViewGroup,使用Adapter进行条目绑定。

     

    15. android-mapviewballoons

    当使用Android地图外部库(com.google.android.maps)时,android-mapviewballoons会提供一个简单的方式来对地图覆盖进行标注,就是一个简单的信息气泡。

    它由BalloonOverlayView组成,是一个代表显示你的MapView及BalloonItemizedOverlay的气泡的视图,BalloonItemizedOverlay是ItemizedOverlay的一个抽象扩展。

    16. PushSharp

    一个向iOS(iPhone/iPad APNS)、Android(C2DM和GCM)、Windows Phone和Windows 8设备发送推送通知的服务器端库。

    17. androidannotations

    Android Annotations是一个开源的框架,用于加速 Android应用的开发,可以让你把重点放在功能的实现上,简化了代码,提升了可维护性。

    18. HockeyKit

    Hockey是一个iOS Ad-Hoc自动更新框架。苹果App Store中的所有App都可以使用它,它能够显著地提高Beta测试的整个过程,分为两部分:服务器和客户端框架。服务器组件需要所有脚本,但在没有客户端库的情况下,也可以单独工作。它提供一个Web接口,Beta测试者可以使用它来安装最新的AdHoc配置文件,也可以直接在设备上通过Safari安装最新的Beta版本。

     

    • 只需在服务器上安装一次服务端,就可以处理包标识符不同的多个应用程序(有开发者强烈建议对Debug、AdHoc Beta和AppStore发布版使用不同的包标识符)。
    • 默认当App启动或唤醒时,客户端会从服务器检测更新,用户可以在设置对话框中进行修改:一天一次或手动检查更新。
    • 除了支持iOS,HokeyKit也支持Android平台,不过Android版还处在Alpha阶段,支持OTA及应用内更新。
    • 为HockeyKit用户提供服务器托管服务。

     

    19. android-menudrawer

    Android上的菜单展示风格各异,其中用得最多且体验最好的莫过于左右滑动来显示隐藏的菜单,android-menudrawer是一个滑动式菜单实现,允许用户在应用当中实现无缝导航。该项目具有多种菜单展示效果,其中最常见的就是通过屏幕边缘拖动或点击动作栏的“向上”按钮显示。

     

    实现功能:

     

    • 菜单可以沿着四个边放置。
    • 支持附加一个始终可见、不可拖动的菜单。
    • 菜单的内容和整个窗口都可以隐藏。
    • 可用于XML布局。
    • 显示当前可见屏幕的指示器。

     

    20. android-flip

    Aphid FlipView是一个能够实现Flipboard翻页效果的UI组件。

    以上为GitHub上最受欢迎的Android开源项目TOP20,敬请期待“GitHub上最受欢迎的Android开源项目(二)”。

     

    Android经典的开源项目其实非常多,但是国内的博客总是拿着N年前的一篇复制来复制去,实在是不利于新手学习。今天爬爬把自己熟悉的一些开源项目整理起来,希望能对Android开发同学们有所帮助。另外,如果你有比较好的项目推荐,也烦请在评论里分享出来,我会定期更新博客内容。

     

    项目篇:


    组件篇:

    • Android-Flip:可以实现类似FlipBoard那种华丽丽的翻页
    • Drag-Sort-Listview:可以拖动item重新排序的listview,效果非常赞
    • HoloEveryWhere:咳咳,有些同学非常喜欢Android的holo风格,这个项目绝对让你happy
    • Universal-ImageLoader:这个经典的异步图片加载,不多说了
    • JazzyViewPager:这玩意可以让ViewPager翻起来更酷,谁用谁知道~~
    • SlidingMenu:这个是抽屉界面(就是facebook那种)的各种实现版本中,最好的,木有之一!
    • StickyListHeaders:iPhone上经常有这个,就是listview的……不知道怎么解释,自己下载看看吧
    • Android-PullToRefresh:下拉刷新,挺常用的一个组件
    • StaggeredGridView:这是一个瀑布流布局的实现,还不是很完善,但作为学习的案例还是不错的
    • android-async-http:android的异步请求组件,我个人习惯使用asynctask,不过这个实现水平还是不错,也推荐给大家参考
    • ActionBarSherlock:大家熟知的ActionBar在2.x上的兼容性方案;类似的兼容性组件还有许多,有时间为大家一一列出;
    • facebook-android-sdk:不止是一个SDK那么简单哦,比某浪和某人的SDK强几个数量级;
    • NineOldAndroids:想在2.xSDK上使用Android 3.0新增的动画API,那就是它了;没用过的同学一定要试试哦,非常方便~
    • android-swipelistview:让listview的item可以向右滑动,新版Gmail和Pocket里面有用到哦~
    • DataDroid:Android的RESTful封装,没听过RESTful还说你有代码洁癖,追求完美
    • EventBus:和上面的DataDroid同样属于美化底层代码的,这个lib简化了不同组件之间的事件传递



    21. drag-sort-listview

    DragSortListView(DSLV)是Android ListView的一个扩展,支持拖拽排序和左右滑动删除功能。重写了TouchInterceptor(TI)类来提供更加优美的拖拽动画效果。

     

    DSLV主要特性:

     

    • 完美的拖拽支持;
    • 在拖动时提供更平滑的滚动列表滚动;
    • 支持每个ListItem高度的多样性
    • 公开startDrag()和stopDrag()方法;
    • 有公开的接口可以自定义拖动的View。

     

    DragSortListView适用于带有任何优先级的列表:收藏夹、播放列表及清单等,算得上是目前Android开源实现拖动排序操作最完美的方案。

    22. c-geo-opensource

    c:geo是Android设备上一个简单而又强大的非官方地理寻宝客户端。与其他类似应用不同的是,c:geo不需要Web浏览器,也不需要文件输出。你可以在毫无准备的情况下,毫无后顾之忧地带上你的智能手机去进行地理寻宝。当然,你也不需要付钱,因为它是免费的。

    c-geo-opensource包含了c:geo所有开源代码。

    详情请参考:c:geo

    23. NineOldAndroids

    自Android 3.0以上的版本,SDK新增了一个android.animation包,里面的类都是跟动画效果实现相关的,通过Honeycomb API,能够实现非常复杂的动画效果。但如果开发者想在3.0以下的版本中也能使用到这套API,那么Nine Old Androids就会是你最好的选择,该API和Honeycomb API完全一样,只是改变了你使用com.nineoldandroids.XXX的入口。

    该项目包含两个工程,一个是Library,即为动画效果的实现库,另一个则是Sample,是对如何使用该API的演示。开发者可以直接登陆Google Play下载安装Nine Old Androids Sample,查看演示。

    详情请参考:Nine Old Androids

    24. ppsspp

    PPSSPP是由GC/Wii模拟器Dolphin联合创始人之一Henrik Rydgård开发的一款免费的跨平台开源模拟器,支持Windows、Linux、Mac、Android、iOS、BlackBerry 10等主流计算机与移动操作系统,可直接工作在x86、x64、ARM等CPU平台上,以GNU GPLv2许可协议发布,主要使用C++编写以提高效率和可移植性。

    只要支持OpenGL ES 2.0,PPSSPP就可以在相当低规格的硬件设备上运行,包括基于ARM的手机及平板电脑。

    详情请参考:PPSSPP

    25. androidquery

    Android-Query(AQuery)是一个轻量级的开发包,用于实现Android上的异步任务和操作UI元素,可让Android应用开发更简单、更容易,也更有趣。

    26. droid-fu

    Droid-Fu是一个开源的通用Android应用库,其主要目的是为了让Android开发更容易,包含有许多工具类,还有非常易用的Android组件。

    Droid-Fu提供支持的领域包括:

     

    • Android应用的生命周期帮助
    • 支持处理Intents和diagnostics类
    • 后台任务支持
    • HTTP消息处理
    • 对象、HTTP响应及远程图像高速缓存
    • 定制各种Adapter及View

     

    Droid-Fu最大的优势在于它的应用生命周期帮助类,如果你正在开发一款Android应用,而它的主要任务是运行后台任务,比如从Web上抓取数据,那么,你一定会使用到Droid-Fu,不过,目前该项目在GitHub上已经停止更新维护。

    详情请参考:droid-fu

    27. TextSecure

    TextSecure是Whisper Systems团队开发的一个Android上的加密信息客户端,旨在增强用户和企业通信的安全性,其源代码于2011年被Twitter发布在GitHub开源数据库中。

    该软件允许用户将在Android设备上所有发送和接收的短信内容进行加密,还可以将加密信息发送给另一个TextSecure用户。

    28. XobotOS

    XobotOS是Xamarin的一个研究项目,用于将Android 4.0从Java/Dalvik移植到C#,并对移植后的性能及内存占用情况进行检测。

    29. ignition

    在编写Android应用时,通过提供即用组件和包含许多样板文件的实用类,ignition可以让你的Android应用快速起步。ignition涵盖的区域包括:

     

    • Widget、Adapter、Dialog等UI组件;
    • 允许编写简单却强大的网络代码的HTTP Wrapper库;
    • 加载远程Web图像并进行缓存的类;
    • 简单但有效的缓存框架(将对所有对象树做出响应的HTTP缓存到内存或硬盘中);
    • Intents、diagnostics等几个能让API级别更容易向后兼容的帮助类;
    • 更友好、更强大的AsyncTask实现。

     

    ignition包括三个子项目:

     

    • ignition-core——是一个可以直接编译到App中的Android库项目。
    • ignition-support——一个标准的Java库项目,被部署为一个普通的JAR,包含了大部分实用工具类。开发者可以独立使用该工程的核心模块。
    • ignition-location——一个可以直接编译到应用程序中的Android AspectJ库项目。能够让定位应用在不需要Activity位置更新处理的情况下获取到最新的位置信息。

     

    详情请参考:ignition Sample applications

    30. android_page_curl

    android_page_curl是一个在Android上使用OpenGL ES实现类似书本翻页效果的示例程序。(点击链接查看视频演示

    31. asmack

    说到aSmack,自然要先提提Smack。Smack API是一个完整的实现了XMPP协议的开源API库,而aSmack则是Smack在Android上的构建版本,于2013年2月初迁移到GitHub上,该资源库并不包含太多的代码,只是一个构建环境。开发者可以利用该API进行基于XMPP协议的即时消息应用程序开发。

    详情请参考:asmack

    32. AndroidBillingLibrary

    In-app Billing是一项Google Play服务,能够让你在应用内进行数字内容销售,可销售的数字内容范围非常广,包括媒体文件、照片等下载内容,还包括游戏级别、药剂、增值服务和功能等虚拟内容。Android Billing Library可以实现In-app Billing的所有规范,并提供更高级的类来进行使用。

    Google于2012年底正式发布了v3版Android In-app Billing,但截至目前,GitHub上的Android Billing Library还只能支持到v2版,据悉Google将于2013年初对它进行更新。

    详情请参考:Google Play In-app Billing

    33. Crouton

    Crouton是Android上的一个可以让开发者对环境中的Toast进行替换的类,以一个应用程序窗口的方式显示,而其显示位置则由开发者自己决定。

    开发者可以直接登陆Google Play下载安装Crouton Demo,查看应用演示。

    34. cwac-endless

    CommonsWare Android Components(CWAC)是一个开源的Android组件库,用来解决Android开发中各个方面的常见问题,每个 CWAC组件打包成一个独立的jar文件,其中就包含cwac-endless。

    cwac-endless提供一个EndlessAdapter,这是一个自动分页的List,当用户浏览到List最后一行时自动请求新的数据。

    详情请参考:Commons Ware

    35. DiskLruCache

    在Android应用开发中,为了提高UI的流畅性、响应速度,提供更高的用户体验,开发者常常会绞尽脑汁地思考如何实现高效加载图片,而DiskLruCache实现正是开发者常用的图片缓存技术之一。Disk LRU Cache,顾名思义,硬件缓存,就是一个在文件系统中使用有限空间进行高速缓存。每个缓存项都有一个字符串键和一个固定大小的值。

    点击链接下载该库项目。

    36. Android-SlideExpandableListView

    如果你对Android提供的Android ExpandableListView并不满意,一心想要实现诸如Spotify应用那般的效果,那么SlideExpandableListView绝对是你最好的选择。该库允许你自定义每个列表项目中的ListView,一旦用户点击某个按钮,即可实现该列表项目区域滑动。

    37. gauges-android

    Gaug.es for Android是由gaug.es推出的一款在Android设备上对网站流量数据进行实时统计的应用。gauges-android包含了该应用的源代码,开发者可以直接登陆Google Play下载安装该应用。

    38. acra

    ACRA是一个能够让Android应用自动将崩溃报告以谷歌文档电子表的形式进行发送的库,旨在当应用发生崩溃或出现错误行为时,开发者可以获取到相关数据。

    39. roboguice

    RoboGuice是Android平台上基于Google Guice开发的一个库,可以大大简化Android应用开发的代码及一些繁琐重复的代码。给Android带来了简单、易用的依赖注入,如果你使用过spring或Guice的话,你就会知道这种编程方式是多么的便捷。

    40. otto

    Otto是由Square发布的一个着重于Android支持的基于Guava的强大的事件总线,在对应用程序不同部分进行解耦之后,仍然允许它们进行有效的沟通。

    详情请参考:Otto

    原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 

    41.android-swipelistview

    SwipeListView是一个Android List View实现,实现了自定义ListView单元格,可通过滑动来显示扩展面板。开发者可直接登陆Google Play下载安装其Demo应用。 

    42. greenDAO

    greenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储、更新、删除和查询。

    greenDAO的主要设计目标:

    • 最大性能(最快的Android ORM)
    • 易于使用API
    • 高度优化
    • 最小内存消耗

    详情请参考:greendao-orm

    43. FFMpeg

    FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。FFmpeg是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。可以轻易地实现多种视频格式之间的相互转换。

    而FFmpeg for Android则是可通过Android NDK直接在Android源码环境下编译的FFmpeg库。该库项目即是FFmpeg for Android的入口,开发者只需直接选择需要转换的视频文件,并设置参数,即可进行转换,发起人havlenapetr表示在未来将为其开发Android库,能够实现自动转换视频文件。

    44. TweetLanes

    Tweet Lanes是一个在Android4.0及更高版本的Android设备上运行的功能全面的Twitter客户端(开发者可以直接登陆Google Play下载该应用)。

    该开源项目包含以下所有源代码:

    • Tweet Lanes客户端应用;
    • 连接Twitter和App.net APIs的SocialNetLib项目;
    • 所有源,尤其是LOGO和Play Store列表;
    • 用于tweetlanes.com的The App Engine项目。

    45.gesture-imageview

    这是一个简单的支持多指缩放图片的Android View类。在Android2.1及其更高版本的设备上,当你想要实现同时进行缩放操作时,可以将其作为一个标准的ImageView来使用。

    46.android-satellite-menu

    使用过Path的人都应该知道,在Path主界面的左下方有一个非常有意思的菜单。菜单由一个主按钮组成,当用户点击该按钮时,就会有一连串的按钮弹出,而Satellite Menu正是该菜单的一个开源版本。

    对于Satellite Menu,其项目发起人siyamed表示,这种菜单结构就像是一个星球四周围绕着许多卫星,而这也就是他为何会以Satellite Menu命名该项目的原因。

    47. VitamioBundle

    Vitamio是一款Android平台上的全能多媒体开发框架,凭借着其简洁易用的API接口,Vitamio赢得了全球众多开发者的青睐。目前,有许多公司的开源Vitamio项目都托管在GitHub上,而Vitamio的核心插件VitamioBundle正是其中之一。

    VitamioBundle是一个独立的Android库,用于促进多媒体的使用,开发者可以很方便地将其集成到自己的项目当中。

    48.android-ffmpeg-x264

    android-ffmpeg-x264是能够让提取和构建运行在Android上、使用Android NDK最新的FFmpeg和libx264变得非常简单的一个存储库。不同于大多数其他的NDK FFmpeg构建包,它通过配置构建库,只需一个非常小的Android.mk文件即可将其包装进入一个共享库。目前,该库项目已不再更新,但在GitHub上还有着非常多的FFmpeg库,除了前面的FFmpeg,接下来我们还会继续介绍到其他FFmpeg库。

    49. ArcMenu

    ArcMenu是一个类似于iOS版Path 2.0菜单的Android自定义视图项目,和我们前面介绍的Satellite Menu项目类似。

    对于这个项目,其发起人daCapricorn表示,iOS版Path 2.0上的用户体验非常奇妙,但其Android版本却差太多。因此,他就尝试着在Android上做出像iOS版本那样的效果,而事实也的确如此。

    50. DataDroid

    DataDroid是Android平台上的一个开发库,用于简化Android应用当中的数据管理,基于Android的RESTful封装发展而来。

    详情请参考:datadroidlib

    51.android-adt-templates

    android-adt-templates是集成了Android开发过程中使用到的许多常用的模板,用来帮助开发者快速构建一些普通的Activity和UI模型。

    当然,要想使用这些模板,还必须是Eclipse和ADT 21及其以上版本,此外还需注意的一点就是,ADT模板不管理官方支持库以外的外部依赖关系。

    52.android-ffmpeg

    FFmpeg有许多不同的库,也总是会让人容易混淆,因此该项目发起人n8fr8对android-ffmpeg项目进行了全新的改变,该项目中包含着一个清晰、容易改变、静态的Android FFmpeg Creator。

    53.
    StaggeredGridView

    该项目是基于Google Android StaggeredGridView进行修改的一个库项目,允许开发者创建一个类似于Pinterest的交错排列的GridView。开发者只需在自己的项目中将其作为一个库项目添加到workspace中即可直接使用。

    54. robospice

    RoboSpice是Repo的开源Android库,能够让编写异步网络请求变得非常简单。它专门用于网络请求,通过使用Spring Android或者Google Http
    Client
    等扩展模块可支持REST请求。

    如果想要了解更多,不妨点击链接查看RoboSpice大图,让你30秒即可完全了解RoboSpice。如果想要立即使用,则可以直接进入WiKiRoboSpice-samples页面。

    55. EventBus

    当一个Android应用功能越来越多的时候,保证应用的各个部分之间高效的通信将变得越来越困难。如何优雅地解决这个问题?这时候,就需要使用到EventBus。

    EventBus是GreenRobot出品的Android系统的一个Event Bus类库,使用起来和之前我们所介绍的Square的Otto差不多,都是用来简化应用组件之间的通信。

    延伸阅读:EventBus和Otto使用介绍

    56. commandergenius

    commandergenius是SDL库的端口,在project/jni/application目录下还包含有几个个人游戏的源代码或补丁。

    57. android-rss

    Android RSS是Android平台上RSS 2.0阅读软件的一个轻量级Android库。

    详情请参考:Code.Google

    58. OpenCV-Android

    OpenCV-Android是一个将OpenCV移到Android手机平台的开源项目,该项目使用OpenCV最新的一个分支并利用一个改良过的Android
    NDK进行构建。

    如果想要使用OpenCV-Android,必须先下载并安装Android SDK
    1.6(或其更高版本)和NDK r5,除此之外,还必须具备:

    • Android手机(可能需要与其他手机相连);
    • QuickTime Java库(如果想要使用QTWebcamBroadcaster就必须具备)。

    59. RESTProvider

    RESTProvider旨在让访问REST服务(或任何主要的HTTP调用的网络数据格式)更容易,并将其缓存到本地的一个SQLite数据库中,允许脱机使用。可自动解析RESTful API,并将其响应到Android的一个Provider中。

    60.
    ImageFilterForAndroid

    在开源ImageFilterForAndroid中拥有许多丰富的图片效果,是由来自国内的代震军发起的一个开源项目。除了Android平台,还有Windows Phone和iOS移动平台,三个平台源码同步。

    ImageFilter库图片效果对比:

    详情请参考:代震军BLOG

    61.
    Android-Image-Cache

    Android-Image-Cache是一个能够自动判断从内存还是网络获取图片、缓存可以自动回收、自动判断如何有效地生成并检索各种尺寸缩略图的图像download-and-cacher。

    主要特点如下:

    • 只需提供一个适配器即可从光标读取本地、网络URL;
    • 基于一个已下载的图像自动生成并缓存多种尺寸图像;
    • 同时提供磁盘缓存和内存缓存;
    • 自动磁盘缓存管理;不需进行设置,但如果需要的话,参数可进行调整;
    • 根据现有设置进行运作;
    • 光标适配器支持一个ImageView中多个图像字段;当是null或为空时自动跳过;
    • 当加载光标时,光标适配器会有一个自动进度提示条。

    62. FFmpeg-Android

    为Android neon、armv7、vfp、armv6及用于Android的VPlayer构建FFmpeg。

    63.
    roman10-android-tutorial

    roman10-android-tutorial包含了android tutorial的所有源代码。

    64. tape

    Tape是Square推出的Android和Java的一组队列关系类。

    详情请参考:**Square.GitHub**

    65.
    AndroidSideMenu

    AndroidSideMenu能够让你轻而易举地创建侧滑菜单。需要注意的是,该项目自身并不提供任何创建菜单的工具,因此,开发者可以自由创建内部菜单。

    66. Android-AppMsg

    Android-AppMsg是基于Toast消息提示和Cyril
    Mottier的“The making of Prixing #4: in-layout
    notifications
    ”而来的一个布局内通知实现。

    开发者可以直接登陆Google Play下载其示例应用

    67. proxydroid

    ProxyDroid是Android上的一个全局代理应用,遵循GPLv3协议,可以帮助你设置Android设备上的代理。proxydroid项目包含了ProxyDroid所有开放源代码。

    68. bypass

    Bypass可以跳过HTML,直接在Android和iOS上使用Markdown并进行渲染。Markdown是一种轻量级的标记语言,可以实现文本到HTML的转换。

    69. OnionKit

    OnionKit是一个可以通过提供多种路径来提高移动应用网络安全的Android库项目。

    该库具体提供:

    • StrongTrustManager:TLS/SSL证书校验的一个强大实现,任何认证中心都可以进行定制;
    • Proxied Connection Support:通过Apache HTTPClient库的特定配置来支持HTTP和HTTPS流量的HTTP和SOCKS代理连接;
    • OrbotHelper:一个支持Orbot:Tor for Android应用集成的工具类。

    70. android-ffmpeg

    如果想要实现Android FFmpeg编译,必须下载安装Android NDK,在开始编译之前,还必须更新FFmpeg库。

    71.
    AndroidUsbCamera

    Android Usb Camera是一款可以在Linux电脑上将Android手机直接当摄像头使用的客户端软件。先在手机上安装USB驱动,再安装该客户端软件,然后再在手机上安装usbwebcam.apk程序,打开USB调试模式并运行usbwebcam,通过USB线将电脑和手机相连接即可在PC上直接使用Android手机充当摄像头。

    72. Droidex

    Droidex可以将开发者附加的Android设备的屏幕内容复制到你的开发设备屏幕上。通常,如果你使用DroidEx来进行演示可谓是事半功倍,因为你可以直接将一台Android设备与笔记本或投影仪相连,而客户也可以通过这些设备来查看Android设备上的内容。

     

    此外,Droidex还可以用来演示那些不方便通过模拟器演示的内容,比如GPS或力口速器。

    73. andmake

    andmake是Android的CMake工具链文件。CMake是一个开源的跨平台自动化构建系统,可以编译源代码、制作程序库、产生适配器,还可以用任意的顺序构建可执行文件。

    74. ScreenCap

    ScreenCap是Android原生自带的截屏工具,通过调用底层,采取后台截屏的方式实现截屏。

    GitHub上受开发者欢迎的Android开源项目并不仅仅止于此,还有很多,并且还有许多同类开源项目,如果你感兴趣的话,可以直接登陆GitHub进行更加深入的学习了解。至此,GitHub上最受欢迎的Android开源项目盘点就全部结束了。

    原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea

    GitHub上优秀Android开源项目

    原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea

    GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上。更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。为此,CSDN特整理了在GitHub平台上最受欢迎的Android及iOS开源项目,以飨开发者。

    下面,就让我们一起来看看,在GitHub平台上,究竟有哪些Android开源项目最火,也最受开发者欢迎。

    1. ActionBarSherlock

    ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便地使用所有版本的Android动作栏的设计模式。

    对于Android 4.0及更高版本,ActionBarSherlock可以自动使用本地ActionBar实现,而对于之前没有ActionBar功能的版本,基于Ice Cream Sandwich的自定义动作栏实现将自动围绕布局。能够让开发者轻松开发一款带动作栏(Action bar)的应用,并且适用于Android 2.x及其以上所有版本。

    详情请参考:ActionBarSherlock

    2. facebook-android-sdk

    Facebook SDK for Android是一个开源库,允许开发者将Facebook集成到所开发的Android应用中。

    如果想要获取更多关于示例、文档、将SDK集成到App中、源代码等信息,可直接登陆Facebook Developers查看。

    3. SlidingMenuSlidingMenu Demos

    SlidingMenu是一个开源的Android库,能够让开发者轻松开发一款应用,实现类似于Google+、Youtube和Facebook应用中非常流行的滑动式菜单。

      

    使用SlidingMenu的Android应用:

     

     

    4. cocos2d-x

    移动开发领域,将Cocos2D-X用于主流iOS/Android游戏开发的公司、开发团队多不胜数。cocos2d-x是一个开源的支持多平台的2D游戏框架,使用C++开发,基于cocos2d-iphone,在MIT许可证下发布。主分支在GitHub上使用OpenGL ES 2.0渲染,而旧版gles11分支则使用OpenGL ES 1.1渲染。

    支持iOS、Android、Windows Phone 8、Bada、BlackBerry、Marmalade、Windows、Linux等多个平台。支持C++、Lua、JavaScript编程语言。

    5. android

    GitHub Android App是GitHub开源的Android客户端,支持Issues、Gists,并集成了新闻Feed,能够让你及时跟进组织及关注的开发者、库等。同时,该应用还提供了一个用户快速访问你所创建、监控及发布issue的面板,可查看并将问题加入到收藏夹,可对标签、里程碑和任务进行过滤配置。

    android资源库包含了GitHub Android App的所有源代码。

    6. Android-ViewPagerIndicator

    ViewPager指针项目,在使用ViewPager的时候能够指示ViewPager所在的位置,就像Google Play中切换的效果一样,还能使用在应用初始化的介绍页面。

    兼容Android支持库的ViewPager及ActionBarSherlock,最初是基于Patrik Åkerfeldt的ViewFlow,开发者可以直接登陆Google Play下载该项目的演示应用。

    7. MonoGame

    MonoGame是一个Microsoft XNA 4.x Framework的开源跨平台实现。用于让XNA开发者将他们在Xbox 360、Windows & Windows Phone上开发的游戏移植到iOS、Android、Mac OS X、Linux及Windows 8 Metro上,目前,PlayStation Mobile & Raspberry PI的开发正在进行中。

    详情请参考:MonoGame

    8. Android-PullToRefresh

    该项目用于为Android提供一个可重用的下拉刷新部件。它最初来源于Johan Nilsson的库(主要是图形、字符串和动画),但这些后来都已被取代。

    9. android-async-http

    android-async-http是Android上的一个异步、基于回调的HTTP客户端开发包,建立在Apache的HttpClient库上。

    10. Android-Universal-Image-Loader

    Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。

    Universal Image Loader for Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载。它最初来源于Fedor Vlasov的项目,且自此之后,经过大规模的重构和改进。

    11. GreenDroid

    GreenDroid最初是由Cyril Mottier发起,是一个Android的UI开发类库,能够让UI开发更加简便,并且在应用中始终保持一致。

    详情请参考:Cyril Mottier's Blog

    12. Anki-Android

    AnkiDroid是一个免费、开源的Android的闪存应用,可直接从Google Play进行下载。

    详情请参考:ankidroid

    13. android-actionbar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式。在大多数的情况下,当开发者需要突出展现用户行为或在全局导航的activity中使用action bar,因为action bar能够使应用程序给用户提供一致的界面,且系统能够很好地根据不同的屏幕配置来适应操作栏的外观。

    Action bar的主要目的:

     

    • 提供一个用于识别应用程序的标示和用户的位置的专用空间。
    • 在不同的应用程序之间提供一致的导航和视觉体验。
    • 突出Activity的关键操作,并且在可预见的方法内给用户提供快捷的访问。

     

    14. android-viewflow

    android-viewflow是Android平台上的一个视图切换的效果库,ViewFlow相当于Android UI部件提供水平滚动的ViewGroup,使用Adapter进行条目绑定。

     

    15. android-mapviewballoons

    当使用Android地图外部库(com.google.android.maps)时,android-mapviewballoons会提供一个简单的方式来对地图覆盖进行标注,就是一个简单的信息气泡。

    它由BalloonOverlayView组成,是一个代表显示你的MapView及BalloonItemizedOverlay的气泡的视图,BalloonItemizedOverlay是ItemizedOverlay的一个抽象扩展。

    16. PushSharp

    一个向iOS(iPhone/iPad APNS)、Android(C2DM和GCM)、Windows Phone和Windows 8设备发送推送通知的服务器端库。

    17. androidannotations

    Android Annotations是一个开源的框架,用于加速 Android应用的开发,可以让你把重点放在功能的实现上,简化了代码,提升了可维护性。

    18. HockeyKit

    Hockey是一个iOS Ad-Hoc自动更新框架。苹果App Store中的所有App都可以使用它,它能够显著地提高Beta测试的整个过程,分为两部分:服务器和客户端框架。服务器组件需要所有脚本,但在没有客户端库的情况下,也可以单独工作。它提供一个Web接口,Beta测试者可以使用它来安装最新的AdHoc配置文件,也可以直接在设备上通过Safari安装最新的Beta版本。

     

    • 只需在服务器上安装一次服务端,就可以处理包标识符不同的多个应用程序(有开发者强烈建议对Debug、AdHoc Beta和AppStore发布版使用不同的包标识符)。
    • 默认当App启动或唤醒时,客户端会从服务器检测更新,用户可以在设置对话框中进行修改:一天一次或手动检查更新。
    • 除了支持iOS,HokeyKit也支持Android平台,不过Android版还处在Alpha阶段,支持OTA及应用内更新。
    • 为HockeyKit用户提供服务器托管服务。

     

    19. android-menudrawer

    Android上的菜单展示风格各异,其中用得最多且体验最好的莫过于左右滑动来显示隐藏的菜单,android-menudrawer是一个滑动式菜单实现,允许用户在应用当中实现无缝导航。该项目具有多种菜单展示效果,其中最常见的就是通过屏幕边缘拖动或点击动作栏的“向上”按钮显示。

     

    实现功能:

     

    • 菜单可以沿着四个边放置。
    • 支持附加一个始终可见、不可拖动的菜单。
    • 菜单的内容和整个窗口都可以隐藏。
    • 可用于XML布局。
    • 显示当前可见屏幕的指示器。

     

    20. android-flip

    Aphid FlipView是一个能够实现Flipboard翻页效果的UI组件。

    以上为GitHub上最受欢迎的Android开源项目TOP20,敬请期待“GitHub上最受欢迎的Android开源项目(二)”。

     

    Android经典的开源项目其实非常多,但是国内的博客总是拿着N年前的一篇复制来复制去,实在是不利于新手学习。今天爬爬把自己熟悉的一些开源项目整理起来,希望能对Android开发同学们有所帮助。另外,如果你有比较好的项目推荐,也烦请在评论里分享出来,我会定期更新博客内容。

     

    项目篇:


    组件篇:

    • Android-Flip:可以实现类似FlipBoard那种华丽丽的翻页
    • Drag-Sort-Listview:可以拖动item重新排序的listview,效果非常赞
    • HoloEveryWhere:咳咳,有些同学非常喜欢Android的holo风格,这个项目绝对让你happy
    • Universal-ImageLoader:这个经典的异步图片加载,不多说了
    • JazzyViewPager:这玩意可以让ViewPager翻起来更酷,谁用谁知道~~
    • SlidingMenu:这个是抽屉界面(就是facebook那种)的各种实现版本中,最好的,木有之一!
    • StickyListHeaders:iPhone上经常有这个,就是listview的……不知道怎么解释,自己下载看看吧
    • Android-PullToRefresh:下拉刷新,挺常用的一个组件
    • StaggeredGridView:这是一个瀑布流布局的实现,还不是很完善,但作为学习的案例还是不错的
    • android-async-http:android的异步请求组件,我个人习惯使用asynctask,不过这个实现水平还是不错,也推荐给大家参考
    • ActionBarSherlock:大家熟知的ActionBar在2.x上的兼容性方案;类似的兼容性组件还有许多,有时间为大家一一列出;
    • facebook-android-sdk:不止是一个SDK那么简单哦,比某浪和某人的SDK强几个数量级;
    • NineOldAndroids:想在2.xSDK上使用Android 3.0新增的动画API,那就是它了;没用过的同学一定要试试哦,非常方便~
    • android-swipelistview:让listview的item可以向右滑动,新版Gmail和Pocket里面有用到哦~
    • DataDroid:Android的RESTful封装,没听过RESTful还说你有代码洁癖,追求完美
    • EventBus:和上面的DataDroid同样属于美化底层代码的,这个lib简化了不同组件之间的事件传递



    21. drag-sort-listview

    DragSortListView(DSLV)是Android ListView的一个扩展,支持拖拽排序和左右滑动删除功能。重写了TouchInterceptor(TI)类来提供更加优美的拖拽动画效果。

     

    DSLV主要特性:

     

    • 完美的拖拽支持;
    • 在拖动时提供更平滑的滚动列表滚动;
    • 支持每个ListItem高度的多样性
    • 公开startDrag()和stopDrag()方法;
    • 有公开的接口可以自定义拖动的View。

     

    DragSortListView适用于带有任何优先级的列表:收藏夹、播放列表及清单等,算得上是目前Android开源实现拖动排序操作最完美的方案。

    22. c-geo-opensource

    c:geo是Android设备上一个简单而又强大的非官方地理寻宝客户端。与其他类似应用不同的是,c:geo不需要Web浏览器,也不需要文件输出。你可以在毫无准备的情况下,毫无后顾之忧地带上你的智能手机去进行地理寻宝。当然,你也不需要付钱,因为它是免费的。

    c-geo-opensource包含了c:geo所有开源代码。

    详情请参考:c:geo

    23. NineOldAndroids

    自Android 3.0以上的版本,SDK新增了一个android.animation包,里面的类都是跟动画效果实现相关的,通过Honeycomb API,能够实现非常复杂的动画效果。但如果开发者想在3.0以下的版本中也能使用到这套API,那么Nine Old Androids就会是你最好的选择,该API和Honeycomb API完全一样,只是改变了你使用com.nineoldandroids.XXX的入口。

    该项目包含两个工程,一个是Library,即为动画效果的实现库,另一个则是Sample,是对如何使用该API的演示。开发者可以直接登陆Google Play下载安装Nine Old Androids Sample,查看演示。

    详情请参考:Nine Old Androids

    24. ppsspp

    PPSSPP是由GC/Wii模拟器Dolphin联合创始人之一Henrik Rydgård开发的一款免费的跨平台开源模拟器,支持Windows、Linux、Mac、Android、iOS、BlackBerry 10等主流计算机与移动操作系统,可直接工作在x86、x64、ARM等CPU平台上,以GNU GPLv2许可协议发布,主要使用C++编写以提高效率和可移植性。

    只要支持OpenGL ES 2.0,PPSSPP就可以在相当低规格的硬件设备上运行,包括基于ARM的手机及平板电脑。

    详情请参考:PPSSPP

    25. androidquery

    Android-Query(AQuery)是一个轻量级的开发包,用于实现Android上的异步任务和操作UI元素,可让Android应用开发更简单、更容易,也更有趣。

    26. droid-fu

    Droid-Fu是一个开源的通用Android应用库,其主要目的是为了让Android开发更容易,包含有许多工具类,还有非常易用的Android组件。

    Droid-Fu提供支持的领域包括:

     

    • Android应用的生命周期帮助
    • 支持处理Intents和diagnostics类
    • 后台任务支持
    • HTTP消息处理
    • 对象、HTTP响应及远程图像高速缓存
    • 定制各种Adapter及View

     

    Droid-Fu最大的优势在于它的应用生命周期帮助类,如果你正在开发一款Android应用,而它的主要任务是运行后台任务,比如从Web上抓取数据,那么,你一定会使用到Droid-Fu,不过,目前该项目在GitHub上已经停止更新维护。

    详情请参考:droid-fu

    27. TextSecure

    TextSecure是Whisper Systems团队开发的一个Android上的加密信息客户端,旨在增强用户和企业通信的安全性,其源代码于2011年被Twitter发布在GitHub开源数据库中。

    该软件允许用户将在Android设备上所有发送和接收的短信内容进行加密,还可以将加密信息发送给另一个TextSecure用户。

    28. XobotOS

    XobotOS是Xamarin的一个研究项目,用于将Android 4.0从Java/Dalvik移植到C#,并对移植后的性能及内存占用情况进行检测。

    29. ignition

    在编写Android应用时,通过提供即用组件和包含许多样板文件的实用类,ignition可以让你的Android应用快速起步。ignition涵盖的区域包括:

     

    • Widget、Adapter、Dialog等UI组件;
    • 允许编写简单却强大的网络代码的HTTP Wrapper库;
    • 加载远程Web图像并进行缓存的类;
    • 简单但有效的缓存框架(将对所有对象树做出响应的HTTP缓存到内存或硬盘中);
    • Intents、diagnostics等几个能让API级别更容易向后兼容的帮助类;
    • 更友好、更强大的AsyncTask实现。

     

    ignition包括三个子项目:

     

    • ignition-core——是一个可以直接编译到App中的Android库项目。
    • ignition-support——一个标准的Java库项目,被部署为一个普通的JAR,包含了大部分实用工具类。开发者可以独立使用该工程的核心模块。
    • ignition-location——一个可以直接编译到应用程序中的Android AspectJ库项目。能够让定位应用在不需要Activity位置更新处理的情况下获取到最新的位置信息。

     

    详情请参考:ignition Sample applications

    30. android_page_curl

    android_page_curl是一个在Android上使用OpenGL ES实现类似书本翻页效果的示例程序。(点击链接查看视频演示

    31. asmack

    说到aSmack,自然要先提提Smack。Smack API是一个完整的实现了XMPP协议的开源API库,而aSmack则是Smack在Android上的构建版本,于2013年2月初迁移到GitHub上,该资源库并不包含太多的代码,只是一个构建环境。开发者可以利用该API进行基于XMPP协议的即时消息应用程序开发。

    详情请参考:asmack

    32. AndroidBillingLibrary

    In-app Billing是一项Google Play服务,能够让你在应用内进行数字内容销售,可销售的数字内容范围非常广,包括媒体文件、照片等下载内容,还包括游戏级别、药剂、增值服务和功能等虚拟内容。Android Billing Library可以实现In-app Billing的所有规范,并提供更高级的类来进行使用。

    Google于2012年底正式发布了v3版Android In-app Billing,但截至目前,GitHub上的Android Billing Library还只能支持到v2版,据悉Google将于2013年初对它进行更新。

    详情请参考:Google Play In-app Billing

    33. Crouton

    Crouton是Android上的一个可以让开发者对环境中的Toast进行替换的类,以一个应用程序窗口的方式显示,而其显示位置则由开发者自己决定。

    开发者可以直接登陆Google Play下载安装Crouton Demo,查看应用演示。

    34. cwac-endless

    CommonsWare Android Components(CWAC)是一个开源的Android组件库,用来解决Android开发中各个方面的常见问题,每个 CWAC组件打包成一个独立的jar文件,其中就包含cwac-endless。

    cwac-endless提供一个EndlessAdapter,这是一个自动分页的List,当用户浏览到List最后一行时自动请求新的数据。

    详情请参考:Commons Ware

    35. DiskLruCache

    在Android应用开发中,为了提高UI的流畅性、响应速度,提供更高的用户体验,开发者常常会绞尽脑汁地思考如何实现高效加载图片,而DiskLruCache实现正是开发者常用的图片缓存技术之一。Disk LRU Cache,顾名思义,硬件缓存,就是一个在文件系统中使用有限空间进行高速缓存。每个缓存项都有一个字符串键和一个固定大小的值。

    点击链接下载该库项目。

    36. Android-SlideExpandableListView

    如果你对Android提供的Android ExpandableListView并不满意,一心想要实现诸如Spotify应用那般的效果,那么SlideExpandableListView绝对是你最好的选择。该库允许你自定义每个列表项目中的ListView,一旦用户点击某个按钮,即可实现该列表项目区域滑动。

    37. gauges-android

    Gaug.es for Android是由gaug.es推出的一款在Android设备上对网站流量数据进行实时统计的应用。gauges-android包含了该应用的源代码,开发者可以直接登陆Google Play下载安装该应用。

    38. acra

    ACRA是一个能够让Android应用自动将崩溃报告以谷歌文档电子表的形式进行发送的库,旨在当应用发生崩溃或出现错误行为时,开发者可以获取到相关数据。

    39. roboguice

    RoboGuice是Android平台上基于Google Guice开发的一个库,可以大大简化Android应用开发的代码及一些繁琐重复的代码。给Android带来了简单、易用的依赖注入,如果你使用过spring或Guice的话,你就会知道这种编程方式是多么的便捷。

    40. otto

    Otto是由Square发布的一个着重于Android支持的基于Guava的强大的事件总线,在对应用程序不同部分进行解耦之后,仍然允许它们进行有效的沟通。

    详情请参考:Otto

    原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 

    41.android-swipelistview

    SwipeListView是一个Android List View实现,实现了自定义ListView单元格,可通过滑动来显示扩展面板。开发者可直接登陆Google Play下载安装其Demo应用。 

    42. greenDAO

    greenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储、更新、删除和查询。

    greenDAO的主要设计目标:

    • 最大性能(最快的Android ORM)
    • 易于使用API
    • 高度优化
    • 最小内存消耗

    详情请参考:greendao-orm

    43. FFMpeg

    FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。FFmpeg是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。可以轻易地实现多种视频格式之间的相互转换。

    而FFmpeg for Android则是可通过Android NDK直接在Android源码环境下编译的FFmpeg库。该库项目即是FFmpeg for Android的入口,开发者只需直接选择需要转换的视频文件,并设置参数,即可进行转换,发起人havlenapetr表示在未来将为其开发Android库,能够实现自动转换视频文件。

    44. TweetLanes

    Tweet Lanes是一个在Android4.0及更高版本的Android设备上运行的功能全面的Twitter客户端(开发者可以直接登陆Google Play下载该应用)。

    该开源项目包含以下所有源代码:

    • Tweet Lanes客户端应用;
    • 连接Twitter和App.net APIs的SocialNetLib项目;
    • 所有源,尤其是LOGO和Play Store列表;
    • 用于tweetlanes.com的The App Engine项目。

    45.gesture-imageview

    这是一个简单的支持多指缩放图片的Android View类。在Android2.1及其更高版本的设备上,当你想要实现同时进行缩放操作时,可以将其作为一个标准的ImageView来使用。

    46.android-satellite-menu

    使用过Path的人都应该知道,在Path主界面的左下方有一个非常有意思的菜单。菜单由一个主按钮组成,当用户点击该按钮时,就会有一连串的按钮弹出,而Satellite Menu正是该菜单的一个开源版本。

    对于Satellite Menu,其项目发起人siyamed表示,这种菜单结构就像是一个星球四周围绕着许多卫星,而这也就是他为何会以Satellite Menu命名该项目的原因。

    47. VitamioBundle

    Vitamio是一款Android平台上的全能多媒体开发框架,凭借着其简洁易用的API接口,Vitamio赢得了全球众多开发者的青睐。目前,有许多公司的开源Vitamio项目都托管在GitHub上,而Vitamio的核心插件VitamioBundle正是其中之一。

    VitamioBundle是一个独立的Android库,用于促进多媒体的使用,开发者可以很方便地将其集成到自己的项目当中。

    48.android-ffmpeg-x264

    android-ffmpeg-x264是能够让提取和构建运行在Android上、使用Android NDK最新的FFmpeg和libx264变得非常简单的一个存储库。不同于大多数其他的NDK FFmpeg构建包,它通过配置构建库,只需一个非常小的Android.mk文件即可将其包装进入一个共享库。目前,该库项目已不再更新,但在GitHub上还有着非常多的FFmpeg库,除了前面的FFmpeg,接下来我们还会继续介绍到其他FFmpeg库。

    49. ArcMenu

    ArcMenu是一个类似于iOS版Path 2.0菜单的Android自定义视图项目,和我们前面介绍的Satellite Menu项目类似。

    对于这个项目,其发起人daCapricorn表示,iOS版Path 2.0上的用户体验非常奇妙,但其Android版本却差太多。因此,他就尝试着在Android上做出像iOS版本那样的效果,而事实也的确如此。

    50. DataDroid

    DataDroid是Android平台上的一个开发库,用于简化Android应用当中的数据管理,基于Android的RESTful封装发展而来。

    详情请参考:datadroidlib

    51.android-adt-templates

    android-adt-templates是集成了Android开发过程中使用到的许多常用的模板,用来帮助开发者快速构建一些普通的Activity和UI模型。

    当然,要想使用这些模板,还必须是Eclipse和ADT 21及其以上版本,此外还需注意的一点就是,ADT模板不管理官方支持库以外的外部依赖关系。

    52.android-ffmpeg

    FFmpeg有许多不同的库,也总是会让人容易混淆,因此该项目发起人n8fr8对android-ffmpeg项目进行了全新的改变,该项目中包含着一个清晰、容易改变、静态的Android FFmpeg Creator。

    53.
    StaggeredGridView

    该项目是基于Google Android StaggeredGridView进行修改的一个库项目,允许开发者创建一个类似于Pinterest的交错排列的GridView。开发者只需在自己的项目中将其作为一个库项目添加到workspace中即可直接使用。

    54. robospice

    RoboSpice是Repo的开源Android库,能够让编写异步网络请求变得非常简单。它专门用于网络请求,通过使用Spring Android或者Google Http
    Client
    等扩展模块可支持REST请求。

    如果想要了解更多,不妨点击链接查看RoboSpice大图,让你30秒即可完全了解RoboSpice。如果想要立即使用,则可以直接进入WiKiRoboSpice-samples页面。

    55. EventBus

    当一个Android应用功能越来越多的时候,保证应用的各个部分之间高效的通信将变得越来越困难。如何优雅地解决这个问题?这时候,就需要使用到EventBus。

    EventBus是GreenRobot出品的Android系统的一个Event Bus类库,使用起来和之前我们所介绍的Square的Otto差不多,都是用来简化应用组件之间的通信。

    延伸阅读:EventBus和Otto使用介绍

    56. commandergenius

    commandergenius是SDL库的端口,在project/jni/application目录下还包含有几个个人游戏的源代码或补丁。

    57. android-rss

    Android RSS是Android平台上RSS 2.0阅读软件的一个轻量级Android库。

    详情请参考:Code.Google

    58. OpenCV-Android

    OpenCV-Android是一个将OpenCV移到Android手机平台的开源项目,该项目使用OpenCV最新的一个分支并利用一个改良过的Android
    NDK进行构建。

    如果想要使用OpenCV-Android,必须先下载并安装Android SDK
    1.6(或其更高版本)和NDK r5,除此之外,还必须具备:

    • Android手机(可能需要与其他手机相连);
    • QuickTime Java库(如果想要使用QTWebcamBroadcaster就必须具备)。

    59. RESTProvider

    RESTProvider旨在让访问REST服务(或任何主要的HTTP调用的网络数据格式)更容易,并将其缓存到本地的一个SQLite数据库中,允许脱机使用。可自动解析RESTful API,并将其响应到Android的一个Provider中。

    60.
    ImageFilterForAndroid

    在开源ImageFilterForAndroid中拥有许多丰富的图片效果,是由来自国内的代震军发起的一个开源项目。除了Android平台,还有Windows Phone和iOS移动平台,三个平台源码同步。

    ImageFilter库图片效果对比:

    详情请参考:代震军BLOG

    61.
    Android-Image-Cache

    Android-Image-Cache是一个能够自动判断从内存还是网络获取图片、缓存可以自动回收、自动判断如何有效地生成并检索各种尺寸缩略图的图像download-and-cacher。

    主要特点如下:

    • 只需提供一个适配器即可从光标读取本地、网络URL;
    • 基于一个已下载的图像自动生成并缓存多种尺寸图像;
    • 同时提供磁盘缓存和内存缓存;
    • 自动磁盘缓存管理;不需进行设置,但如果需要的话,参数可进行调整;
    • 根据现有设置进行运作;
    • 光标适配器支持一个ImageView中多个图像字段;当是null或为空时自动跳过;
    • 当加载光标时,光标适配器会有一个自动进度提示条。

    62. FFmpeg-Android

    为Android neon、armv7、vfp、armv6及用于Android的VPlayer构建FFmpeg。

    63.
    roman10-android-tutorial

    roman10-android-tutorial包含了android tutorial的所有源代码。

    64. tape

    Tape是Square推出的Android和Java的一组队列关系类。

    详情请参考:**Square.GitHub**

    65.
    AndroidSideMenu

    AndroidSideMenu能够让你轻而易举地创建侧滑菜单。需要注意的是,该项目自身并不提供任何创建菜单的工具,因此,开发者可以自由创建内部菜单。

    66. Android-AppMsg

    Android-AppMsg是基于Toast消息提示和Cyril
    Mottier的“The making of Prixing #4: in-layout
    notifications
    ”而来的一个布局内通知实现。

    开发者可以直接登陆Google Play下载其示例应用

    67. proxydroid

    ProxyDroid是Android上的一个全局代理应用,遵循GPLv3协议,可以帮助你设置Android设备上的代理。proxydroid项目包含了ProxyDroid所有开放源代码。

    68. bypass

    Bypass可以跳过HTML,直接在Android和iOS上使用Markdown并进行渲染。Markdown是一种轻量级的标记语言,可以实现文本到HTML的转换。

    69. OnionKit

    OnionKit是一个可以通过提供多种路径来提高移动应用网络安全的Android库项目。

    该库具体提供:

    • StrongTrustManager:TLS/SSL证书校验的一个强大实现,任何认证中心都可以进行定制;
    • Proxied Connection Support:通过Apache HTTPClient库的特定配置来支持HTTP和HTTPS流量的HTTP和SOCKS代理连接;
    • OrbotHelper:一个支持Orbot:Tor for Android应用集成的工具类。

    70. android-ffmpeg

    如果想要实现Android FFmpeg编译,必须下载安装Android NDK,在开始编译之前,还必须更新FFmpeg库。

    71.
    AndroidUsbCamera

    Android Usb Camera是一款可以在Linux电脑上将Android手机直接当摄像头使用的客户端软件。先在手机上安装USB驱动,再安装该客户端软件,然后再在手机上安装usbwebcam.apk程序,打开USB调试模式并运行usbwebcam,通过USB线将电脑和手机相连接即可在PC上直接使用Android手机充当摄像头。

    72. Droidex

    Droidex可以将开发者附加的Android设备的屏幕内容复制到你的开发设备屏幕上。通常,如果你使用DroidEx来进行演示可谓是事半功倍,因为你可以直接将一台Android设备与笔记本或投影仪相连,而客户也可以通过这些设备来查看Android设备上的内容。

     

    此外,Droidex还可以用来演示那些不方便通过模拟器演示的内容,比如GPS或力口速器。

    73. andmake

    andmake是Android的CMake工具链文件。CMake是一个开源的跨平台自动化构建系统,可以编译源代码、制作程序库、产生适配器,还可以用任意的顺序构建可执行文件。

    74. ScreenCap

    ScreenCap是Android原生自带的截屏工具,通过调用底层,采取后台截屏的方式实现截屏。

    GitHub上受开发者欢迎的Android开源项目并不仅仅止于此,还有很多,并且还有许多同类开源项目,如果你感兴趣的话,可以直接登陆GitHub进行更加深入的学习了解。至此,GitHub上最受欢迎的Android开源项目盘点就全部结束了。

    原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea


    .

    3. Android开发神器

    网上有很多开源的安卓代码库很好用,对于刚学习安卓的童鞋亦或者老鸟都是很好的学习对象。
    我平时有关注开源代码的习惯,这么多年也搜集了不少精彩的源码。
    到后来发现自己手机里装的都是几百个demo app,删又不舍得删,不删又占资源,
     于是就准备搞了个23code应用,里面汇集了我精心整理的应用,
    此后每周应该都会更新。敬请期待。。。

    百度下载链接
    谷歌市场下载

    当前版本集成了68个开源示例。

     

    更新日志

     v1.0 添加如下
    HoloColorPicker
    Square-progressbar
    ParallaxScrollView
    JazzyViewPager
    CircularProgressBar
    LeftLockedGallery
    GPUImage
    Bootstrap
    SwipToDismiss
    GifView
    LockPatternGenerator
    NewQuickAction3D
    SlidingDrawer
    SwitchButton
    TabCarouselDemo
    ActionsContentView
    ArcMenu
    【11月30号】v1.1 添加如下:
    ProgressWheel,
    Movies-demo,
    SlideExpanableListView,
    XlistView,
    Android-Universal-Image-LoaderCardslib, 
    Cardsui

    【12月2号】v1.2 添加如下
    ProgressWheel,
    Movies-demo,
    SlideExpandableListView,
    XlistView,
    Universal-Image-Loader,
    Cardsui,
    CardsLib,
    PinnedSectionList,
    HoloGraphLibrary,
    AChartEngine,
    QuickScroll,
    ListViewAnimations,
    MenuDrawer,
    ViewPagerIndicator,
    PhotoView,
    Android-ViewBradger,
    RangeBar,
    ProgressButton,
    PagerSlidingTabStrip.
    ActionBar-PullToRefresh,
    Cropper,
    ExpandingCells,
    InsertingCells,
    NewPopupMenu,
    RangeSeekBar,
    HanselAndGretel,
    PagedDragDropGrid,
    QuickReturnListView,
    WizardPager

    【12月9号】添加记录如下:

    NoboringActionBar,

    StickGridHeaders,

    MessageBar,
    AndroidOpenGLESLessons,
    SuperToasts,
    SmoothProgressBar,
    ColorArt,
    FadingActionBar,
    FlipImageView,
    DatetimePicker,
    Satelitemenu
    【12月18号】添加如下:
    Android-pulltorefresh
    NineOldAndroid
    GlowPadView
    CustomShapeImageView
    ShareEveryWhere
    RoundImageView
    AutoScaleTextView
    IconicDroid
    Radial-menu-widget
    android-wheel
    androidwheel
    ChipsTextFields
    妈妈再也不用担心我当程序员啦



    way

    http://blog.csdn.net/way_ping_li

    老罗

    http://blog.csdn.net/column/details/androidluo.html

    李宁

    http://blog.csdn.net/nokiaguy


    robin
    http://blog.csdn.net/hudashi

    guolin
    http://blog.csdn.net/sinyu890807?viewmode=list


    wangli

    http://blog.csdn.net/lee576


    UI设计
    http://www.cnblogs.com/playing/category/286537.html

    UI进阶
    http://blog.csdn.net/column/details/uidev.html

    时之沙

    http://blog.csdn.net/t12x3456

    张国威
    http://blog.csdn.net/hellogv

    张兴业

    http://blog.csdn.net/xyz_lmn

    夏安明

    http://blog.csdn.net/xiaanming

    黄俊东

    http://blog.csdn.net/hjd_love_zzt

    四方城
    http://blog.csdn.net/kesenhoo

    柳志超

    http://liuzhichao.com/archives

    stonecao

    http://blog.csdn.net/stonecao

    短裤党
    http://gundumw100.iteye.com/

    左潇龙

    http://www.cnblogs.com/zuoxiaolong/p/pattern26.html

    引路蜂

    http://blog.csdn.net/mapdigit

    云在千峰

    http://blog.chengyunfeng.com/

    农民伯伯
    http://www.cnblogs.com/over140/

    玄机逸士
    http://blog.csdn.net/pathuang68/article/category/784453

    谷歌的代码
    http://code.google.com/intl/zh-CN/

    EOE归类
    http://www.eoeandroid.com/topic-tag.html

    qinjuning

    http://blog.csdn.net/qinjuning

    jj120522
    http://blog.csdn.net/jj120522

    IT-Homer
    http://blog.csdn.net/sunboy_2050

    傲慢的上校
    http://blog.csdn.net/aomandeshangxiao

    FireOfStar

    http://blog.csdn.net/think_soft

    浪人的星空
    http://blog.csdn.net/hitlion2008

    nkmnkm的专栏

    http://blog.csdn.net/nkmnkm

    深入Android
    http://www.cnblogs.com/duguguiyu/category/112850.html

    google的bug

    http://code.google.com/p/android/issues/detail?id=30767

    stackoverflow
    http://stackoverflow.com/questions/tagged/android

    ACE(照片开源)
    http://blog.csdn.net/ACE1985/article/category/944280/1

    Android_Tutor
    http://blog.csdn.net/Android_Tutor?viewmode=contents

    Android开源项目
    http://luckerme.com/archives/41.html






    前言:
          无论你是android的初学者,还有是android开发多年的高手,可能都会有很多想法和经验希望与人分享交流,渴望能够接触到更多的实战项目,正所谓所谓与高手论道才能互补所长,与英雄共鼎方能百尺竿头,一味的  织履贩席闭门造车只能固步自封成为井底之蛙,笔者特意将研究过的开源软件花费大量时间和精力逐一悉心修改整理调试发布,确保完美质量,以飨读者
          以下部分资源设置积分限制,如果有着急需的同学可以给我邮件或者加入我们的技术交流群(173711587),海量资源一键下载,共同探讨和分享技术资源。

    相信自己,只要努力学习勤奋工作用不了多久你就会升职加薪出任CTO迎娶白富美走上人生巅峰。。。
           
    想想是不是还有些小激动呢,赶快去下载吧 
     

    开源分享(点击标题下载源码):

    2.oschina客户端

      

    3.手机安全管家

      

    4.星座连萌

      

    5.玲闹铃

      

    6.魔乐盒

      

    7.PWP日历

      

    8.Apollo音乐播放器

      

    9.夏普名片识别

      

    10.高仿人人网

      

    11.简洁天气

      

    12.高仿开心网

      

    13.百度推聊

      

    14.餐厅订餐

      

    15.eoe客户端

      

    16.饭否网客户端

      

    17.imiPhoneWall

      

    18.k9mail

           

    19.MSD音乐

      

    20.高仿爱奇艺

      

    21.企信通

      

     22.高仿生日管家

      


    23.PM25

       

    24.高仿陌陌

           
       

    26.CB资讯阅读

         
     

    27.幽秘

      
     

    30.MIUI录音机

           

    31.MIUI指南针

           

    32.高仿微信

           
    如没有CSDN积分的同学可以加入我们的技术交流群(173711587),海量资源等你来拿
    欢迎大家补充和讨论,  文章持续更新,请关注我的博客,  更多精彩还在后面。。。。








    1.Java基础视频 

    《张孝祥JAVA视频教程》完整版[RMVB](东西网)

    历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播客)

    张孝祥2010年贺岁视频:Java高新技术(传智播客)

    Java多线程与并发库高级应用(传智播客)

    尚学堂JAVA视频下载大全(持续更新中...请关注!)(尚学堂)

    《动力节点,王勇JAVA系列视频教程》(东西网)

    张孝祥Java高新技术(学习资料网)

    Java视频教程(最适合Java初学者的经典入门视频)(传智播客)

    《马士兵 JAVA JSP视频教程》尚学堂科技(尚学堂)

    尚学堂科技_马士兵_JAVA视频教程》(百度空间)

    《尚学堂马士兵 手把手java视频教程》第二版(东西网)

    java视频教程、java教学视频、java视频下载大全(尚学堂)

    Java语言资源列表(东西网)

    Java私塾Java初级教程(学习资料网)

    Java精品学习视频教程下载汇总(大家论坛)

    上海交大最新版JAVA程序设计(学习资料网)

    JAVA私塾基础视频教程(PlaySoft网)

    JAVA教程/视频教程类专题资料(学习资料库网)

     

    2.SSH相关视频 

    hibernate视频教程(华为网盘)

    王胜Hibernate(资源共享)

    王胜Hibernate(零度软件园)

    北京圣思园Hibernate视频教程(学习资料库)

    struts2实用简洁版视频(传智播客)

    传智播客Hibernate视频教程(传智播客)

    传智播客Spring5视频教程(传智播客)

    咿呀网提供-SpringMVC0视频教程(iteye)

    JAVA系列教材-Spring6_尚学堂科技(西西软件园)

    《Spring MVC0 WEB开发系列视频教程(全套共6讲--约400分钟)》(iVeryCD)

    《hibernate视频教程,spring视频教程--老卢JAVA》(北风网)

    Struts+Spring+Hibernate开发入行真功夫(19一九下载)

    《浪曦原创Struts.Hibernate.Spring.JS.分页视频教程(全)》(零度软件园)

    《疯狂Java_疯狂软件_李刚老师_Struts2全套视频教程》(北风网)

    struts2实用简洁版视频(传智播客)

    《浪曦视频教程 Struts 2应用开发详解系列》(东西网)

    张卫_Struts1视频教程2012年第一版源码(华为网盘)

    张卫_Struts1_Hibernate...教程2012年第一版源码(华为网盘)

    《北京圣思园struts2教学视频》(SimpleCD)

    SpringMvc+Spring+Mybatis+Maven整合视频教程(百度云网盘)

    JNI视频教程(传智播客)

    传智播客_FTP视频教程(传智播客)

    oracle视频教程(内部经典)(传智播客)

    OA+工作流(JBPM)(传智播客)

    Ajax和Jquery基础入门视频(传智播客)

    8天快速掌握Android视频(完整版--适合有JavaWeb基础学习)(传智播客)

    张孝祥Java就业面试宝典(传智播客)

    《传智播客:spring3/jdbc/EJB0/ajax/hibernate/Struts/java视频教程》(传智播客)

    30天轻松掌握JavaWeb视频(黑马)

    Java/.Net/PHP/网页平面设计(传智播客)

    传智播客_张孝祥_java基础教程(华为网盘)

    传智播客_方立勋JavaWeb视频教程_web开发入门(第四天)(华为网盘)

    《传智播客_张孝祥java视频教程_11_javaweb/javascript/java》(java\javascript\javaweb\courses)(资源共享)

    《传智播客张孝祥java视频教程_13_struts/javascript/java》(VeryCD)

    《传智播客张孝祥java视频教程_13_struts/javascript/java》(iVeryCD)

    Hibernate视频教程(适合掌握了javaweb的学员)(黑马)

    《传智播客:spring3\jdbc\EJB0\ajax\hibernate\Struts\java视频教程》(SPRING5\AJAX\JAVA\JNI\FTP\AJAX\ibatis\OA\JDBC)(VeryCD)

    《spring5视频教程》AVI 传智播客(东西网)

    传智播客_spring5视频教程(华为网盘)

    传智播客_2010_struts2.1.8视频教程(华为网盘)

    Hibernate视频教程(尚学堂)

     

    3.JavaEE相关视频

    《尚学堂科技.马士兵.JAVA视频教程(java培训内部视频)10年2月9日更新(更新Spring0)》(资源共享)

    老卢JAVA(老卢JAVA网)

    JavaSE视频教程(最适合Java初学者的经典入门视频)(尚学堂)

    传智播客JDBC视频教程(传智播客)

    JavaWEB开发(JSP+Servlet)视频(传智播客)

    30天轻松掌握JavaWeb视频(传智播客)

    北京圣思Java培训教学视频(资源共享网)

    《张卫 JavaWeb视频教程》2011版(求索网)

    Lucene/WebService/SVN/Ant/SpringMVC视频(学习资料库网)

    JUnit和Ant视频教程(VeryCD社区)

    广州Java培训WebService视频教程(疯狂软件)

    北京圣思员Java.Web培训视频(迅雷快传)

    传智播客EJB0视频教程(传智播客)

    传智播客JPA详解视频教程(传智播客)

    ibatis视频教程(传智播客)

    传智播客JAVA邮件开发视频教程(传智播客)

    传智播客FCKeditor视频教程(传智播客)

    传智播客_ibatis视频教程(华为网盘)

    《幻想—iBATIS框架技术视频教程》(资源共享)

    《Java教学视频_孔浩老师》开始更新JavaWeb方面的视频(更新了MyBatis部分的视频)(北风网)

     

    3.前端技术视频

    传智播客AJax视频教程(传智播客)

    JavaScript详解高清视频教程打包下载(iteye)

    精通JavaScript+jQuery 视频教程及源码(西西软件园)

    lamp兄弟连高洛峰JavaScript视频教程(华为网盘)

    《JavaScript基础视频教程》不断更新...[压缩包](资源共享)

    《21天学通JavaScript》视频教程+源码(东西网)

    JavaScript基础视频教程(学习资料库)

    《北风网资深讲师李炎恢JavaScript视频教程》(19一九下载)

    《JavaScript视频教程》(Top JavaScript Tech Videos)(iVeryCD)

    JavaScript视频教程》(Top JavaScript Tech Videos)(北风网)

    《LAMP兄弟连JavaScript视频教程》11月14日更新(敏学网)

    《后盾网盾友 JQuery 视频教程 》(资源共享)

    jquery视频教程下载(网易博客)

    JQuery实战(学习资料库)

    Jquery精品视频教程(iteye)

    JavaScript网页开发(传智播客)

    毕向东Html、css、JavaScript视频教程(黑马)

    传智播客.Net培训—JQuery(华为网盘)

    网页平面设计视频(传智播客)

     

    3.Linux相关视频

    《尚学堂 linux 3 天绝版》linux操作系统视频教程(东西网)

    《Linux从入门到精通》随书视频教程(东西网)

    RHCE视频教程下载(Linux公社)

    周立发linux视频教程(ChinaUnix)

    linux视频教程(百度云网盘)

    韩顺平Linux(iteye)

    韩顺平 linux视频教程(华为网盘)

    Linux视频教程(传智播客)

     

    4.Android视频

    Java/安卓/C++/.Net(ITjob网)

    Android项目视频教程(学习资料库)

    《Sundy‘s《Android高级应用开发课程共享版》《Android开发视频教程》[压缩包](资源共享)

    Android视频全套教程免费批量下载(华为网盘)

    《Android开发教程【更新项目实战】》发布项目实战第20课[MP4](VeryCD)

    Android开发视频教学(CSND)

    8天快速掌握Android视频

    Android黑马培训视频

    Mars老师Android视频

     

    5.数据库相关视频

    数据库SQL Server/Oracle/MySQL/DB2教程类专题资料(学习资料网络)

    《2011版李兴华主讲-ORACLE实战 最强大的数据库课程[增加网盘下载]》(ORACLE)V2011(VeryCD)

    Oracle/Linux系列免费视频教程(cuug)

    《oracle 视频教程》chinaitlab(敏学网)

    《CBT Nuggets出品甲骨文11g数据库1Z0-051SQL基础考试视频教程》(资源共享)

    尚观国际oracle入门到精通OCP认证教学视频(迅雷快传)

    oracle视频教程(内部经典)(黑马)

     

    6.项目实战视频

    巴巴运动网视频教程(传智播客)

    银行业务调度系统(传智播客)

    交通灯管理系统(传智播客)

    java网上在线支付实战视频(传智播客)

    俄罗斯、贪吃蛇游戏-项目视频(传智播客)

     

     

     Java程序员进化为架构师掌握的知识

    一:Java知识
    1、进制转换
    2、Java基本数据类型
    面向对象相关知识
    3、类、接口、抽象类
    this关键字、static关键字、final关键字
    方法的参数传递机制
    Java垃圾回收机制
    四种内部类的实现方式
    方法重写(override)与重载(overload)的联系与区别通过多态实现程序代码的松耦合
    Java 异常体系详解(checked exception 与 unchecked exception)
    JDK 5.0 新特性(泛型、枚举、可变参数、增强的 for 循环、静态导入等)
    JavaAnnotation(使用系统内置 Annotation、自定义Annotation、Annotation的继承等)
    Java多线程机制详解(锁、synchronized关键字、sleep()方法、wait()方法、notify() 、notifyAll()方法的意义与联系)
    Java线程池的内部实现
    Java定时任务内部实现
    Java I/O编程(装饰模式详解)
    Java网络编程基础知识(Socket、URL、URLConnection、ServerSocket等)
    TCP与 UDP的联系与区别
    Java Collection API(Collection、List、Set、Map、ArrayList、LinkedList、 Vector、 HashSet、 TreeSet、 HashMap与TreeMap等)区别,适用场景
    常用设计模式(工厂方法模式、观察者模式、策略模式、装饰模式、模板方法模式、命令模式等的原理与应用)
    Java NIO详解
    java.util.concurrent 并发包的应用(ConcurrentHashMap核心源代码分析、ThreadPoolExecutor、FutureTask、Semaphore、Condition、ReentrantReadWriteLock等接口与类的深度分析)
    基于 JDK 1.4 锁的并发机制与基于 JDK 5.0并发包的同步与并发机制的比较与分析
    序列化与反序列化
    正则表达式的应用
    Java动态代理与反射机制
    Java代码的执行机制
    源代码编译机制
    类加载与执行机制
    JVM内存管理(内存空间、内存分配、内存回收)
    使用 JConsole、JVisualVM及 JMap等查看内存的使用状况
    分析程序执行的过程
    JVM线程资源同步及交互机制
    线程交互机制与状态分析
    Java文件操作相关,递归删除,递归读取
    JDBC相关知识,步骤,连接操作,数据库连接池(详解 Apache DBCP数据库连接池)
    移位操作 (左移n位==乘以2的n次幂) (右移n位==除以2的n次幂)

    二、算法
    各种排序算法:快速排序、归并排序、插入排序等等
    斐波切纳函数
    二分查找
    全排列
    二叉树的遍历
    定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)
    字符串反转
    前缀树
    最大堆,最小堆
    Hash算法及HashMap算法
    ConcurrentLinkedHashMap(LRU)
    BloomFilter
    LIRS算法 LIRS的基本思想是对访问的数据块进行分类,一部分为hot数据块,一部分为cold数据块。对于hot数据块我们可以分配90%以上的cache给它们。而对于cold数据块给它们分配10%。
    从LIRS算法的描述来看,可以理解为两个LRU队列的组合,利用cold缓冲区来保护Hot缓冲区,提高了进入hot缓冲区的门槛,阻止hot缓冲区频繁地变化。

    三、数据库
    MySQL存储引擎
    mysql优化
    mysql HA解决方案
    sql语句优化
    NoSQL相关

    四、文件系统
    Linux主流文件系统
    EXT3与EXT4文件系统
    主流分布式文件系统分析与对比
    分布式文件系统

    五、系统相关
    共享内存实现机制
    mmap的实现原理与机制
    copy on write技术
    zero copy技术

    六、网络相关
    OSI七层网络模型
    TCP/IP交互流程
    HTTP访问流程

    七、大型网站架构
    负载均衡技术及其原理
    智能DNS解析,原理,实现方案
    squid web加速及缓存技术
    网页静态化

     

     

     

     Android精品开源项目整理(持续更新中..)

     

    如有更多更好的资源欢迎大家跟帖分享。。。




    分类: 【Programmer's life】  2014-02-21 00:03   570人阅读   评论(1)   收藏   举报

    淘宝技术委员会是由淘宝技术部高级技术人员组成的一个组织,共分为Java分会C/C++分会算法分会数据分会UED分会测试分会系统分会七个分会。
    淘宝技术委员会的愿景是淘宝成为技术人才向往的乐土,高级技术人员的发源地;技术委员会的使命是帮助淘宝建立业界一流的技术团队。同时,技术委员会也是技术人员间交流技术和想法的一个平台。

    淘宝技术博客:

    数据分会 淘宝DBA http://www.taobaodba.com/

    UED分会 http://ued.taobao.com/

    测试分会 套测试:http://www.taobaotest.com/


    ==========Java牛人=========================================

    Java牛人:

    华黎(曾宪杰):淘宝技术委员会JAVA分会会长。  

    blog: http://blogjava.net/vanadies10

    先后在中科院下属企业、先锋电子(中国)等企业就职,是一个桌面管理系统的  软件公司的联合创始人并负责总体技术工作。参与过邮政省级地市集中化生产作业系统的设计开发以及大型企业内部桌面管理安全系统的设计和开发。07年6月加入淘宝,从负责消息中间件、数据层到整个Java中间件以及现在的通用产品,主要的工作都在中间件和  一些通用产品部分,在高可用和容灾方面,也有  一些经验。比较熟悉C++和Java,在多线程、并发、网络通信方面有一定的经验,对于JVM、分布式系统有  一些了解。对新技术有浓厚的兴趣。目前负责淘宝网通用产品团队,致力于更好的支持业务开发团队。

    一粟(朱鴻)、

    blog: http://hugozhu.myalert.info/

    weibo: http://weibo.com/hugozhu

    2009年2月加入淘宝,目前负责淘宝广告三大产品线的业务前端系统架构。参加过淘宝直通车重构,搜索前端,广告日志,报表平台,消息通知引擎,无线广告平台等系统设计和实现。对互联网应用各方面的技术都感兴趣,比较关注的方向有:应用开发框架,分布式存储和搜索系统,大流量网站架构,并行计算,移动平台和前端技术等; 
    在加入淘宝前: 
    1. 1999年~2002年浙大读研期间在阿里巴巴兼职开发网站应用; 
    2. 2003年~2005年在美国洛杉矶从事网络应用开发;  
    3. 2005年~2008年在美国Yahoo负责搜索前端及其相关应用的开发。

    玄难(墙辉)

    有12年的电信移动CRM和BOSS系统的领域建模和技术架构经验,并带领团队完成以年为单位上百人的大型项目实施工作。 建立过一套J2EE基础开发平台。涉及前台UI的组件化和自动化,服务的定义和注册管理,数据的O-R Mapping、规则引擎、包括Process、Workflow、BPM、PageFlow的流程平台。系统的自动化部署,系统的个层面的运行期监控。在各种类型的项目和开发人员中得到了很好的应用。 
    对问题域的抽象建模和偏业务的技术架构有浓厚的兴趣和一定的实践经验。崇尚系统的模型简单、架构简单、代码简单为美。 
    2009年8月加入淘宝,负责汇金系统【汇金系统:是淘宝自有服务和第三方服务的售卖方式和价格定义、销售、服务开通、分成结算和最后的财务核算系统】的技术架构和团队管理工作。


    孤城(李杰)、

    个人基本上在淘宝成长,大部分时间在负责后台相关的业务和技术工作。先后接触参与过CRM(原淘宝后台)、HECLA、拍卖、营销、会员、UIC、评价、汇金、物流宝等业务系统; 
    并努力推动TBOSS的业务平台和技术平台体系建设,有幸能够参与构建一个相对完整的业务和技术体系。 
    追求架构中人、业务、技术的平衡之道。 
    比较熟悉领域建模、架构;对服务化的技术框架、工具,大规模业务处理的技术平台构建有些想法和实践。

    范禹(吴泽明)、

    在淘宝一直在做业务系统的开发:开始是论坛、会员相关的功能,中间参与B2C平台开发,然后是B2C、C2C平台的整合 。当前在做系统稳定性、性能优化等相关的工作。

    毕玄(林昊)、

    blog: http://www.blogjava.net/BlueDavy

    07年加入淘宝,07—10年主要负责服务框架的实现,目前此服务框架大范围的在淘宝使用,每天经过服务框架的请求量为120亿+,目前主要负责online海量数据存储和分析的实现。在加入淘宝前,主要从事政府软件的开发,对OSGi有很强烈的兴趣。 
    关键字: JVM SOA 高并发 高可用 网络通信 NoSQL

    放翁(岑文初)、

    blog: http://blog.csdn.net/cenwenchu79

    weibo: http://weibo.com/fangweng

    06年3月加入阿里巴巴CRM团队,07年初参加阿里软件创业团队,主要负责阿里软件基础平台(SAAS平台),08年初与淘宝合作开发阿里巴巴最早的开放平台。09年离开阿里云基础团队转入淘宝,主要负责开放平台整体架构的设计和核心框架的实现,为开放平台在安全,性能,可用性上实现了一系列的框架和工具:分布式数据统计分析集群框架,异步化Web请求处理PipeComet框架等等。对开放平台的授权,服务接入,访问控制都有一些技术创新。在阿里巴巴的5年工作中已经被受理了10多项专利,主要分布在开放平台架构,开放服务安全算法,系统并发处理优化设计。 
    关键字:开放平台,分布式计算,Web请求异步化

    空望(魏虎)、

    weibo:http://weibo.com/skyhope 

    06年底加入淘宝,先后负责过 机票系统、CTU、UIC、Forest、TTM、淘江湖、终搜等产品和系统,涉及淘宝业务系统范围较广。 目前在商品线带领推荐系统和收藏夹团队。 熟悉java web编程、多线程编程、搜索引擎、数据挖掘及nosql相关技术,对系统性能调优也有丰富的经验。 
    关键字:网站性能优化、分布式系统、系统架构设计等

    褚霸(余锋)
    淘宝网任资深技术专家,专注高性能容错分布式服务器的研究和实现

    ==============C++牛人======================================

    C++牛人:

    立忠(张立中)、

    2005加入B2B,从事Isearch的开发 
    2006借调雅虎,P4P平台开发 
    2007加入阿里妈妈,广告平台及数据平台开发 
    2008并入淘宝,广告算法架构师  
    擅长领域:搜索引擎,广告引擎,大型分布式系统,实时系统。

    五福(沈加翔)、

    目前担任淘宝搜索的技术负责人,研究员。 
    99年中科院计算所硕士毕业后加入朗讯中国贝尔实验室从事通信  软件研发; 
    02年加入 雅虎中进入垂直搜索技术领域,离开时是搜索团队的技术负责人; 
    05年加入雅虎美国搜索技术团队,带领中美两地的技术团队负责雅虎中国全网搜索全系 统技术的研发。 
    08年加入阿里巴巴,历经B2B、阿里云和淘宝,完成了商品搜索引擎在包括淘宝搜索和B2B搜索广告等核心业务领域的平台化,解决 了扩展性问题,也获得了巨大的整体收益;启动建设了新一代商品搜索和全文检索一体化的搜索引擎平台和全网内容抓取平台,为阿里集团的搜索技术拓展 至全网奠定了坚实的基础。

    本空(徐绿兵)、

    前,在电子部就职1年,第一次接触到互联网;在新浪就职9年,转变为互联网建设的参与者,先后负责过新浪的即时通讯软件、财经频道股票数 据平台、企业广场后台、爱问引擎等项目的设计和开发。
    熟悉C/C++、Java、Perl,在网络通信、分布式计算、搜索技术有一定经验,喜欢脚 本语言和混合语言编程,对面向对象技术了解深刻,追求代码的可读性、扩展性和可维护性。
    在淘宝的经历:
    07年6月加入阿里妈妈,负责广告数据引擎的建设和维护,期间负责对引擎的代码做了一次大的重构,引擎、数据更新、数据转存的框架一直沿用至淘宝 直通车引擎;
    08年9月转入大淘宝,进入新成立的广告架构技术部,作为和广告引擎技术相关的架构师,参与了直通车2.0引擎架构设计、夸父通讯中间件的架构设 计;
    09年10月开始成为代码质量组成员,编写了C/C++代码规范,为推进C++单元测试而努力。


    多隆(蔡景现)

    2003加入淘宝,做过php,java开发, 参与过 isearch开发, 设计并开发过tfs, tair  
    在淘宝的经历: 
    2003: php开发 
    2004 ~ 2005: 参与denali开发 
    2006: 参与isearch 开发, tbstore的开发(类似tair) 
    2007 ~ 2009: tfs的开发, tair的开发, tbnet的开发 
    2010: squid的改进 
    2011: 高性能服务器框架开发

    ========算法牛人================================== 

    算法牛人:

    鬼脚七(文德)、

    毕业于天津大学自动化学院,之后在海量科技从事自然语言处理的研发工作,  
    2004年6月加入雅虎, 2008年加入阿里妈妈, 08年9月加入淘宝. 先后负责广告技术部, 搜索与算法技术部. 
    关键字(熟悉的领域):网页搜索、广告技术、自然语言处理、机器学习

    精忍(吴凯)、

    2010年3月加入淘宝。在搜索算法团队工作,现负责北京主搜索算法团队,工作包括个性化搜索、Query改写(省略、纠错)、检索粒度控制(分词索引、多粒度检索)、用户引导(相关搜索、下拉提示)等 
    加入淘宝前,在百度做网页搜索相关性方面的工作,包括Query分析、Ranking架构优化、用户行为分析等,对搜索相关性有较多经验  
    再之前,在微软亚洲工程院\研究院做商品搜索的研发,主要做商品聚合的算法研发。

    铁相(吴雪军)、

    主要从事网页搜索、广告系统、自然语言处理等方面的技术研发。2004年初,加盟百度,带领技术人员研发了百度的新一代的网盟广告系统,从无到期组建了百度自然语言处理部,担任百度网盟广告系统、自然语言处理部、大搜索部网页分析的技术负责人。 
    曾任百度  软件工程师、高级工程师、科学家 
    天涯社区 技术副总裁  
    2010年9月,正式加盟淘宝网,主要负责淘宝广告算法系统的研发、建立和完善淘宝广告算法技术体系、推进淘宝广告系统的技术发展。

    青峰(王志榮)、

    学习经历: 
    南京大学计算机本科,复旦大学和Carnegie Mellon University硕士,研究方向语音识别;  
    工作经历: 
    1)美国Siebel Systems公司:研发CRM领域的客户关系数据挖掘问题; 
    2)美国Yahoo Inc:研发搜索网页反作弊,网页文本分类以及排序等相关课题。  
    淘宝经历: 
    08年7月加入Alimama,08年10月加入淘宝搜索中心,负责淘宝搜索算法领域,致力于淘宝数据的分析,挖掘,建模工作,从query分析,导航,搜索排序,搜索反作弊等方向提升淘宝搜索用户体验。

     

    ========数据(库)牛人=============================

    数据(库)牛人:

    正祥(阳振坤)

    1984年进入北京大学,先后获得数学学士、硕士以及计算机博士学位后留校,1997年破格晋升为教授,1999年成为北京大学首批“长江学者奖励计划”特聘教授之一,先后获得北京市科学技术进步奖一等奖、国家科学技术进步奖一等奖(排名第四)、第六届中国青年科技奖、北京市五四青年奖等。 
    曾先后担任方正研究院副院长、北大计算机研究所副所长、联想研究院首席研究员、微软亚洲研究院主任研究员、百度高级科学家等 。近年来的主要研究领域是云计算和海量数据库等。


    泽远(王磊)、

    毕业于华中科技大学。 
    曾就职于腾讯,从事互联网平台产品与中间件开发和维护工作。先后参与和主导过Tencent Web Server,消息中间件,高性能业务框架、SOA基础设置、规则引擎、分布式KV数据库的开发。爱好开发各种工具提高工作效率并且自娱自乐。其中XTools运维工具箱发布到内网后,一天内达到800+的下载量,并获得了ponyma的热心点评。 
    2010年加入淘宝,从事淘宝海量数据仓库的平台化建设工作。主导和参与过的项目有,Dbloader优化,DataX开发,数据同步稳定性与性能提升、提升刀锋项目,指标系统,天网调度,告警平台,Witon数据服务平台。目前为数据平台架构组组负责人,专注的领域是分布式计算、存储和海量数据仓库架构。爱技术,也爱产品,关注技术背后的商业价值,理想是为淘宝数据开发之路贡献力量。


    云铮(张清)、

    2002年毕业于浙江大学计算机系,2003年初加入阿里巴巴,成功创建阿里巴巴dw,经历了阿里dw从创建到成熟运用。2005年,淘宝数据开始启动,调任淘宝,打造淘宝数据平台体系,推动商业智能体系建设,引入高端SAS,SPSS CLEMENTINE标准数据挖掘体系,并对第一批数据挖掘人员进行数据挖掘技术和实施流程培训。负责淘宝数据平台体系架构的每一次大的升级换代,历经oracle单机,到oracle RAC 4节点高端存储,到oracle RAC 12节点,到全球最大的oracle RAC 20节点,在到目前的2000台规模的hadoop 云梯分布式计算集群,数据体系在这些平台发展过程中平稳升级,对应用全透明,集群的规模在增加,任务job在 迅速扩展,得力于良好的应用架构,运维人员能轻松应对,实现高效,自动化运维。对国内外最新数据技术狂热,在和国内外业界行家交流和阿里,淘宝的实战中,糅合所学所见,无门无派,注重实效,自成一套淘宝数据体系建设和运用的实战方法。八年数据生涯的梦想是能够推动集团数据统一体系架构,为数据化运营,推动实现十年数据战略尽自己一份力。

    图海(王勇)、

    6年多的数据行业相关经验,2009年加入淘宝,参与了淘宝数据部门从RAC平台向分布式平台转变的全过程,成功的搭建和维护了符合淘宝数据业务的分布式平台(2000台的hadoop集群)。 
    主要关注于分布式系统的应用优化,对于分布式存储和计算有比较深入的了解,通过技术和业务的结合,成功实现了降低2/3的存储优化效果和提升一倍运行效率的计算优化。 
    在数据库、海量数据存储、分布式系统等方面具备深厚的理论  知识与实践经验,此外,对于Linux系统,脚本编程,架构设计方面也有比较浓厚的兴趣和经验。

    DBA:
    冯春培、

    七公汪海)、

    西毒(冯大辉)、
    支付宝资深DBA

    陈吉平(拖雷)
    weibo:   http://weibo.com/chenpiner

    ============  UED牛人  ============================================ 

    UED牛人:

    小马(赵泽欣)、

    加入淘宝之前基本在创业公司中度过,创业项目繁杂,角色兼顾产品开发/售前咨询/售后支持/客户培训。  
    加入淘宝后我的角色:第一位前端工程师 2006年10月加入淘宝网,幸运的成为淘宝第一位前端工程师。参与过旺铺、收藏夹、物流、Web旺旺和P4P等重要产品的前端开发,对淘宝整个交易流程做了系统的前端重构。 TBra开发者 2007年,结合项目逐步  整理制定出淘宝UED的前端规范和开发流程,积累形成最初的前端JavaScript类库TBra。前端性能布道士 2009年开始关注前端性能优化,组织虚拟团队优化淘宝各关键页面的前端性能,2010年负责技术委员会速度小组的工作。前端架构师 2010年开始带领前端架构团队,负责前端通用框架研发与推广,UDC核心业务支持和前端质量保障体系的建设。关键字(熟悉的领域): HTML5 JavaScript 前端架构 性能优化 可用性。

    清羽(周骞)、

    2005-2008 加入淘宝成为前端开发工程师前,做了3年Java工程师,ERP领域。投身于企业级应用的表现层框架及其工具的研究。 
    2008 加入淘宝,专注于前端开发领域。加入淘宝后的角色:淘宝众多后台系统开发 2008-2010 从模板系统到TMS到运营支撑线,参与负责了淘宝众多后台系统的前端开发及其架构工作。在开发团队中传播前端技术的主要推广实践者。 UED STS团队前端Leader 2010年开始带领STS前端团队,负责新人培养、开发培训、基础框架的研发推广。带领团队在多个业务线前端技术上取得进步。目前: STS团队 店铺前端技术目前,专注店铺业务线。旨在通过前端技术提升店铺用户体验。并有意在第三方前端接入及相关技术上深入探索。

    李牧(李穆)、

    2004年毕业于哈尔滨工业大学数学系。  
    2004-2006年就职于亚信科技,主要从事中石化,国航等大型企业人力资源管理系统前后台开发。2007年1月入职雅虎中国P4P部门,历经雅虎,阿里妈妈,淘宝网,进入阿里后逐步专注前端开发。 
    目前工作方向:  
    1.广告投放引擎前端开发,专注第三方广告代码安全性,稳定性隐患和性能问题解决方案  
    2.广告创意平台开发,通过淘宝BannerMaker和CreativeCenter产品,提供高速精美的创意在线DIY工具  
    3.广告业务系统OPOA化,推进广告业务系统OnePageOneApplication化,打造体验优秀,面向前后端开发者和IE6友好的OPOA整体解决方案

    玉伯 (王保平)、

    weibo: http://weibo.com/lifesinger

    2003-2006 年,中科院物理所研究生,Fortran 与 C 程序员,喜爱实验模拟和数值计算。 
    2006-2008 年,在中科院  软件所互联网实验室从事项目管理  软件的研发,C# 与 Java 爱好者。 2008 年 4 月份加入淘宝,就职于 UED 部门。主要工作:交易线开发:历经交易二期到四期,以及五彩石项目。对出价页面、退款流程和详情页面等前端代码做过,系统梳理和重构。 KISSY 类库: 是淘宝新一代前端类库 KISSY 的发起人和主要开发者。开发过 KISSY 核心、全网搜索提示、富文本编辑器、Switchache 等组件。目前已大规模应用在淘宝线上环境。前端架构团队: 2009 年起,组建前端架构团队,在首页维护、全网性能优化、类库研发、  知识沉淀、工具应用等方面取得了丰硕成果。是前端架构的探索与实践者。 2011 年转岗到产品技术-业务平台组。目前工作方向前端富应用开发的探索与实践、前端模块化框架 SeaJS 的开发与应用、网站性能优化与监控等一系列富含挑战和趣味的工作。

     

    ===========测试牛人==============================================

    测试牛人:

    公直(黄利)、

    2004年毕业于北航,先后在大唐  软件和上海微创  软件任职,经历电信BOSS项目、MSN MX、MAA等项目的数据中心部署测试、功能测试、性能测试等项目。 
    2008年8月加入淘宝,主要经历,负责广告技术基础平台产品测试;负责淘宝-阿里云合作项目飞天夸父项目的测试;负责淘宝广告技术测试工具研发;关键字(熟悉的领域):测试工具、自动化测试、敏捷测试。

    丘虚(郑昌丘)、

    2008年加入淘宝,2009年负责研发了淘宝的测试平台获2009淘宝年度创新大奖二等奖; 
    2010年负责建立了淘宝性能测试体系,团队合作完成淘宝《淘宝性能测试白皮书》.合作研发的CSP平台获得2010年研发部创新大奖; 
    熟悉  软件研发过程, 精通  软件测试技术和  软件测试自动化, 善于结合产品特性创新测试技术和测试策略,提升测试效率和测试深度.

    元逍(李中杰)、

    2004年毕业于清华大学,后一直在IBM中国研究院工作,参与的项目包括Web Services/业务流程/SOA测试、测试计划和优化、软件应用生命周期管理等。

    2011年7月加入淘宝,现任测试架构师。关键字(熟悉的领域):测试平台、测试生成、回归测试、测试计划、  软件工程。


    鹤云(马治国)、

    经历 产品 隶属于 微软 Emerging Market Group. 完整经历了产品从开始到消亡的4个版本。  
    亲自做过的,包括功能测试,性能测试(Web Service, NT Service, javascript, DB), 压力测试(Web Service, NT Service, DB),自动化测试, 在淘宝的经历: 09年,加入淘宝,目前负责 测试平台与发展的工作测试平台与发展介绍:http://twork.taobao.net/redmine/projects/testplatform/wiki

    ===============系统牛人==========================================

    系统牛人(硬件、网络、OS等):

    周明(周明)、

    04年初加入yahoo 中国 从事系统管理工作,后因工作需要,转战一拍,yahoo 、alibaba case 后回到yahoo 中国,08年初只身一人筹建阿里妈妈运维团队,半年的时间完成了IDC建设、运维体系建设、阿里妈妈广告平台从北京迁移到杭州、顶住近40亿广告PV的压力。08年9月并入淘宝,负责广告事业部的系统、PE、过程改进工作,2010年10月起负责淘宝系统运维工作,着力打造以人为本的运维体系,推进绿色、高效、低成本的基础平台建设。

    伯松(李勇)、

    blog: http://blog.coly.li/?from=yufeng

    一位活跃的内核社区开发者。在加入淘宝之前,一直从事Linux内核维护和开发工作,曾经是SuSE Linux内核组成员,目前在淘宝内核开发维护团队从事内核开发维护工作。2001年毕业于北京邮电大学,获得了管理工程专业的学士学位。在1999年时编写了第一个在Linux上的"hello world"程序,是Ext4,OCFS2, openSuSE等开源项目的活跃参与者,现在仍然靠为GNU/Linux编写开源  软件生活。

    正明(章文嵩)、

    weibo: http://weibo.com/wensong8

    2000年在国防科技大学获得博士学位。2000年共同创办集群网络,2003年共同创办Purplecomm,2009年9月加入淘宝。是Linux内核的开发者,著名的Linux集群项目--LVS (Linux Virtual Server)的创始人和主要开发人员,LVS集群代码已在Linux 2.4和2.6的官方内核中,并得到广泛的应用。在架构大型系统、系统软件开发、Linux操作系统、网络和软件开发管理上有着丰富的经验。他一直在自由软件的开发上花费时间,并积极推动开源活动在中国的发展。 在淘宝的经历:主要负责基础核心软件研发、推进网络软硬件方面的性能优化、搭建下一代高可扩展、低碳、低成本的淘宝电子商务基础设施。


    康伯(高山渊)

    2000年毕业于北京化工大学生物工程专业,之后北漂8年,做过销售、IT支持、互联网接入等工作,2004年开始进入互联网运维行业,2007年加入中国雅虎,2008年转入淘宝,现在负责淘宝CDN运维、云计算运维、虚拟化、系统优化等方面工作

    在公司主要经历的项目:alimama机房建设及异地迁移;云梯项目;CDN建设优化;虚拟化管理平台等项目。

    淘宝校园招聘官网:http://campus.taobao.com/ 
    淘宝招聘官方微博:http://weibo.com/staffing 
    淘宝大街网BBS专区:http://taobao.dajie.com/


    .
    作者 : finddreams

    分类: Android开发  2014-11-08 18:10   19人阅读   评论(0)   收藏   举报

    目录(?)[+]

        对于GitHub上开源项目的整理,很多博客都有写过。但是我觉得有些博客整理的开源项目过多,让我们看的眼花缭乱,以至于我们不知道该用哪一个好。所以为了更好的有利于初学者的学习,我从实战和易用性的角度重新整理这些优秀的开源项目,贪多无厌,一两个精品足以。

        这些开源项目可以分为UI类和框架类。UI类主要介绍那些自定义特性的View,包括ListView、ActionBar、ViewPager、Gallery、GridView、ImageView、ProgressBar等等。框架类的话有包含由快速开发框架Afinal,xUtils,以及Google开源的网络框架Volley.


          UI类:


       一、ListView

        1、android-pulltorefresh 

       一个强大的拉动刷新开源项目,支持各种控件下拉刷新
    ListView、ViewPager、WevView、ExpandableListView、GridView、(Horizontal
    )ScrollView、Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多。并且他实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验更好。
    项目地址:https://github.com/chrisbanes/Android-PullToRefresh
    Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/pull-to-refreshview-demo.apk?raw=true
    APP示例:新浪微博各个页面


          2、DragSortListView 

          拖动排序的ListView
    同时支持ListView滑动item删除,各个Item高度不一、单选、复选、CursorAdapter做为适配器、拖动背景变化等
    项目地址:https://github.com/bauerca/drag-sort-listview
    Demo地址:https://play.google.com/store/apps/details?id=com.mobeta.android.demodslv
    APP示例:Wordpress Android
           

         3、SwipelistView

           支持定义ListView左右滑动事件,支持左右滑动位移,支持定义动画时间  项目
    APP示例:微信   
      

         4、pinned-section-listview GroupName

         滑动到顶端时会固定不动直到另外一个GroupName到达顶端的ExpandListView项目地址:https://github.com/beworker/pinned-section-listview

    效果图:Renderings

         

         二、ActionBar

           1. ActionBarSherlock 

            为Android所有版本提供统一的ActionBar,解决4.0以下ActionBar的适配问题
    项目地址:https://github.com/JakeWharton/ActionBarSherlock
    Demo地址:https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.demos
    APP示例:太多了。。现在连google都在用


           2.ActionBar-PullToRefresh 

          下拉刷新,ActionBar出现加载中提示
    项目地址:https://github.com/chrisbanes/ActionBar-PullToRefresh
    Demo地址:https://play.google.com/store/apps/details?id=uk.co.senab.actionbarpulltorefresh.samples.stock
    APP示例:Gmail,Google plus,知乎等

        

         三、 Menu

             1.SlidingMenu 


           滑出式菜单,通过拖动屏幕边缘滑出菜单,支持屏幕左右划出,支持菜单zoom、scale、slide up三种动画样式出现。项目地址:https://github.com/jfeinstein10/SlidingMenu
    Demo地址:https://play.google.com/store/apps/details?id=com.slidingmenu.example
    APP示例:Foursquare, LinkedIn, Zappos, Rdio, Evernote Food, Plume, VLC for Android, ESPN ScoreCenter, MLS MatchDay, 9GAG, Wunderlist 2, The Verge, MTG Familiar, Mantano Reader, Falcon Pro (BETA), MW3 BarracksMenuDrawer和SlidingMenu比较:SlidingMenu支持菜单动画样式出现,MenuDrawer支持菜单view处于内容的上下层


        四、ViewPager 


             1.Android-ViewPagerIndicator 

          配合ViewPager使用的Indicator,支持各种位置和样式
    项目地址:https://github.com/JakeWharton/Android-ViewPagerIndicator
    Demo地址:https://play.google.com/store/apps/details?id=com.viewpagerindicator.sample
    APP示例:太多了。

        五、GridView

                 1、StaggeredGridView 

                 允许非对齐行的GridView

    类似Pinterest的瀑布流,并且跟ListView一样自带View缓存,继承自ViewGroup

    项目地址:https://github.com/maurycyw/StaggeredGridView

    Demo地址:https://github.com/Trinea/TrineaDownload/blob/master/staggered-gridview-demo.apk?raw=true
    APP示例:Pinterest等


         2.DraggableGridView Item

           可拖动交换位置的GridView,类似桌面的单屏效果

    项目地址:https://github.com/thquinn/DraggableGridView

    Demo地址:https://github.com/thquinn/DraggableGridView/blob/master/bin/DraggableGridViewSample.apk?raw=true

        

                六、ImageView

        1.PhotoView 

          支持双击或双指缩放的ImageView

        
    1.  在ViewPager等Scrolling view中正常使用,相比上面的AndroidTouchGallery,不仅支持ViewPager,同时支持单个ImageView

    1. 项目地址:https://github.com/chrisbanes/PhotoView

    1. Demo地址:https://play.google.com/store/apps/details?id=uk.co.senab.photoview.sample

    2.           
    3.           2.android-gif-drawable 

    4.           支持gif显示的view
      项目地址:https://github.com/koral--/android-gif-drawable
      用jni实现的,编译生成so库后直接xml定义view即可,而且本身不依赖于其他开源项目。

    5.         3.CircleImageView

      1. 圆形的ImageView
        项目地址:https://github.com/hdodenhof/CircleImageView
        效果图:Renderings


    6.                七、其他

    7.      1.android-square-progressbar

    8.       在图片周围显示进度
      项目地址:https://github.com/mrwonderman/android-square-progressbar
      Demo地址:https://play.google.com/store/apps/details?id=net.yscs.android.square_progressbar_example
      APP示例:square
    9.      2.SwipeBackLayout 

    10.        左右或向上滑动返回的Activity
      项目地址:https://github.com/Issacw0ng/SwipeBackLayout
      Demo地址:https://play.google.com/store/apps/details?id=me.imid.swipebacklayout.demo
      APP示例:知乎

    11.      3.achartengine 

            支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、拨号图/表、立方线图及各种图的结合 
    项目地址:  https://code.google.com/p/achartengine/ 
    官方网站:  http://www.achartengine.org/ 
    效果图:  Renderings 


    http://www.achartengine.org/dimages/combined_chart.png


    http://www.achartengine.org/dimages/budget_chart.png


    APP示例:Wordpress Android,Google Analytics

           

        4.AndroidWheel 

         支持城市、多种日期时间、密码、图片

    1. 项目地址:https://github.com/sephiroth74/AndroidWheel
      效果图:Renderings

         5.android-lockpattern 

           Android的图案密码解锁
    项目地址:https://code.google.com/p/android-lockpattern/
    Demo地址:https://play.google.com/store/apps/details?id=group.pals.android.lib.ui.lockpattern.demo
    使用介绍:https://code.google.com/p/android-lockpattern/wiki/QuickUse
    示例APP:Android开机的图案密码解锁,支付宝的密码解锁



          工具类:

            一、快速开发框架

            1.Afinal

     Afinal是一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。
    通过finalActivity,我们可以通过注解的方式进行绑定ui和事件。
    通过finalBitmap,我们可以方便的加载bitmap图片,而无需考虑oom等问题。
    通过finalDB模块,我们一行代码就可以对android的sqlite数据库进行增删改查。
    通过FinalHttp模块,我们可以以ajax形式请求http数据。
    GitHub 地址: https://github.com/yangfuhai/afinal
     

           2.xUtils

    xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...
    xUtils 包含了很多实用的android工具。

    xUitls最低兼容android 2.2 (api level 8)。

    GitHub 地址: https://github.com/wyouflf/xUtils/


        3. Android-Universal-Image-Loader

    Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。

    Universal Image Loader for Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载。它最初来源于Fedor Vlasov的项目,且自此之后,经过大规模的重构和改进。

    4.Android Volley

    在Google I/O 2013上,Volley发布了。Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。
    Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

     Volley主页: https://android.googlesource.com/platform/frameworks/volley


    先整理这些,后续如果有更好的开源框架再补充,或者各位读者推荐的补充上来,希望对你有所帮助!



    作者 : finddreams
    展开全文
  • 【转载】JAVA知识点集锦(上)

    千次阅读 2016-07-22 14:46:34
    - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。  - 继承:继承是从已有类得到继承信息创建新类的过程...

    1、面向对象的特征有哪些方面? 
    答:面向对象的特征主要有以下几个方面: 
    - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 
    - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。 
    - 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。 
    - 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

    2、访问修饰符public,private,protected,以及不写(默认)时的区别? 
    答:

    修饰符 当前类 同 包 子 类 其他包
    public
    protected ×
    default × ×
    private × × ×

    类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。

    3、String 是最基本的数据类型吗? 
    答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。

    4、float f=3.4;是否正确? 
    答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。

    5、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗? 
    答:对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。

    6、Java有没有goto? 
    答:goto 是Java中的保留字,在目前版本的Java中没有使用。(根据James Gosling(Java之父)编写的《The Java Programming Language》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)

    7、int和Integer有什么区别? 
    答:Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。 
    Java 为每个原始类型提供了包装类型: 
    - 原始类型: boolean,char,byte,short,int,long,float,double 
    - 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

    class AutoUnboxingTest {
    
        public static void main(String[] args) {
            Integer a = new Integer(3);
            Integer b = 3;                  // 将3自动装箱成Integer类型
            int c = 3;
            System.out.println(a == b);     // false 两个引用没有引用同一对象
            System.out.println(a == c);     // true a自动拆箱成int类型再和c比较
        }
    }

    最近还遇到一个面试题,也是和自动装箱和拆箱有点关系的,代码如下所示:

    public class Test03 {
    
        public static void main(String[] args) {
            Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
    
            System.out.println(f1 == f2);
            System.out.println(f3 == f4);
        }
    }

    如果不明就里很容易认为两个输出要么都是true要么都是false。首先需要注意的是f1、f2、f3、f4四个变量都是Integer对象引用,所以下面的==运算比较的不是值而是引用。装箱的本质是什么呢?当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,如果看看valueOf的源代码就知道发生了什么。

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

    IntegerCache是Integer的内部类,其代码如下所示:

    /**
         * Cache to support the object identity semantics of autoboxing for values between
         * -128 and 127 (inclusive) as required by JLS.
         *
         * The cache is initialized on first usage.  The size of the cache
         * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
         * During VM initialization, java.lang.Integer.IntegerCache.high property
         * may be set and saved in the private system properties in the
         * sun.misc.VM class.
         */
    
        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 =
                    sun.misc.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() {}
        }

    简单的说,如果整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的面试题中f1==f2的结果是true,而f3==f4的结果是false。

    提醒:越是貌似简单的面试题其中的玄机就越多,需要面试者有相当深厚的功力。

    8、&和&&的区别? 
    答:&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(""),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

    补充:如果你熟悉JavaScript,那你可能更能感受到短路运算的强大,想成为JavaScript的高手就先从玩转短路运算开始吧。

    9、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。 
    答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在静态区中。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。

    String str = new String("hello");

    上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而"hello"这个字面量放在静态区。

    补充:较新版本的Java(从Java 6的某个更新开始)中使用了一项叫"逃逸分析"的技术,可以将一些局部对象放在栈上以提升对象的操作性能。

    10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少? 
    答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。

    11、swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上? 
    答:在Java 5以前,switch(expr)中,expr只能是byte、short、char、int。从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型,从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

    12、用最有效率的方法计算2乘以8? 
    答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。

    补充:我们为编写的类重写hashCode方法时,可能会看到如下所示的代码,其实我们不太理解为什么要使用这样的乘法运算来产生哈希码(散列码),而且为什么这个数是个素数,为什么通常选择31这个数?前两个问题的答案你可以自己百度一下,选择31是因为可以用移位和减法运算来代替乘法,从而得到更好的性能。说到这里你可能已经想到了:31 * num 等价于(num << 5) - num,左移5位相当于乘以2的5次方再减去自身就相当于乘以31,现在的VM都能自动完成这个优化。

    public class PhoneNumber {
        private int areaCode;
        private String prefix;
        private String lineNumber;
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + areaCode;
            result = prime * result
                    + ((lineNumber == null) ? 0 : lineNumber.hashCode());
            result = prime * result + ((prefix == null) ? 0 : prefix.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            PhoneNumber other = (PhoneNumber) obj;
            if (areaCode != other.areaCode)
                return false;
            if (lineNumber == null) {
                if (other.lineNumber != null)
                    return false;
            } else if (!lineNumber.equals(other.lineNumber))
                return false;
            if (prefix == null) {
                if (other.prefix != null)
                    return false;
            } else if (!prefix.equals(other.prefix))
                return false;
            return true;
        }
    
    }

    13、数组有没有length()方法?String有没有length()方法? 
    答:数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。

    14、在Java中,如何跳出当前的多重嵌套循环? 
    答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环。(Java中支持带标签的break和continue语句,作用有点类似于C和C++中的goto语句,但是就像要避免使用goto一样,应该避免使用带标签的break和continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道更好)

    15、构造器(constructor)是否可被重写(override)? 
    答:构造器不能被继承,因此不能被重写,但可以被重载。

    16、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 
    答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。

    补充:关于equals和hashCode方法,很多Java程序都知道,但很多人也就是仅仅知道而已,在Joshua Bloch的大作《Effective Java》(很多软件公司,《Effective Java》、《Java编程思想》以及《重构:改善既有代码质量》是Java程序员必看书籍,如果你还没看过,那就赶紧去亚马逊买一本吧)中是这样介绍equals方法的:首先equals方法必须满足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)、传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null值的引用x,x.equals(null)必须返回false。实现高质量的equals方法的诀窍包括:1. 使用==操作符检查"参数是否为这个对象的引用";2. 使用instanceof操作符检查"参数是否为正确的类型";3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;4. 编写完equals方法后,问自己它是否满足对称性、传递性、一致性;5. 重写equals时总是要重写hashCode;6. 不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉@Override注解。

    17、是否可以继承String类? 
    答:String 类是final类,不可以被继承。

    补充:继承String本身就是一个错误的行为,对String类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。

    18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 
    答:是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和C#中可以通过传引用或传输出参数来改变传入的参数的值。在C#中可以编写如下所示的代码,但是在Java中却做不到。

    using System;
    
    namespace CS01 {
    
        class Program {
            public static void swap(ref int x, ref int y) {
                int temp = x;
                x = y;
                y = temp;
            }
    
            public static void Main (string[] args) {
                int a = 5, b = 10;
                swap (ref a, ref b);
                // a = 10, b = 5;
                Console.WriteLine ("a = {0}, b = {1}", a, b);
            }
        }
    }

    说明:Java中没有传引用实在是非常的不方便,这一点在Java 8中仍然没有得到改进,正是如此在Java编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修改的引用置于一个Wrapper类中,再将Wrapper对象传入方法),这样的做法只会让代码变得臃肿,尤其是让从C和C++转型为Java程序员的开发者无法容忍。

    19、String和StringBuilder、StringBuffer的区别? 
    答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

    面试题1 - 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?

    面试题2 - 请说出下面程序的输出。

    class StringEqualTest {
    
        public static void main(String[] args) {
            String s1 = "Programming";
            String s2 = new String("Programming");
            String s3 = "Program" + "ming";
            System.out.println(s1 == s2);
            System.out.println(s1 == s3);
            System.out.println(s1 == s1.intern());
        }
    }

    补充:String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。

    20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 
    答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

    面试题:华为的面试题中曾经问过这样一个问题 - "为什么不能根据返回类型来区分重载",快说出你的答案吧!

    21、描述一下JVM加载class文件的原理机制? 
    答:JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。 
    由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。 
    类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明:

    • Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
    • Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
    • System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。

    22、char 型变量中能不能存贮一个中文汉字,为什么? 
    答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。

    补充:使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是Unicode,当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以Java中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如InputStreamReader和OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务;对于C程序员来说,要完成这样的编码转换恐怕要依赖于union(联合体/共用体)共享内存的特征来实现了。

    23、抽象类(abstract class)和接口(interface)有什么异同? 
    答:抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

    24、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 
    答:Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的,如下所示。

    /**
     * 扑克类(一副扑克)
     * @author 骆昊
     *
     */
    public class Poker {
        private static String[] suites = {"黑桃", "红桃", "草花", "方块"};
        private static int[] faces = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
    
        private Card[] cards;
    
        /**
         * 构造器
         * 
         */
        public Poker() {
            cards = new Card[52];
            for(int i = 0; i < suites.length; i++) {
                for(int j = 0; j < faces.length; j++) {
                    cards[i * 13 + j] = new Card(suites[i], faces[j]);
                }
            }
        }
    
        /**
         * 洗牌 (随机乱序)
         * 
         */
        public void shuffle() {
            for(int i = 0, len = cards.length; i < len; i++) {
                int index = (int) (Math.random() * len);
                Card temp = cards[index];
                cards[index] = cards[i];
                cards[i] = temp;
            }
        }
    
        /**
         * 发牌
         * @param index 发牌的位置
         * 
         */
        public Card deal(int index) {
            return cards[index];
        }
    
        /**
         * 卡片类(一张扑克)
         * [内部类]
         * @author 骆昊
         *
         */
        public class Card {
            private String suite;   // 花色
            private int face;       // 点数
    
            public Card(String suite, int face) {
                this.suite = suite;
                this.face = face;
            }
    
            @Override
            public String toString() {
                String faceStr = "";
                switch(face) {
                case 1: faceStr = "A"; break;
                case 11: faceStr = "J"; break;
                case 12: faceStr = "Q"; break;
                case 13: faceStr = "K"; break;
                default: faceStr = String.valueOf(face);
                }
                return suite + faceStr;
            }
        }
    }

    测试代码:

    class PokerTest {
    
        public static void main(String[] args) {
            Poker poker = new Poker();
            poker.shuffle();                // 洗牌
            Poker.Card c1 = poker.deal(0);  // 发第一张牌
            // 对于非静态内部类Card
            // 只有通过其外部类Poker对象才能创建Card对象
            Poker.Card c2 = poker.new Card("红心", 1);    // 自己创建一张牌
    
            System.out.println(c1);     // 洗牌后的第一张
            System.out.println(c2);     // 打印: 红心A
        }
    }

    面试题 - 下面的代码哪些地方会产生编译错误?

    class Outer {
    
        class Inner {}
    
        public static void foo() { new Inner(); }
    
        public void bar() { new Inner(); }
    
        public static void main(String[] args) {
            new Inner();
        }
    }

    注意:Java中非静态内部类对象的创建要依赖其外部类对象,上面的面试题中foo和main方法都是静态方法,静态方法中没有this,也就是说没有所谓的外部类对象,因此无法创建内部类对象,如果要在静态方法中创建内部类对象,可以这样做:

        new Outer().new Inner();

    25、Java 中会存在内存泄漏吗,请简单描述。 
    答:理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存泄露。

    import java.util.Arrays;
    import java.util.EmptyStackException;
    
    public class MyStack<T> {
        private T[] elements;
        private int size = 0;
    
        private static final int INIT_CAPACITY = 16;
    
        public MyStack() {
            elements = (T[]) new Object[INIT_CAPACITY];
        }
    
        public void push(T elem) {
            ensureCapacity();
            elements[size++] = elem;
        }
    
        public T pop() {
            if(size == 0) 
                throw new EmptyStackException();
            return elements[--size];
        }
    
        private void ensureCapacity() {
            if(elements.length == size) {
                elements = Arrays.copyOf(elements, 2 * size + 1);
            }
        }
    }

    上面的代码实现了一个栈(先进后出(FILO))结构,乍看之下似乎没有什么明显的问题,它甚至可以通过你编写的各种单元测试。然而其中的pop方法却存在内存泄露的问题,当我们用pop方法弹出栈中的对象时,该对象不会被当作垃圾回收,即使使用栈的程序不再引用这些对象,因为栈内部维护着对这些对象的过期引用(obsolete reference)。在支持垃圾回收的语言中,内存泄露是很隐蔽的,这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响,极端情况下会引发Disk Paging(物理内存与硬盘的虚拟内存交换数据),甚至造成OutOfMemoryError。

    26、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰? 
    答:都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

    27、阐述静态变量和实例变量的区别。 
    答:静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。

    补充:在Java开发中,上下文类和工具类中通常会有大量的静态成员。

    28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用? 
    答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。

    29、如何实现对象克隆? 
    答:有两种方式: 
      1). 实现Cloneable接口并重写Object类中的clone()方法; 
      2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下。

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    public class MyUtil {
    
        private MyUtil() {
            throw new AssertionError();
        }
    
        public static <T> T clone(T obj) throws Exception {
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bout);
            oos.writeObject(obj);
    
            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bin);
            return (T) ois.readObject();
    
            // 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义
            // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放
        }
    }

    下面是测试代码:

    import java.io.Serializable;
    
    /**
     * 人类
     * @author 骆昊
     *
     */
    class Person implements Serializable {
        private static final long serialVersionUID = -9102017020286042305L;
    
        private String name;    // 姓名
        private int age;        // 年龄
        private Car car;        // 座驾
    
        public Person(String name, int age, Car car) {
            this.name = name;
            this.age = age;
            this.car = car;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Car getCar() {
            return car;
        }
    
        public void setCar(Car car) {
            this.car = car;
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
        }
    
    }
    /**
     * 小汽车类
     * @author 骆昊
     *
     */
    class Car implements Serializable {
        private static final long serialVersionUID = -5713945027627603702L;
    
        private String brand;       // 品牌
        private int maxSpeed;       // 最高时速
    
        public Car(String brand, int maxSpeed) {
            this.brand = brand;
            this.maxSpeed = maxSpeed;
        }
    
        public String getBrand() {
            return brand;
        }
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
    
        public int getMaxSpeed() {
            return maxSpeed;
        }
    
        public void setMaxSpeed(int maxSpeed) {
            this.maxSpeed = maxSpeed;
        }
    
        @Override
        public String toString() {
            return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]";
        }
    
    }
    class CloneTest {
    
        public static void main(String[] args) {
            try {
                Person p1 = new Person("Hao LUO", 33, new Car("Benz", 300));
                Person p2 = MyUtil.clone(p1);   // 深度克隆
                p2.getCar().setBrand("BYD");
                // 修改克隆的Person对象p2关联的汽车对象的品牌属性
                // 原来的Person对象p1关联的汽车不会受到任何影响
                // 因为在克隆Person对象时其关联的汽车对象也被克隆了
                System.out.println(p1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    注意:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种是方案明显优于使用Object类的clone方法克隆对象。让问题在编译的时候暴露出来总是优于把问题留到运行时。

    30、GC是什么?为什么要有GC? 
    答:GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用。 
    垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。

    补充:垃圾回收机制有很多种,包括:分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。标准的Java进程既有栈又有堆。栈保存了原始型局部变量,堆保存了要创建的对象。Java平台对堆内存回收和再利用的基本算法被称为标记和清除,但是Java对其进行了改进,采用“分代式垃圾收集”。这种方法会跟Java对象的生命周期将堆内存划分为不同的区域,在垃圾收集过程中,可能会将对象移动到不同区域: 
    - 伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说,这里是它们唯一存在过的区域。 
    - 幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里。 
    - 终身颐养园(Tenured):这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间。

    与垃圾回收相关的JVM参数:

    • -Xms / -Xmx — 堆的初始大小 / 堆的最大大小
    • -Xmn — 堆中年轻代的大小
    • -XX:-DisableExplicitGC — 让System.gc()不产生任何作用
    • -XX:+PrintGCDetails — 打印GC的细节
    • -XX:+PrintGCDateStamps — 打印GC操作的时间戳
    • -XX:NewSize / XX:MaxNewSize — 设置新生代大小/新生代最大大小
    • -XX:NewRatio — 可以设置老生代和新生代的比例
    • -XX:PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布
    • -XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:设置老年代阀值的初始值和最大值
    • -XX:TargetSurvivorRatio:设置幸存区的目标使用率

    31、String s = new String("xyz");创建了几个字符串对象? 
    答:两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象。

    32、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)? 
    答:接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。

    33、一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制? 
    答:可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。

    34、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口? 
    答:可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和回调。

    35、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制? 
    答:一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。

    36、Java 中的final关键字有哪些用法? 
    答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

    37、指出下面程序的运行结果。

    class A {
    
        static {
            System.out.print("1");
        }
    
        public A() {
            System.out.print("2");
        }
    }
    
    class B extends A{
    
        static {
            System.out.print("a");
        }
    
        public B() {
            System.out.print("b");
        }
    }
    
    public class Hello {
    
        public static void main(String[] args) {
            A ab = new B();
            ab = new B();
        }
    
    }

    答:执行结果:1a2b2b。创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。

    提示:如果不能给出此题的正确答案,说明之前第21题Java类加载机制还没有完全理解,赶紧再看看吧。

    38、数据类型之间的转换: 
    - 如何将字符串转换为基本数据类型? 
    - 如何将基本数据类型转换为字符串? 
    答: 
    - 调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型; 
    - 一种方法是将基本数据类型与空字符串("")连接(+)即可获得其所对应的字符串;另一种方法是调用String 类中的valueOf()方法返回相应字符串

    39、如何实现字符串的反转及替换? 
    答:方法很多,可以自己写实现也可以使用String或StringBuffer/StringBuilder中的方法。有一道很常见的面试题是用递归实现字符串反转,代码如下所示:

        public static String reverse(String originStr) {
            if(originStr == null || originStr.length() <= 1) 
                return originStr;
            return reverse(originStr.substring(1)) + originStr.charAt(0);
        }

    40、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 
    答:代码如下所示:

    String s1 = "你好";
    String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

    41、日期和时间: 
    - 如何取得年月日、小时分钟秒? 
    - 如何取得从1970年1月1日0时0分0秒到现在的毫秒数? 
    - 如何取得某月的最后一天? 
    - 如何格式化日期? 
    答: 
    问题1:创建java.util.Calendar 实例,调用其get()方法传入不同的参数即可获得参数所对应的值。Java 8中可以使用java.time.LocalDateTimel来获取,代码如下所示。

    public class DateTimeTest {
        public static void main(String[] args) {
            Calendar cal = Calendar.getInstance();
            System.out.println(cal.get(Calendar.YEAR));
            System.out.println(cal.get(Calendar.MONTH));    // 0 - 11
            System.out.println(cal.get(Calendar.DATE));
            System.out.println(cal.get(Calendar.HOUR_OF_DAY));
            System.out.println(cal.get(Calendar.MINUTE));
            System.out.println(cal.get(Calendar.SECOND));
    
            // Java 8
            LocalDateTime dt = LocalDateTime.now();
            System.out.println(dt.getYear());
            System.out.println(dt.getMonthValue());     // 1 - 12
            System.out.println(dt.getDayOfMonth());
            System.out.println(dt.getHour());
            System.out.println(dt.getMinute());
            System.out.println(dt.getSecond());
        }
    }

    问题2:以下方法均可获得该毫秒数。

    Calendar.getInstance().getTimeInMillis();
    System.currentTimeMillis();
    Clock.systemDefaultZone().millis(); // Java 8

    问题3:代码如下所示。

    Calendar time = Calendar.getInstance();
    time.getActualMaximum(Calendar.DAY_OF_MONTH);

    问题4:利用java.text.DataFormat 的子类(如SimpleDateFormat类)中的format(Date)方法可将日期格式化。Java 8中可以用java.time.format.DateTimeFormatter来格式化时间日期,代码如下所示。

    import java.text.SimpleDateFormat;
    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.util.Date;
    
    class DateFormatTest {
    
        public static void main(String[] args) {
            SimpleDateFormat oldFormatter = new SimpleDateFormat("yyyy/MM/dd");
            Date date1 = new Date();
            System.out.println(oldFormatter.format(date1));
    
            // Java 8
            DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
            LocalDate date2 = LocalDate.now();
            System.out.println(date2.format(newFormatter));
        }
    }

    补充:Java的时间日期API一直以来都是被诟病的东西,为了解决这一问题,Java 8中引入了新的时间日期API,其中包括LocalDate、LocalTime、LocalDateTime、Clock、Instant等类,这些的类的设计都使用了不变模式,因此是线程安全的设计。如果不理解这些内容,可以参考我的另一篇文章《关于Java并发编程的总结和思考》

    42、打印昨天的当前时刻。 
    答:

    import java.util.Calendar;
    
    class YesterdayCurrent {
        public static void main(String[] args){
            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.DATE, -1);
            System.out.println(cal.getTime());
        }
    }

    在Java 8中,可以用下面的代码实现相同的功能。

    import java.time.LocalDateTime;
    
    class YesterdayCurrent {
    
        public static void main(String[] args) {
            LocalDateTime today = LocalDateTime.now();
            LocalDateTime yesterday = today.minusDays(1);
    
            System.out.println(yesterday);
        }
    }

    43、比较一下Java和JavaSciprt。 
    答:JavaScript 与Java是两个公司开发的不同的两个产品。Java 是原Sun Microsystems公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发;而JavaScript是Netscape公司的产品,为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言。JavaScript的前身是LiveScript;而Java的前身是Oak语言。 
    下面对两种语言间的异同作如下比较: 
    - 基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因而它本身提供了非常丰富的内部对象供设计人员使用。 
    - 解释和编译:Java的源代码在执行之前,必须经过编译。JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。(目前的浏览器几乎都使用了JIT(即时编译)技术来提升JavaScript的运行效率) 
    - 强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型。 
    - 代码格式不一样。

    补充:上面列出的四点是网上流传的所谓的标准答案。其实Java和JavaScript最重要的区别是一个是静态语言,一个是动态语言。目前的编程语言的发展趋势是函数式语言和动态语言。在Java中类(class)是一等公民,而JavaScript中函数(function)是一等公民,因此JavaScript支持函数式编程,可以使用Lambda函数和闭包(closure),当然Java 8也开始支持函数式编程,提供了对Lambda表达式以及函数式接口的支持。对于这类问题,在面试的时候最好还是用自己的语言回答会更加靠谱,不要背网上所谓的标准答案。

    44、什么时候用断言(assert)? 
    答:断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、关键的正确性。断言检查通常在开发和测试时开启。为了保证程序的执行效率,在软件发布后断言检查通常是关闭的。断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为true;如果表达式的值为false,那么系统会报告一个AssertionError。断言的使用如下面的代码所示:

    assert(a > 0); // throws an AssertionError if a <= 0

    断言可以有两种形式: 
    assert Expression1; 
    assert Expression1 : Expression2 ; 
    Expression1 应该总是产生一个布尔值。 
    Expression2 可以是得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串消息。

    要在运行时启用断言,可以在启动JVM时使用-enableassertions或者-ea标记。要在运行时选择禁用断言,可以在启动JVM时使用-da或者-disableassertions标记。要在系统类中启用或禁用断言,可使用-esa或-dsa标记。还可以在包的基础上启用或者禁用断言。

    注意:断言不应该以任何方式改变程序的状态。简单的说,如果希望在不满足某些条件时阻止代码的执行,就可以考虑用断言来阻止它。

    45、Error和Exception有什么区别? 
    答:Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。

    面试题:2005年摩托罗拉的面试中曾经问过这么一个问题“If a process reports a stack overflow run-time error, what’s the most possible cause?”,给了四个选项a. lack of memory; b. write on an invalid memory space; c. recursive function calling; d. array index out of boundary. Java程序在运行时也可能会遭遇StackOverflowError,这是一个无法恢复的错误,只能重新修改代码了,这个面试题的答案是c。如果写了不能迅速收敛的递归,则很有可能引发栈溢出的错误,如下所示:

    class StackOverflowErrorTest {
    
        public static void main(String[] args) {
            main(null);
        }
    }

    提示:用递归编写程序时一定要牢记两点:1. 递归公式;2. 收敛条件(什么时候就不再继续递归)。

    46、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后? 
    答:会执行,在方法返回调用者前执行。

    注意:在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。显然,在finally中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,Java中也可以通过提升编译器的语法检查级别来产生警告或错误,Eclipse中可以在如图所示的地方进行设置,强烈建议将此项设置为编译错误。

    这里写图片描述

    47、Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用? 
    答:Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常;throws用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异常状况都要被执行;try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入异常栈中,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常的try语句或者最终将异常抛给JVM。

    48、运行时异常与受检异常有何异同? 
    答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。异常和继承一样,是面向对象程序设计中经常被滥用的东西,在Effective Java中对异常的使用给出了以下指导原则: 
    - 不要将异常处理用于正常的控制流(设计良好的API不应该强迫它的调用者为了正常的控制流而使用异常) 
    - 对可以恢复的情况使用受检异常,对编程错误使用运行时异常 
    - 避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发生) 
    - 优先使用标准的异常 
    - 每个方法抛出的异常都要有文档 
    - 保持异常的原子性 
    - 不要在catch中忽略掉捕获到的异常

    49、列出一些你常见的运行时异常? 
    答: 
    - ArithmeticException(算术异常) 
    - ClassCastException (类转换异常) 
    - IllegalArgumentException (非法参数异常) 
    - IndexOutOfBoundsException (下标越界异常) 
    - NullPointerException (空指针异常) 
    - SecurityException (安全异常)

    50、阐述final、finally、finalize的区别。 
    答: 
    - final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。 
    - finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。 
    - finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。

    51、类ExampleA继承Exception,类ExampleB继承ExampleA。 
    有如下代码片断:

    try {
        throw new ExampleB("b")
    } catch(ExampleA e){
        System.out.println("ExampleA");
    } catch(Exception e){
        System.out.println("Exception");
    }

    请问执行此段代码的输出是什么? 
    答:输出:ExampleA。(根据里氏代换原则[能使用父类型的地方一定能使用子类型],抓取ExampleA类型异常的catch块能够抓住try块中抛出的ExampleB类型的异常)

    面试题 - 说出下面代码的运行结果。(此题的出处是《Java编程思想》一书)

    class Annoyance extends Exception {}
    class Sneeze extends Annoyance {}
    
    class Human {
    
        public static void main(String[] args) 
            throws Exception {
            try {
                try {
                    throw new Sneeze();
                } 
                catch ( Annoyance a ) {
                    System.out.println("Caught Annoyance");
                    throw a;
                }
            } 
            catch ( Sneeze s ) {
                System.out.println("Caught Sneeze");
                return ;
            }
            finally {
                System.out.println("Hello World!");
            }
        }
    }

    52、List、Set、Map是否继承自Collection接口? 
    答:List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

    53、阐述ArrayList、Vector、LinkedList的存储性能和特性。 
    答:ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。

    补充:遗留容器中的Properties类和Stack类在设计上有严重的问题,Properties是一个键和值都是字符串的特殊的键值对映射,在设计上应该是关联一个Hashtable并将其两个泛型参数设置为String类型,但是Java API中的Properties直接继承了Hashtable,这很明显是对继承的滥用。这里复用代码的方式应该是Has-A关系而不是Is-A关系,另一方面容器都属于工具类,继承工具类本身就是一个错误的做法,使用工具类最好的方式是Has-A关系(关联)或Use-A关系(依赖)。同理,Stack类继承Vector也是不正确的。Sun公司的工程师们也会犯这种低级错误,让人唏嘘不已。

    54、Collection和Collections的区别? 
    答:Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。

    55、List、Map、Set三个接口存取元素时,各有什么特点? 
    答:List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。

    56、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素? 
    答:TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)。 
    例子1:

    
    public class Student implements Comparable<Student> {
        private String name;        // 姓名
        private int age;            // 年龄
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + "]";
        }
    
        @Override
        public int compareTo(Student o) {
            return this.age - o.age; // 比较年龄(年龄的升序)
        }
    
    }
    import java.util.Set;
    import java.util.TreeSet;
    
    class Test01 {
    
        public static void main(String[] args) {
            Set<Student> set = new TreeSet<>();     // Java 7的钻石语法(构造器后面的尖括号中不需要写类型)
            set.add(new Student("Hao LUO", 33));
            set.add(new Student("XJ WANG", 32));
            set.add(new Student("Bruce LEE", 60));
            set.add(new Student("Bob YANG", 22));
    
            for(Student stu : set) {
                System.out.println(stu);
            }
    //      输出结果: 
    //      Student [name=Bob YANG, age=22]
    //      Student [name=XJ WANG, age=32]
    //      Student [name=Hao LUO, age=33]
    //      Student [name=Bruce LEE, age=60]
        }
    }

    例子2:

    public class Student {
        private String name;    // 姓名
        private int age;        // 年龄
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        /**
         * 获取学生姓名
         */
        public String getName() {
            return name;
        }
    
        /**
         * 获取学生年龄
         */
        public int getAge() {
            return age;
        }
    
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + "]";
        }
    
    }
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    class Test02 {
    
        public static void main(String[] args) {
            List<Student> list = new ArrayList<>();     // Java 7的钻石语法(构造器后面的尖括号中不需要写类型)
            list.add(new Student("Hao LUO", 33));
            list.add(new Student("XJ WANG", 32));
            list.add(new Student("Bruce LEE", 60));
            list.add(new Student("Bob YANG", 22));
    
            // 通过sort方法的第二个参数传入一个Comparator接口对象
            // 相当于是传入一个比较对象大小的算法到sort方法中
            // 由于Java中没有函数指针、仿函数、委托这样的概念
            // 因此要将一个算法传入一个方法中唯一的选择就是通过接口回调
            Collections.sort(list, new Comparator<Student> () {
    
                @Override
                public int compare(Student o1, Student o2) {
                    return o1.getName().compareTo(o2.getName());    // 比较学生姓名
                }
            });
    
            for(Student stu : list) {
                System.out.println(stu);
            }
    //      输出结果: 
    //      Student [name=Bob YANG, age=22]
    //      Student [name=Bruce LEE, age=60]
    //      Student [name=Hao LUO, age=33]
    //      Student [name=XJ WANG, age=32]
        }
    }

    57、Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? 
    答:sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第66题中的线程状态转换图)。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

    补充:可能不少人对什么是进程,什么是线程还比较模糊,对于为什么需要多线程编程也不是特别理解。简单的说:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。线程的划分尺度小于进程,这使得多线程程序的并发性高;进程在执行时通常拥有独立的内存单元,而线程之间可以共享内存。使用多线程的编程通常能够带来更好的性能和用户体验,但是多线程的程序对于其他程序是不友好的,因为它可能占用了更多的CPU资源。当然,也不是线程越多,程序的性能就越好,因为线程之间的调度和切换也会浪费CPU时间。时下很时髦的Node.js就采用了单线程异步I/O的工作模式。

    58、线程的sleep()方法和yield()方法有什么区别? 
    答: 
    ① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会; 
    ② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态; 
    ③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常; 
    ④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

    59、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B? 
    答:不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。

    60、请说出与线程同步以及线程调度相关的方法。 
    答: 
    - wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁; 
    - sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常; 
    - notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关; 
    - notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;

    提示:关于Java多线程和并发编程的问题,建议大家看我的另一篇文章《关于Java并发编程的总结和思考》

    补充:Java 5通过Lock接口提供了显式的锁机制(explicit lock),增强了灵活性以及对线程的协调。Lock接口中定义了加锁(lock())和解锁(unlock())的方法,同时还提供了newCondition()方法来产生用于线程之间通信的Condition对象;此外,Java 5还提供了信号量机制(semaphore),信号量可以用来限制对某个共享资源进行访问的线程的数量。在对资源进行访问之前,线程必须得到信号量的许可(调用Semaphore对象的acquire()方法);在完成对资源的访问后,线程必须向信号量归还许可(调用Semaphore对象的release()方法)。

    下面的例子演示了100个线程同时向一个银行账户中存入1元钱,在没有使用同步机制和使用同步机制情况下的执行情况。

    • 银行账户类:
    /**
     * 银行账户
     * @author 骆昊
     *
     */
    public class Account {
        private double balance;     // 账户余额
    
        /**
         * 存款
         * @param money 存入金额
         */
        public void deposit(double money) {
            double newBalance = balance + money;
            try {
                Thread.sleep(10);   // 模拟此业务需要一段处理时间
            }
            catch(InterruptedException ex) {
                ex.printStackTrace();
            }
            balance = newBalance;
        }
    
        /**
         * 获得账户余额
         */
        public double getBalance() {
            return balance;
        }
    }
    • 存钱线程类:
    /**
     * 存钱线程
     * @author 骆昊
     *
     */
    public class AddMoneyThread implements Runnable {
        private Account account;    // 存入账户
        private double money;       // 存入金额
    
        public AddMoneyThread(Account account, double money) {
            this.account = account;
            this.money = money;
        }
    
        @Override
        public void run() {
            account.deposit(money);
        }
    
    }
    • 测试类:
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Test01 {
    
        public static void main(String[] args) {
            Account account = new Account();
            ExecutorService service = Executors.newFixedThreadPool(100);
    
            for(int i = 1; i <= 100; i++) {
                service.execute(new AddMoneyThread(account, 1));
            }
    
            service.shutdown();
    
            while(!service.isTerminated()) {}
    
            System.out.println("账户余额: " + account.getBalance());
        }
    }

    在没有同步的情况下,执行结果通常是显示账户余额在10元以下,出现这种状况的原因是,当一个线程A试图存入1元的时候,另外一个线程B也能够进入存款的方法中,线程B读取到的账户余额仍然是线程A存入1元钱之前的账户余额,因此也是在原来的余额0上面做了加1元的操作,同理线程C也会做类似的事情,所以最后100个线程执行结束时,本来期望账户余额为100元,但实际得到的通常在10元以下(很可能是1元哦)。解决这个问题的办法就是同步,当一个线程对银行账户存钱时,需要将此账户锁定,待其操作完成后才允许其他的线程进行操作,代码有如下几种调整方案:

    • 在银行账户的存款(deposit)方法上同步(synchronized)关键字
    /**
     * 银行账户
     * @author 骆昊
     *
     */
    public class Account {
        private double balance;     // 账户余额
    
        /**
         * 存款
         * @param money 存入金额
         */
        public synchronized void deposit(double money) {
            double newBalance = balance + money;
            try {
                Thread.sleep(10);   // 模拟此业务需要一段处理时间
            }
            catch(InterruptedException ex) {
                ex.printStackTrace();
            }
            balance = newBalance;
        }
    
        /**
         * 获得账户余额
         */
        public double getBalance() {
            return balance;
        }
    }
    • 在线程调用存款方法时对银行账户进行同步
    /**
     * 存钱线程
     * @author 骆昊
     *
     */
    public class AddMoneyThread implements Runnable {
        private Account account;    // 存入账户
        private