scanner可以允许输入多行,next() 每次取到一个间隔符前面的数据 如: 输入 a b c 取值应该是a,因为a后面有空格 nextLine() 每次取一个换行符前面的数据 如:输入 a b c 回车,取值 就是a b c nextInt() 是取next() 然后把字符串解析成一个int数字。 hasNextInt() 是判断下次调用next()是否可以得到一个可以安全解析成int的字符串。如果已经到达输入的结尾,或者下一个next()的返回值不能解析为一个数字,即不符合数字的格式,那么返回false。
例如:Scanner input=new Scanner(System.in); String length=input.next();//输入一个字符串,之后进行回车确认输入 System.out.println("输入的字符串是:"+length);
上面举例的是字符串,之后进行单个字符读取;也可以用以下语句“String length=input.nextLine()”,读取的就是一行(“\n”是换行符,碰到之后就会认为是读取下一行)。
78、注解标签
@Test:测试方法
@Before:初始化方法
@After:释放资源
79、
注意看String、int、short、long、byte、boolean、character等在sql中对应的类型。
80、 SSM框架(Spring+SpringMVC+MyBatis)
http://blog.csdn.net/gebitan505/article/details/44455235/
http://www.cnblogs.com/zyw-205520/p/4767633.html
使用MyBatis Generator自动创建代码
可利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件。这样可以省去很多的功夫,将生成的代码copy到项目工程中即可。http://blog.csdn.net/zhshulin/article/details/23912615
注意这里generatorConfig.xml中的数据库链接URL我用的是10.81.78.239:3306/db_zsl(换成自己的ip:3306/数据库),要生成的表 tableName为user_t(换成db_zsl里的你要生成实体类的已有的表名)
81、spket是一个开发JavaScript、jQuery、Ext_js等的开发工具,它可以是独立的IDE,也可以作为Eclipse的插件使用,下面介绍如何在Eclipse中安装spket插件;
http://download.csdn.net/download/lxz376429624/7686217
http://blog.csdn.net/sanfye/article/details/45120561
82、setContentView(R.layout.main)在Android里面,这句话是什么意思?
R.layout.main是个布局文件即控件都是如何摆放如何显示的,setContentView就是设置一个Activity的显示界面,这句话就是设置这个这句话所再的Activity采用R.layout下的main布局文件进行布局。
使用setContentView可以在Activity中动态切换显示的View,这样,不需要多个Activity就可以显示不同的界面,因此不再需要在Activity间传送数据,变量可以直接引用。但是,在android SDK给我们建的默认的Hello World程序中,调用的是setContentView(int layoutResID)方法,如果使用该方法切换view,在切换后再切换回,无法显示切换前修改后的样子,也就是说,相当于重新显示一个view,并非是把原来的view隐藏后再显示。
其实setContentView是个多态方法,我们可以先用LayoutInflater把布局xml文件引入成View对象,再通过setContentView(View view)方法来切换视图。因为所有对View的修改都保存在View对象里,所以,当切换回原来的view时,就可以直接显示原来修改后的样子。
当我们运行程序的时候,有一个setContentView()方法,Activity其实不是显示视图(直观上感觉是它),实际上Activity调用了PhoneWindow的setContentView()方法,然后加载视图,将视图放到这个Window上,而Activity其实构造的时候初始化的是Window(PhoneWindow),Activity其实是个控制单元,即可视的人机交互界面。
打个比喻:Activity是一个工人,它来控制Window;Window是一面显示屏,用来显示信息;View就是要显示在显示屏上的信息,这些View都是层层重叠在一起(通过infalte()和addView())放到Window显示屏上的。而LayoutInfalter就是用来生成View的一个工具,XML布局文件就是用来生成View的原料。
相信大家应该都知道了,Android 4.4中谷歌为开发者提供了两种编译模式,一种是默认的Dalvik模式,而另外一种则是 ART模式。
现在最新的消息显示,谷歌正在对Android系统进行调整,简单点说就是ART已经取代Dalvik成为默认选项。一直以来,Dalvik虚拟机背负着Android应用卡顿的罪名,原因则是应用在运行的过程中,虚拟机Dalvik通过一个叫JIT(Just-in-time)的解释器动态的进行编译并执行,这一过程也拖慢了运行效率。
与之形成鲜明对比的ART模式,则是在用户安装应用时就进行预编译操作,将原本在程序运行中时的编译动作提前到应用安装时。在省去解释代码这一过程之后,应用的运行效率会更高。
此外,有开发者往Android开源项目中提交代码时发现,ART已经取代Dalvik成为默认选项,不过Dalvik并没有被放弃,这无疑是个不错的消息,对于今年将要到来的大改版Android 5.0来说,它的系统执行效率会更高。
Scheduler
(调度器),相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程。RxJava 已经内置了几个 Scheduler
,它们已经适合大多数的使用场景。有了这几个 Scheduler
,就可以使用subscribeOn()
和 observeOn()
两个方法来对线程进行控制了。 * subscribeOn()
: 指定subscribe()
所发生的线程,即 Observable.OnSubscribe
被激活时所处的线程。或者叫做事件产生的线程。 * observeOn()
: 指定Subscriber
所运行在的线程。或者叫做事件消费的线程。http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650237807&idx=1&sn=3a39bfec92640459ab8d04b6fc452263&chksm=88639a00bf141316e633939788852781b2063e9404247ce38982a31dba8c55be1f6762d915e5&mpshare=1&scene=23&srcid=1202vZFkvfZ0V7IsdeACp7g5#rd
MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
87、设置Activity的android:screenOrientation="portrait"属性时,无法切换横竖屏,因此不但不会重新调用各个生命周期方法,而且onConfigurationChanged()方法也不会执行。
launchMode为singleTask的时候,通过Intent启到一个Activity, 如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法。
用户正在操作某个Activity,这时如果其他应用程序需要内存。 此时的Activity是Foregroundprocess,应该按照Empty process,Backgroundprocess,Service process,Visibleprocess顺序kill,最后才是前台进程。
88、Message提供了消息池,有静态方法Obtain从消息池中取对象;
Thread默认不提供资源池,除非使用线程池ThreadPool管理;
AsynTask是线程池改造的,池里 默认提供(核数+1)个线程进行并发操作,最大支持(核数 * 2 + 1)个线程,超过后会丢弃其他任务;
Looper,每个Looper创建时创建一个消息队列和线程对象,也不是资源池;
89、style和theme本质上就是同一个东西,xml格式完全相同,只是我用在activity上我就叫他theme,我用在view上我就叫他style。style只能在.xml中使用,不能再java代码中用。唯一的区别就是style里头控制的各个属性了,某些属性是只有针对Activity才能生效的(你view有标题栏嘛有状态栏有导航栏吗嘛?但是反过来Activity内部却有一个继承自View的Decorview) 。所以style可以作用在activity上,但是theme却不能反过来作用在view上。
theme是被final标识了,不能被继承。
90、使用SimpleAdapter作为适配器时,支持三种类型的 View,而且是按照如下顺序进行匹配:
1、继承Checkable接口
2、TextView
3、ImageView
CompoundButton 声明如下:
1 |
public abstract class CompoundButton extends Button implements Checkable |
可见它是实现了Checkable接口的按钮,因此也在入选范围内。但它不支持ProgressBar。
91、8中常见的Java排序算法
1)插入排序(直接插入排序、希尔排序)
2)交换排序(冒泡排序、快速排序)
3)选择排序(直接选择排序、堆排序)
4)归并排序
5)分配排序(基数排序)
所需辅助空间最多:归并排序
所需辅助空间最少:堆排序
平均速度最快:快速排序
不稳定:快速排序,希尔排序,堆排序。
http://blog.csdn.net/qy1387/article/details/7752973
92、Arrays.toString(int [])
数值数组是不能够整体输出的,你可以使用循环输出
for(i=0;i<10;i++)
System.out.println(a[i]+" ");
而借助Arrays.toString(a)就节省了上面的循环步骤,而一步输出(当然,调用函数的内部进行了处理)。
93、大多数 JVM将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack ( 本地方法栈 ),其中Method Area 和 Heap 是线程共享的 ,VM Stack,Native Method Stack 和Program Counter Register 是非线程共享的。
JVM初始运行的时候都会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) , VM Stack(虚拟机栈)和Native Method Stack (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因。
程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的。Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的。原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。它与堆一样,是被 线程共享 的区域。
94、JDBC提供了Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中Statement用于通用查询,PreparedStatement用于执行参数化查询,而CallableStatement则是用于存储过程。
对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象”。 PreparedStatement可以阻止常见的SQL注入式攻击。 PreparedStatement中,“?” 叫做占位符,一个占位符必定只能对应一个值。
95、SPRING的事务传播特性
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
96、servlet和cgi
servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁。而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
servlet在易用性上强于cgi,它提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。
CGI不可移植,为某一特定平台编写的CGI应用只能运行于这一环境中。每一个CGI应用存在于一个由客户端请求激活的进程中,并且在请求被服务后被卸载。这种模式将引起很高的内存、CPU开销,而且在同一进程中不能服务多个客户。
97、servlet service
不管是post还是get方法提交过来的连接,都会在service中处理。doGet/doPost 则是在javax.servlet.http.HttpServlet中实现的。
service()是在javax.servlet.Servlet接口中定义的。
service判断请求类型,决定是调用doGet还是doPost方法。
98、Servlet的生命周期
Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化:调用init方法初始化
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
(5)卸载:调用destroy方法让servlet自己释放其占用的资源
创建Servlet的实例是由Servlet容器来完成的,且创建Servlet实例是在初始化方法init()之前。
在Servlet生命周期的服务阶段,执行service()方法,根据用户请求的方法,执行相应的doGet()或是doPost()方法。
在销毁阶段,执行destroy()方法后会释放Servlet 占用的资源。destroy()方法仅执行一次,即在服务器停止且卸载Servlet时执行该方法。
99、init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法。service()方法处理客户机发出的所有请求。
destroy()方法标志servlet生命周期的结束。servlet在多线程下其本身并不是线程安全的,在Servlet类中可能会定义共享的类变量,这样在并发的多线程访问的情况下,不同的线程对成员变量的修改会引发错误。
100、从action类上分析: 1.Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 2. Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
从Servlet 依赖分析: 3. Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 4. Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
从action线程模式分析: 5. Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 6. Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
101、AWT和Swing
AWT和Swing都是java中的包。
AWT(Abstract Window Toolkit):抽象窗口工具包,早期编写图形界面应用程序的包。
Swing :为解决 AWT 存在的问题而新开发的图形界面包。Swing是对AWT的改良和扩展。
AWT和Swing之间的区别:
1)AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。
2)AWT的控件在不同的平台可能表现不同,而Swing在所有平台表现一致。即Swing在不同的操作系统中显示相同的风格。
102、forward和redirect是jsp中常问的两个问题
forward,请求转发:服务器获取跳转页面内容传给用户,用户地址栏不变。
redirect,请求重定向:是服务器向用户发送转向的地址,redirect后地址栏变成新的地址。
103、加载驱动方法
1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
2. DriverManager.registerDriver(newcom.mysql.jdbc.Driver());
3.System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");
104、sleep()和wait()
Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。
sleep是线程类(Thread)的方法,wait是Object类的方法;
sleep不释放对象锁,wait放弃对象锁;
sleep暂停线程、但监控状态仍然保持,结束后会自动恢复;
wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入就绪状态。
105、//在stack中分配3个内存,名字为a, b, c Square a, b, c; //声明了3个Square类型的变量a, b, c //在heap中分配了一块新内存,里边包含自己的成员变量width值为48L,然后stack中的a指向这块内存 a = new Square(42L); //在heap中分配了一块新内存,其中包含自己的成员变量width值为48L,然后stack中的b指向这块内存 b = new Square(42L); //stack中的c也指向b所指向的内存 c = b; //在stack中分配了一块内存,值为42 long s = 42L; |
如图所示:
106、
107、关于struts项目中的类与MVC模式的对应关系:
Jsp文件实现视图View的功能;
ActionServlet这一个类是整个struts项目的控制器;
structs框架基于mvc模式开发,存在与mvc工作流程一一对应的关系,即controller…model…view… structs对应的类分别是ActionServlet……Action/ActionForm……View即Jsp。
108、动态INCLUDE用jsp:include动作实现<jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。各个文件分别先编译,然后组合成一个文件。
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %>。先将文件的代码被原封不动地加入到了主页面从而合成一个文件,然后再进行翻译,此时不允许有相同的变量。 静态include的结果是把其他jsp引入当前jsp,两者合为一体;动态 include的结构是两者独立,直到输出时才合并。
109、本地广播和全局广播有什么差别?
BroadcastReceiver是针对应用间、应用与系统间、应用内部进行通信的一种方式。
LocalBroadcastReceiver仅在自己的应用内发送接收广播,也就是只有自己的应用能收到。
LocalBroadcastManager是Android Support包提供了一个工具,是用来在同一个应用内的不同组件间发送Broadcast的。
使用LocalBroadcastManager有如下好处:
110、国内一线互联网公司面试题
http://blog.csdn.net/gaiyindexingqiu/article/details/53400759
111、intentService
在Service里面我们肯定不能直接进行耗时操作,一般都需要去开启子线程去做一些事情,自己去管理Service的生命周期以及子线程并非是个优雅的做法;好在Android给我们提供了一个类,叫做IntentService
。
http://blog.csdn.net/lmj623565791/article/details/47143563
使用IntentService最起码有两个好处,一方面不需要自己去new Thread了;另一方面不需要考虑在什么时候关闭该Service了。
IntentService是Service类的子类,用来处理异步请求。客户端可以通过startService(Intent)方法传递请求给IntentService。
IntentService在onCreate()函数中通过HandlerThread单独开启一个线程来处理所有Intent请求对象(通过startService的方式发送过来的)所对应的任务,这样以免事务处理阻塞主线程。执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service;否则执行下一个Intent请求所对应的任务。
http://blog.csdn.net/hudashi/article/details/7986130
standard,创建一个新的Activity。
singleTop,栈顶不是该类型的Activity,创建一个新的Activity。否则,onNewIntent。
singleTask,回退栈中没有该类型的Activity,创建Activity,否则,onNewIntent+ClearTop。
singleInstance,回退栈中,只有这一个Activity,没有其他Activity。
注意:
1. 设置了"singleTask"启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的Task存在;如果存在这样的Task,它就会在这个Task中启动,否则就会在新的任务栈中启动。因此,如果我们想要设置了"singleTask"启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。
2. 如果设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity 实例会位于任务的Stack顶端中。
3. 在一个任务栈中只有一个”singleTask”启动模式的Activity存在。他的上面可以有其他的Activity。这点与singleInstance是有区别的。
singleTop适合接收通知启动的内容显示页面。
例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
singleTask适合作为程序入口点。
例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
singleInstance应用场景:
闹铃的响铃界面。你以前设置了一个闹铃:上午6点。在上午5点58分,你启动了闹铃设置界面,并按 Home 键回桌面;在上午5点59分时,你在微信和朋友聊天;在6点时,闹铃响了,并且弹出了一个对话框形式的 Activity(名为 AlarmAlertActivity) 提示你到6点了(这个 Activity 就是以 SingleInstance 加载模式打开的),你按返回键,回到的是微信的聊天界面,这是因为 AlarmAlertActivity 所在的 Task 的栈只有他一个元素,因此退出之后这个 Task 的栈空了。如果是以 SingleTask 打开 AlarmAlertActivity,那么当闹铃响了的时候,按返回键应该进入闹铃设置界面。
113、AccessibilityService
Android进阶——学习AccessibilityService实现微信抢红包插件
简单的说AccessibilityService就是一个后台监控服务,当你监控的内容发生改变时,就会调用后台服务的回调方法。
http://blog.csdn.net/qq_30379689/article/details/53242953
DDMS界面有个 Dump View Hierarchy for UI Automator,干什么用的?
这个是用来分析你当前界面的View层次节点的,假设你现在是在用模拟器手机做调试,你用这个他就会构建一个你先在手机或模拟器显示界面的View的层次图,你可以做一些性能的调优之类的。
http://www.cnblogs.com/xdindex/p/4619675.html
114、如何在自己程序跳转至微信,新浪,腾讯微博,,QQ空间等
http://www.68idc.cn/help/buildlang/ask/20150323292891.html
115、使用H5搭建webapp主页面
http://blog.csdn.net/qq_30379689/article/details/52648978
android的webview中的h5页面里js和java相互调用,参考理解下面链接里的代码http://download.csdn.net/download/qiushi_1990/9324875
android的WebView、WebViewClient、WebChromeClient的关系http://blog.sina.com.cn/s/blog_71e00b8801017tei.html
JAVA字符串格式化-String.format()的使用
http://blog.csdn.net/lonely_fireworks/article/details/7962171/
WebView详解与简单实现Android与H5互调
优势:使用H5实现的功能能够在不升级App的情况下动态更新,而且可以在Android或iOS的App上同时运行,节约了成本,提高了开发效率。
原理:其实就是Java代码和JavaScript之间的调用。
http://blog.csdn.net/qq_24530405/article/details/52067474
WebView常用方法
loadUrl、setWebViewClient、setWebChromeClient、setDownloadListener、goBack()
易企秀官网http://www.eqxiu.com/
60分钟学会制作易企秀H5场景http://class.qq.com/class/13657/p62157.html
凡科http://www.faisco.com/
116、Java注解
元注解:注解的注解。
117、instanceof
Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
http://www.cnblogs.com/obama/p/3292335.html
119、[java后端]线下笔试及面试复习资料[三]——手写代码篇
https://m.nowcoder.com/discuss/19954?type=1&order=0&pos=14&page=1?from=wb
120、JVM
JAVA中将内存的控制交给JVM来实现,方便了JAVA程序猿,当然牺牲了一部分效率,不过总体来看是值得的。在JVM的内存模型中,堆内存是JAVA内存区域中最大的一部分,GC主要就是发生在堆中,用来回收那些无用的对象。这样直接就引申出了第一个问题:什么样的对象需要被回收?判断条件是什么?如何判断?
没用的对象需要被回收,一个对象被创建,如果被引用了,那这个对象肯定是有用的,如果引用全失效了,那就是没用的对象了,需要被回收。基于这个思想,引用计数法诞生了。给每个对象添加一个引用计数器,对象每被引用一次,引用计数器就+1,引用失效时就-1。那么判断一个对象是否有用的条件就变成了对这个计数器值得判断了,如果为0,那么被回收,如果为>0,那么保留。但是这种方式会产生一个问题,就是对象之间的循环引用无法被识别,即使这两个对象不能被访问,但是它们之间互相引用着对方,故而计数器肯定>0,那么就不能被回收。JVM中并没有使用引用计数算法,而是使用了根搜索算法。既然根搜索算法需要考虑到对象之间的引用,那么就要说一下JAVA中对象的引用类型了:
从JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用,软引用(SoftReference类),弱引用(WeakReference类),虚引用(PhantomReference类),这四种引用的强度依次减弱。
1) 强引用就是指在程序代码之中普遍存在的,类似 “Object obj =new Object()” 这类的引用,只要强引用还存在,垃圾回收器永远不会回收被引用的对象。我们也正是利用这个原理来重现了OOM异常。
2) 软引用(SoftReference类)是用来描述一些还有用但并非需要的对象,对于软引用关联着的对象,在系统将要发生内存异常之前,将会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存异常
3) 弱引用(WeakReference类)也是用来描述非必需对象的,被弱引用关联的对象只能生存到下一次GC发生之前,当垃圾收集器工作时,无论当前内存释放足够,都会回收掉只被弱引用关联的对象
4) 虚引用(PhantomReference类)也称为幽灵引用或者幻影引用,它是最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例,对一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
http://blog.csdn.net/zhshulin/article/details/50583724
121、垃圾收集器
现在商用的JVM中的垃圾收集采用的是分代收集算法,即针对不同年代采用不同的收集算法。在JVM中,GC主要作用于堆内存中,堆内存又被划分为新生代和老年代,由于新生代对象绝大多数是朝生夕死,而老年代相对存活时间就很长,故而需要使用不同的垃圾收集机制,所以垃圾收集器也就分为新生代收集器和老年代收集器,两者相互组合进行JVM堆内存的空间回收。
新生代的垃圾收集器有:Serial收集器、ParNew收集器、Parallel Scavenge收集器。
老年代的垃圾收集器有:Serial Old收集器、ParallelOld收集器、CMS收集器。
G1收集器(G1是一款面向服务端应用的垃圾收集器)。
GC的具体实现就是垃圾收集器,目前尚没有一个垃圾收集器是完美的,需要配合使用。
http://blog.csdn.net/zhshulin/article/details/50614477
http://www.codeceo.com/article/android-socket-encrypted-transmission.html