个人整理2017.4

部分内容源自网络,本人根据个人理解来整理,如有侵权,请联系删除

1、

adb install apk文件名     //安装apk

adb uninstall 包名    //卸载app

push xxx xxx  //拷贝文件到手机

终止monkey测试的方法

输入adb shell , 然后 ps|grep monkey  接着 kill process_id

2、 不要用“你的方式”来编写代码,只需要按照标准(的代码规范)来编写就好。再次强调,要写让人读得明白,看得下去的代码,让人家能够理解它。
 3、 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

4、

在指定list中查找元素
for (int position = 0; position < devlist.size(); position++) {
if (devlist.get(position).getname().equals(selectName)) {
        curSelect = devlist.get(position).getid();
    }
}

5、

proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.txt’
这是混淆设置,前一个是sdk自带的 <sdk目录>/tools/proguard/proguard-android.txt,后面一个是我们自定义的
最终混淆的结果是这两部分文件共同作用的
6、 为何要3次握手
为了避免已失效的连接要求报文段突然又传送到了服务端,因此产生毛病。

SYN表示建立连接,

FIN表示关闭连接,

ACK表示响应,

PSH表示有 DATA数据传输,

RST表示连接重置。
VoIP的完整名字是Voice over Internet Protocol
SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)
7、
互联网时代,单一技能已经很难立足,多方位全面发展才能挺住。娱乐圈早就贯彻这理念了。
8、 Handler原理
  • Message 意为消息,发送到Handler进行处理的对象,携带描述信息和任意数据。
  • MessageQueue 意为消息队列,Message的集合。
  • Looper 有着一个很难听的中文名字,消息泵,用来从MessageQueue中抽取Message,发送给Handler进行处理。
  • Handler 处理Looper抽取出来的Message。

9、

1.ROOT你的手机

2.用adb shell登录后,用su root切换到root用户,切换后显示#号,表示切换成功

3.用mount命令重新加载文件系统:mount -o rw,remount yaffs2 /system

10、

实现一个帐号只能在一个手机登录的方法:
每次回到应用时,在onResume(都继承一个BaseActivity,在Base中写onResume,然后派生类就调用super.onResume),联网检查一下,数据库记录的IMEI值是否与本手机一样,若不一样则弹窗说已被别人登录。

11、

sqlite事务处理
DataBaseHelper  dataBaseHelper = DataBaseHelper.getInstances(this);
SQLiteDatabase db = dataBaseHelper.getWritableDatabase();
//开始事务
db.beginTransaction();
try{
do something
db.setTransactionSuccessful();
}
finally{
db.endTransaction();
}
 12、
异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员)已经犯了个错误,现在有一个机会来修改它。Java中使用异常类来表示异常,不同的异常类代表了不同的异常。但是在Java中所有的异常都有一个基类,叫做Exception。
错误:它指的是一个合理的应用程序不能截获的严重的问题。大多数都是反常的情况。”,错误是VM的一个故障(虽然它可以是任何系统级的服务)。所以,错误是很难处理的,一般的开发人员(当然不是你)是无法处理这些错误的。比如内存溢出;
运行异常即是RuntimeException;其余的全部为编译异常.
异常和错误最本质的区别就是异常能被开发人员处理而错误时系统本来自带的,一般无法处理也不需要我们程序员来处理。
 13、
字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。
常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
对于Unicode字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案。
gbk是字符集与编码一起定义的,包含这两部分,所以有多少汉字的定义。
utf-8仅是编码,不包含字符集。所以utf-8没有汉字个数这样的概念,这个概念属于字符集。utf-8理论上是可以使用gbk等的字符集部分来表示GBK的。
unicode使用uft-8做为标准编码方案。但是也可以
有其他的编码方案,来表示Unicode。
UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 – 007F 0xxxxxxx  128
0080 – 07FF 110xxxxx 10xxxxxx   2048
0800 – FFFF 1110xxxx 10xxxxxx 10xxxxxx  65536

14、

隐式Intent使用 要先检验是否有相应的Activity,否则为空的话应用会奔溃
注意:如果您调用了 Intent,但设备上没有可用于处理 Intent 的应用,您的应用将崩溃。
要确认是否存在可响应 Intent 的可用 Activity,请调用 queryIntentActivities() 来获取能够处理您的 Intent 的 Activity 列表。如果返回的 List 不为空,您可以安全地使用该 Intent。例如:
// Build the intent
Uri location = Uri.parse(“geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California”);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
// Verify it resolves
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;
// Start an activity if it’s safe
if (isIntentSafe) {
    startActivity(mapIntent);
}
如果 isIntentSafe 是 true,则至少有一个应用将响应该 Intent。 如果它是 false,则没有任何应用处理该 Intent。

15\

ToolBar要使用 v7包中的,不然要API21以上才能用
<android.support.v7.widget.Toolbar
  android:id=”@+id/toolbar”
  android:layout_height=”?attr/actionBarSize”
  android:layout_width=”match_parent” >
</android.support.v7.widget.Toolbar>

16、

ldpi  240×320   0.75
mdpi 320×480    1.0
hdpi  480×800   1.5
xhdpi  720×1280   2.0
xxhdpi 1080×1920  3.0
xxxhdpi 1440×2560  4.0
17、foxmail等软件登录gmail邮箱的方法:
第一步,在gmail网页版设置中开启POP/IMAP
第二步,点击POP下方的“配置说明”,拉到最下方的“问题排查”-“我无法登录自己的电子右键客户端”,点击第2步的“允许安全性较低的应用访问帐号”,然后开启允许即可(或者点击右上角头像-我的帐号-登录和安全,拉到最底部也能看到“允许不够安全的应用”
第三步,可以用foxmail正常登录gmail邮箱了
18、 assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译,可以存放一些图片,html,js, css等文件
19、 AS先选择类,然后按 Ctrl+H , 查看类层次结构图,继承关系一目了然

20、

内部类中无法用this,而要写完整的类名xxxActivity.this, 因为在内部类时,用this 指的是此内部类的this对象,而不是外部类
bn.setOnClickListener(new OnClickListener() {
// 实现事件处理方法:当点击按钮时,跳转到下一个界面
@Override
public void onClick(View v) { //准备intent对象 Intent intent = new Intent(this,NextActivity.class);
//启动下一个界面
startActivity(intent ); } });
21、 用RecyclerView 去替代ListView
22、 ButterKnife,这个框架虽然也采用了注解进行注入,不过人家可是编译期生成代码的方式,对运行时没有任何副作用,果真见效快,疗效好,只是编译期有一点点时间成本而已。
23、 用图片之类的第三方框架,都要自己先封装一套方法,然后使用者调用此封装后的方法,这样以后更改框架的时候,只需要在自己封装的方法中进行修改即可,其他人调用该方法并不需要改写法

24、

关于java static变量的值
如果你没有设置 xxx = null 那么你可以认为在Application终止前,该内存永远不会回收.,如果你设置了null.那么在GC时会释放.
比如sharePreference中的值,是static的啊,所以不会回收的,要你自己设置为null才能回收
public static final String APP_CONFIG_IF_FIRST = “user_first_use”;
25\ RxJava最核心的两个东西是Observables(被观察者,事件源)和Subscribers(观察者)。Observables发出一系列事件,Subscribers处理这些事件。这里的事件可以是任何你感兴趣的东西(触摸事件,web接口调用返回的数据。。。)
越小的类,bug越不容易出现,越容易调试,更容易测试,我相信这一点大家是都赞同的。在MVP模式下,View和Model是完全分离没有任何直接关联的(比如你在View层中完全不需要导Model的包,也不应该去关联它们)。
使用MVP模式能够更方便的帮助Activity(或Fragment)职责分离,减小类体积,使项目结构更加清晰。
26\
//设置屏幕最大亮度
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = 1;
getWindow().setAttributes(lp);
//设置屏幕常亮,不锁屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
27\ 多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

28、

Java中的HashMap的工作原理是什么?
Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
hashCode()和equals()方法的重要性体现在什么地方?  (重写hashCode()一般也要重写equals() )
Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

29、

“java程序设计语言总是采用值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。”
首先明确一下值传递和引用传递的概念:
值传递:表示方法接收的是调用者提供的值。
引用传递:表示方法接收的是调用者提供的变量地址。
总结起来,java中参数传递情况如下:
· 一个方法不能修改一个基本数据类型的参数
· 一个方法可以修改一个对象参数的状态
· 一个方法不能实现让对象参数引用一个新对象

30、

基本类型(如int, boolean)的变量如果是临时变量,只要定义了,就会分配内存空间,不管是否被赋值;如果是作为对象(如String)的属性出现,只要该对象不实例化,就不会分配内存空间。
一个完整的Java程序运行过程会涉及以下内存区域:
1、寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。
2、 栈:保存局部变量的值,包括:
1)用来保存基本数据类型的值;
2)保存类的实例,即堆区对象的引用(指针)
3)也可以用来保存加载方法时的帧
3、堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。4、常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。

5、代码段:用来存放从硬盘上读取的源程序代码。

6、数据段:用来存放static定义的静态成员。

注意:

1.一个Java文件,只要有main入口方法,我们就认为这是一个Java程序,可以单独编译运行。

31、

初始化步骤 顺序
父类–静态变量/方法
父类–静态初始化块  static{}
子类–静态变量/方法
子类–静态初始化块
父类–变量
父类–初始化块 {}
父类–构造器
子类–变量
子类–初始化块
子类–构造器
另外,静态变量和静态方法的初始化顺序,取决于他在类中所写的先后顺序

32、

java接口,方法默认是public void method();  变量默认是public static final 
java8 已经增强了接口,可以定义静态方法

33、

Java中,什么是构造函数?什么是构造函数重载?
当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。
Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。

34、

”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。

35、

什么时候用静态方法,什么时候使用非静态方法?

既然静态方法和实例化方式的区分是为了解决模式的问题,如果我们考虑不需要继承和多态的时候,就可以使用静态方法,但就算不考虑继承和多态,就一概使用静态方法也不是好的编程思想。

从另一个角度考虑,如果一个方法和他所在类的实例对象无关,那么它就应该是静态的,否则就应该是非静态。因此像工具类,一般都是静态的。

36、

UML中有哪些常用的图?
答:UML定义了多种图形化的符号来描述软件系统部分或全部的静态结构和动态结构,包括:用例图(use case diagram)、类图(class diagram)、时序图(sequence diagram)、协作图(collaboration diagram)、状态图(statechart diagram)、活动图(activity diagram)、构件图(component diagram)、部署图(deployment diagram)等。在这些图形化符号中,有三种图最为重要,分别是:用例图(用来捕获需求,描述系统的功能,通过该图可以迅速的了解系统的功能模块及其关系)、类图(描述类以及类与类之间的关系,通过该图可以快速了解系统)、时序图(描述执行特定任务时对象之间的交互关系以及执行顺序,通过该图可以了解对象能接收的消息也就是说对象能够向外界提供的服务)。

37、

简述一下你了解的设计模式。
答:所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使人们可以更加简单方便的复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
– 工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态方法)。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
– 代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用。实际开发中,按照使用目的的不同,代理可以分为:远程代理、虚拟代理、保护代理、Cache代理、防火墙代理、同步化代理、智能引用代理。
– 适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起使用的类能够一起工作。

38、

简述一下面向对象的”六原则一法则”。
答:
– 单一职责原则:一个类只做它该做的事情。(单一职责原则想表达的就是”高内聚”,写代码最终极的原则只有六个字”高内聚、低耦合”,就如同葵花宝典或辟邪剑谱的中心思想就八个字”欲练此功必先自宫”,所谓的高内聚就是一个代码模块只完成一项功能,在面向对象中,如果只让一个类完成它该做的事,而不涉及与它无关的领域就是践行了高内聚的原则,这个类就只有单一职责。我们都知道一句话叫”因为专注,所以专业”,一个对象如果承担太多的职责,那么注定它什么都做不好。这个世界上任何好的东西都有两个特征,一个是功能单一,好的相机绝对不是电视购物里面卖的那种一个机器有一百多种功能的,它基本上只能照相;另一个是模块化,好的自行车是组装车,从减震叉、刹车到变速器,所有的部件都是可以拆卸和重新组装的,好的乒乓球拍也不是成品拍,一定是底板和胶皮可以拆分和自行组装的,一个好的软件系统,它里面的每个功能模块也应该是可以轻易的拿到其他系统中使用的,这样才能实现软件复用的目标。)
– 开闭原则:软件实体应当对扩展开放,对修改关闭。(在理想的状态下,当我们需要为一个软件系统增加新功能时,只需要从原来的系统派生出一些新类就可以,不需要修改原来的任何一行代码。要做到开闭有两个要点:①抽象是关键,一个系统中如果没有抽象类或接口系统就没有扩展点;②封装可变性,将系统中的各种可变因素封装到一个继承结构中,如果多个可变因素混杂在一起,系统将变得复杂而换乱,如果不清楚如何封装可变性,可以参考《设计模式精解》一书中对桥梁模式的讲解的章节。)
– 依赖倒转原则:面向接口编程。(该原则说得直白和具体一些就是声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代,请参考下面的里氏替换原则。)
里氏替换原则:任何时候都可以用子类型替换掉父类型。(关于里氏替换原则的描述,Barbara Liskov女士的描述比这个要复杂得多,但简单的说就是能用父类型的地方就一定能使用子类型。里氏替换原则可以检查继承关系是否合理,如果一个继承关系违背了里氏替换原则,那么这个继承关系一定是错误的,需要对代码进行重构。例如让猫继承狗,或者狗继承猫,又或者让正方形继承长方形都是错误的继承关系,因为你很容易找到违反里氏替换原则的场景。需要注意的是:子类一定是增加父类的能力而不是减少父类的能力,因为子类比父类的能力更多,把能力多的对象当成能力少的对象来用当然没有任何问题。)
– 接口隔离原则:接口要小而专,绝不能大而全。(臃肿的接口是对接口的污染,既然接口表示能力,那么一个接口只应该描述一种能力,接口也应该是高度内聚的。例如,琴棋书画就应该分别设计为四个接口,而不应设计成一个接口中的四个方法,因为如果设计成一个接口中的四个方法,那么这个接口很难用,毕竟琴棋书画四样都精通的人还是少数,而如果设计成四个接口,会几项就实现几个接口,这样的话每个接口被复用的可能性是很高的。Java中的接口代表能力、代表约定、代表角色,能否正确的使用接口一定是编程水平高低的重要标识。)
– 合成聚合复用原则:优先使用聚合或合成关系复用代码。(通过继承来复用代码是面向对象程序设计中被滥用得最多的东西,因为所有的教科书都无一例外的对继承进行了鼓吹从而误导了初学者,类与类之间简单的说有三种关系,Is-A关系、Has-A关系、Use-A关系,分别代表继承、关联和依赖。其中,关联关系根据其关联的强度又可以进一步划分为关联、聚合和合成,但说白了都是Has-A关系,合成聚合复用原则想表达的是优先考虑Has-A关系而不是Is-A关系复用代码,原因嘛可以自己从百度上找到一万个理由,需要说明的是,即使在Java的API中也有不少滥用继承的例子,例如Properties类继承了Hashtable类,Stack类继承了Vector类,这些继承明显就是错误的,更好的做法是在Properties类中放置一个Hashtable类型的成员并且将其键和值都设置为字符串来存储数据,而Stack类的设计也应该是在Stack类中放一个Vector对象来存储数据。记住:任何时候都不要继承工具类,工具是可以拥有并可以使用的,而不是拿来继承的。)
– 迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。(迪米特法则简单的说就是如何做到”低耦合”,门面模式和调停者模式就是对迪米特法则的践行。对于门面模式可以举一个简单的例子,你去一家公司洽谈业务,你不需要了解这个公司内部是如何运作的,你甚至可以对这个公司一无所知,去的时候只需要找到公司入口处的前台美女,告诉她们你要做什么,她们会找到合适的人跟你接洽,前台的美女就是公司这个系统的门面。再复杂的系统都可以为用户提供一个简单的门面,Java Web开发中作为前端控制器的Servlet或Filter不就是一个门面吗,浏览器对服务器的运作方式一无所知,但是通过前端控制器就能够根据你的请求得到相应的服务。调停者模式也可以举一个简单的例子来说明,例如一台计算机,CPU、内存、硬盘、显卡、声卡各种设备需要相互配合才能很好的工作,但是如果这些东西都直接连接到一起,计算机的布线将异常复杂,在这种情况下,主板作为一个调停者的身份出现,它将各个设备连接在一起而不需要每个设备之间直接交换数据,这样就减小了系统的耦合度和复杂度,如下图所示。迪米特法则用通俗的话来将就是不要和陌生人打交道,如果真的需要,找一个自己的朋友,让他替你和陌生人打交道。)
39、如何通过反射调用对象的方法?
答:请看下面的代码:

import java.lang.reflect.Method;

class MethodInvokeTest {

public static void main(String[] args) throws Exception {
String str = “hello”;
Method m = str.getClass().getMethod(“toUpperCase”);
System.out.println(m.invoke(str));  // HELLO
}
}

40、

获得一个类的类对象有哪些方式?
答:
– 方法1:类型.class,例如:String.class
– 方法2:对象.getClass(),例如:”hello”.getClass()
– 方法3:Class.forName(),例如:Class.forName(“java.lang.String”)
41、 简述正则表达式及其用途。
答:在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

42、

启动一个线程是调用run()还是start()方法?
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。

43、

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

44、

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

45、

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

46、

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

47、

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

48、

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

49、

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

50、

构造器(constructor)是否可被重写(override)?
答:构造器不能被继承,因此不能被重写,但可以被重载。
但是他可以被调用  比如在子类的构造函数中调用super();this();
public class Constructor1 {
public Constructor1(){
this(null);
}
public Constructor1(String str1){
this(str1,null);
}
public Constructor1(String str1,String str2){
this(str1,str2,null);
}
public Constructor1(String str1,String str2,String str3){
this(str1,str2,str3,null);
}
public Constructor1(String str1,String str2,String str3,String str4){
System.out.println(str1+”:”+str2+”:”+str3+”:”+str4);
}
public static void main(String[] args) {
System.out.println(new Constructor1(“test”,”ye”));
new Constructor1(“test”,”ye2″,”3ge”);
new Constructor1();
}
}

51、

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

52、

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

53、

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);
}

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

54、

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);其中有隐含的强制类型转换。
float f=3.4;是否正确?
答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;

发表评论

电子邮件地址不会被公开。 必填项已用*标注