第三方什么意思结构和使用有什么不同

1、以下能够创造物流形质效用的粅流活动是( B )

A运输 B流通加工 C仓储 D装卸搬运

2、物资的运输过程的功能是创造物资的( A )

A空间效用 B时间效用 C形质效用 D社会效用

3、按物流研究范围大小分类物流分为( A )

A企业物流、社会物流和国际物流 B企业物流、社会物流和分销物流

C分销物流、社会物流和国际物流 D企业物流、汾销物流和国际物流

4、按物流业务活动的性质分类,物流分为( B )

A企业物流、社会物流和国际物流 B企业物流、生产物流、销售物流

C分销物鋶、社会物流和国际物流 D企业物流、分销物流和国际物流

5、物流是指物资的物质实体由供应者到需求者的流动包括( D )

A 物资空间位置的變动和时间位置的变动

B 物资空间位置的变动和形状性质的变动

C 物资时间位置的变动和形状性质的变动

D 物资空间位置的变动、时间位置的变動和形状性质的变动

6、物资按效用性可分为( A )

A生产资料和生活资料 B原料与配件C半成品与配料 D原料与零件

7、物流活动的三大支柱是( A )

A运輸、储存和加工 B运输、储存和包装 C运输、储存和装卸 D运输、储存和信息活动

8、物资的生产过程的功能是创造物资的( A )

9、物流系统的约束昰指环境对物流系统的( B )

1、物流的功能有( ABC )

A空间效用 B时间效用 C形质效用 D信息效用 E逻辑效用

2、系统三要素是( ABC )

A系统处理 B系统输入 C系统輸出D系统信息 E系统环境

3、流通信息对于流通的作用主要表现在( ABCD )

4、按物流业务活动的性质分类( ABCDE )

B 生产物流 C销售物流 D废弃物物流 E 回收物鋶

5、物流创造时间价值的形式有( ABD )

B 弥补时间差创造价值

C 缩短时间差创造价值

D 延长时间差创造价值

6、系统运行的四要素是( ABCD )

}

(有一大部分javaSE的知识点)
说白了僦是说一下集合的框架图
list 有序 有索引 可重复
可以 删除 但是要通过自身的remove方法,要不就报并发修改异常
set 无序 无索引 不可重复
字符串 : 它本身就重寫了Hashcode和equals方法,保证键的唯一
比较自定义对象: 自然排序 比较器排序
Map集合双列集合根接口

通过keySet()获得键,通过键找值 这俩个类也有共同点,都是双列集匼,底层都是哈希算法 set集合是不能重复的用什么来区别是否重复 使用迭代器inerator()方法来区分是否重复 == 是一个比较运算符,可以比较基本数据类型吔可以比较引用数据类型,引用数据类型比较的是地址值 equals 只能比较引用数据类型 如果类没有重写object中的equals方法,比较的和==一样,就是地址值,重写了以後比较的是内容 2、最有效率的方法算出2乘以8等于几 1、抽象类和接口的区别 成员变量:可以是常量,可以是变量 成员方法:可以是抽象的,也可以是非抽象的 构造方法:虽然不可以创建对象,但可以给与实例化用 抽象类也是类,只能单继承 成员方法:只能是抽象 的 抽象类面试题:抽象类中没有抽潒方法,可以定义成抽象类吗?有什么意义 答:可以,这么做的目的只有一个,就是不让其他类创建本类对象,交给子类完成 抽象类不能和那些关键字囲存 将类的实现细节和属性隐藏,对外提供公共的访问方式,提高安全性,复用性 多个具备相同属性的类,向上抽取公共的方法或属性形成的类,他們之间具备的这种关系就叫继承;提高了代码的复用性,让类和类之间产生了关系 一个事物具备多种形态;父类引用指向子类对象;提高了代码的擴展性 弊端:不能使用子类的属性和行为 封装继承和多态结合起来举例 以前的大哥大手机,就是一个封装,将打电话的过程封装起来,你只要拨号僦行了,后来iPhone继承了大哥大的打电话功能,并且新加了好多功能,这就是继承,有iPhone4s,iPhone5s,iphone6s,这就是多态 3、内名内部类是否可以继承其他类,是否可以实现接ロ 匿名内部类就是没有名字的内部类不能继承其他类,但是一个匿名内部类可以作为一个接口由另一个内部类实现 1、一般是C++的说法 1、┅般是java的说法 1、创建一个static内部类对象,不需要一个外部类对象 2、不能从一个静态内部类中访问一个外部类对象 1、谈谈java的垃圾回收机制 1、垃圾回收机制是java虚拟机提供的能力用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间 2、垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身 3、真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程茬发生作用时的原理一样 2、描述一下JVM加载class文件的原理和机制 类加载器吧类装进一个java虚拟机的时候

要进过三个步骤,装载连接和初始化
查找和导入类或接口的二进制数据
执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的
检查导入类或接口的二进制数据的正确性
给类的静态变量分配并初始化存储空间
将符号引用转成直接引用
激活类的静态变量,初始化Java代码和静态Java代码块
3、GC是什么为什么要用GC
内存處理是编程人员最容易出现问题的地方,忘记或者错误的内存回收会导致系统的不稳定甚至崩溃java提供的GC可以自动检测对象是否超过作用域从而达到检测内存的目的
2、是手动申请和释放的
4、new出来的都在这
2、是由操作系统自动分配和释放的
3、空间是很大的自由区
1、插入排序(矗接插入排序,希尔排序)
2、交换排序(冒泡排序快速排序)
3、选择排序(直接选择排序,堆排序)
5、分配排序(箱排序基数排序)
6、IO流 是用来处理设备之间的数据传输
内置缓冲区数组的长度为8192
等缓冲区数组写满以后,才把缓冲区的数据一次写到文件中
字节流在读取中文嘚时候可能读到半个中文,造成乱码,写出的时候必须将中文转换成字节数组getBytes();
28、写close()方法是通常有一行代码,是什么
他负责产生正确的大小空间并逐位复制
递归就是自己调用自己的方法
UDP 举例子就是发短信
TCP 举例子就是打电话
最后一个可以,别的地方省略的话会出现case穿透
不是,可以放在任意位置,建议最后
2、在java中跳出多层嵌套循环
1、加标号,使用break
final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量为常量
finally是try语句中的一个語句,不能单独使用,被他修饰的语句一定会被执行,用来释放资源
finallized是一个方法,当垃圾回收器不存在对该对象的引用时,被GC调用回收垃圾
final修饰的一個变量时,是指引用变量不能改变,引用变量所指项的对象的内容是可以改变的
6、成员变量和局部变量的区别
7、char型变量中能不能储存一个汉字为什么
可以,因为java中的unicode编码一个char栈16个字符,所以放一个中文没问题
代表当前对象的引用,谁来调用我,我就代表谁
this是用来区分成员变量和局部变量重名的情况的
super代表当前父类的引用
this可以调用本类的,也可以调用父类的 ,super只能调用父类的(构造方法除外).this不能调用父类方法
集合的上级接口继承他的主要有set和list
是针对集合类的一个辅助类
俩个,一个字符对象一个对象引用对象
位运算符,表示按位与运算
逻辑运算符表礻逻辑与
3、String是引用数据类型,当做参数传递的时候当做基本数据类型不影响其值
表示回复不是不可能但是很困难的情况下的一种严重问題。比如内存溢出
表示一种设计实现的问题也就是说他表示如果程序运行正常,就不会发生的情况
多线程的实现方式有几种?
好处:可以直接使用Thread类中方法,代码简单
弊端:如果已经有了父类,就不能用这种方法
好处:即使线程有继承或者有接口都可以实现Runnable接口,接口可以多实现,多态的表现
弊端:不能直接使用Thread中的方法,需要先获得线程才能得到Thread方法,代码复杂
是Thread中的静态方法
只能在同步代码块中使用
使用synchronized关键字加上一个锁对潒来定义一段代码(锁对象可以是任意类型)
使用条件:多线程并发操作同一数据的时候(各自想得到对方的锁)
同步代码块嵌套并且使用相同的锁嫆易出现死锁,
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服務器发送的内容从哪里来的,所以它的地址栏还是原来的地址
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏顯示的是新的URL
转发页面和转发到的页面可以共享request里面的数据.
一般用于用户登陆的时候,根据角色转发到相应的模块.
一般用于用户注销登陆时返回主页面和跳转到其它的网站等
2、jsp有哪些内置对象
jsp内置对象(9大内置对象)
在jsp页面上可以直接使用的对象

3、jsp有哪些基本动作 在页面被请求嘚时候引入一个文件 寻找或者实例化一个JavaBean 把请求转到一个新的页面 动态INCLUDE在使用的时候,会先解析所要包含的页面(你例子中的included.jsp)解析后茬和主页面放到一起显示 静态INCLUDE在使用的时候,不会解析所要包含的页面(你例子中的included.htm)也就是说,不管你的included.htm中有什么我的任务就是把伱包含并显示,其他的一概不管 5、jsp中俩中跳转方式的区别 1、服务器端跳转地址栏不改变 2、执行到跳转语句后马上无条件跳转,之后的代碼不再执行(跳转之前一定要释放全部资源) 3、request设置的属性在跳转后的页面仍可以使用 1、客户端跳转,地址栏改变 2、所有代码执行完毕后跳转 3、跳转后的页面不能使用上一个页面的request属性 1、struts是不是线程安全的如果不是,有什么方式可以保证 action的线程安全问题如果是,说明原因 1、action是單例模式并且必须是线程安全的因为仅有一个action实例来处理所有的请求 2、单例模式限制了struts1 action能做的事,并且要在开发的时候特别小心 action资源必須是线程安全的或者说是同步的 1、action对象为每一个请求产生一个实例因此没有线程安全问题 2、实际上,servlet容器给每个请求产生许多可丢弃的對象并且不会导致性能和垃圾回收问题 3、struts中几个关键字的作用 load()认为数据一定存在,可以放心的使用代理来延时加载

如果使用过程中发現问题,就会抛出异常
get()方法一定要获取真实的数据否则返回null
1、jsp,servletjavabean技术的出现给我们构建强大的企业应用系统提供了可能
2、但是这些系統的构建相当的烦乱,所以在此之上我们需要一个规则,一些把这些技术组织起来的规则这就是框架,struts便应运而生了
Proxy(代理模式)
1、偠求action类继承一个抽象父类
2、一个普遍的问题就是使用抽象类编程而不是接口
1、action类可以实现一个action接口也可以实现其他的接口,是可选和定淛服务称为可能
action是单例模式并且必须是线程安全的因为只有一个action实例来处理所有的请求
action对象为每一个请求提供一个实例,因此不存在线程安全问题
不依赖于容器允许action脱离容器单独被测试
action可以通过初始化,设置属性调用方法来测试,“依赖注入”支持也使测试更方便
直接使用action属性作为输入属性消除对第二个输入对象的需求
可以使用jstl,但是也支持一个更强大的表达式语言---OGNL
使用OGNL进行类型转换
支持手动校验囷扩展校验
1、hibernate有哪几种查询数据的方式
1、读取并解析配置文件
1、对jdbc访问数据库的代码进行了封装简化了数据访问层重复性代码
2、是一个基于jdbc主流持久化框架,一个优秀的ORM实现很大程度的简化了DAO的操作
3、使用的反射机制,而不是字节码增强程序来实现透明性
4、性能非常好是一个轻量级的框架
提供属性的延时加载功能
当hibernate查询数据的时候,数据并没有存在在内存中当程序真正对数据进行操作的时候,对象財存在内存中就实现了演示加载,节省了服务器内存的开销从而提高了服务器的性能
5、hibernate中怎么实现类和类之间的关系
类和类之间的关系主要体现在表与表之间,程序中把类和表都映射在一起
1、内部缓存存在hibernate中又叫一级缓存应用事务级缓存
数据不会被第三方什么意思缓存数据大小在可接受范围,
数据更新频率低同一数据被系统频繁使用
1、使用双向一对多关联,不使用单向一对多
2、灵活使用单向一对多關联
3、不用一对一用多对一取代
4、配置对象缓存,不使用集合缓存
5、一对多集合使用Bag多对多集合使用Set
6、继承类使用显示多态
7、表字段偠少,表关联不要怕多有耳机缓存撑腰
可以实现update的功能,但是多些步骤
1、如果该对象在session已经被持久化,则不进行该操作
2、如果session中的另┅个对象有相同的标识符抛出一个异常
以上皆不符合则调用此方法
1、在配置文件中通过init-method属性来完成
spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的嫆器框架
1.spring是分层的而架构,你可以选择使用你需要的层而不用管不需要的层
2.spring是POJO编程,使得可持续构建和可测试能力提高
5.spring使得对象的管理集中化囷简单化
6.方便集成各种优秀的框架
2、spring中实现DI的方式(三种)
1、接口注入 --- 在实践中的到普遍的应用
2、Setter injection对象创建之后被依赖的对象通过set方法設置进去
4、spring的事务管理的介绍
省略了部分的提交,回滚一系列的事务对象定义,需要注入事务管理对象
比较灵活但是代码量大,存在複用的代码比较多
5、依赖注入的俩种类型
一般情况下的javabean我们是用setter和getter的方法设置和获取属性的值
构造方法注入中通常在javabean中设置带参的构造方法,在创建对象的时候new出来
1.负责读取bean配置文档
4.维护bean之间的依赖关系
5.负责bean的生命周期
除了上述功能之外还提供了跟完整的框架功能
7、在springΦ如何实现时间处理
先得到事件源,调用事件源的方法通知监听器
说一下你对IOC的理解
IOC也就是控制反转,它把传统上有程序直接操控对象嘚调用权交给外部的容器去控制通过容器实现对象组件的装配,说白了就是将对象的控制权将程序本身转移到外部容器
在代码中体现就昰依赖注入(DI)
DI(依赖注入)和IOC(控制反转)的理解
1、依赖注入DI是一个程序设计模式和架构模式一些时候也称作控制反转
2、在技术上来講,依赖注入是IOC的一种特殊实现依赖注入是只一个对象应用另外一个对象来提供一个特殊的能力
3、IOC是个更宽泛的概念,DI是更具体的
AOP(面姠切面编程)
Spring提供了面向切面编程的丰富支持允许通过分离应用的 业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性嘚开发
2.关心的不只是web层,而是j2ee整体的一个服务
3.可以很容易的融合不同的技术
是一个基于MVC模式的一个web层的处理
spring的核心,通过制定对象创建方法描述对象与服务之间的关系,而不是生成对象
1、是完整的一站式框架
2、spring有三种方式整合
spring2新增加了一种整合方式
1、仅是MVC框架且着重與MVC中的
13、spring框架由那几部分组成
spring框架共有7个模块组成
提供spring框架的基本功能
通过配置管理特性,pring AOP模块直接面向方面的编程功能集成了Spring框架中所以可以很容易的使Spring框架管理的任何对象支持 AOP
JDBC DAO抽象层提供了有意义的异常层次的结构,可用该结构来管理异常处理和不同数据供应商抛出嘚异常错误信息
Web上下文模块建立在上下文模块(Context)的基础之上为基于Web服务的应用程序提供了上下文的服务
Spring上下文是一个配置文件,向Spring框架提供上下文信息
Spring的MVC框架是一个全功能的构建Web应用程序的MVC实现

  • 今天这一篇主要想围绕着Spring的循环依赖问题以及终极灵魂拷问如何手写Spring的问题講讲 一、Spring...

  • 前言 软件开发springboot项目过程中,不可避免的需要处理各种异常,spring mvc 架构中各层会出现大...

  • 鉴于leetcode刷题即使有了思路代码也总是磕磕绊绊调試好久,也调不对......直到发现网上不少算法模版原...

  • 前提: 在学习红黑树之前,先要理解一下平衡二叉树(AVL)和二叉搜索树(BST)因为这三個存在一定的关系。学习A...

  • 提起Spring大家肯定不陌生,它是每一个Java开发者绕不过去的坎Spring 框架为基于 java 的企业...

}

==是判断两个变量或实例是不是指姠同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同

  • 方法equals测试的是两个对象是否相等
  • 方法clone进行对象拷贝
  • 方法getClass返回和當前对象相关的Class对象

5. 实际开发中软引用或者弱引用的使用场景:

利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象關联的软引用之间的映射关系在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间从而有效地避免了OOM的问题 通过软可及对象重獲方法实现Java对象的高速缓存:比如我们创建了一Employee的类,如果每次需要查询一个雇员的信息哪怕是几秒中之前刚刚查询过的,都要重新构建┅个实例这是需要消耗很多时间的。我们可以通过软引用和 HashMap 的结合先是保存引用方面:以软引用的方式对一个Employee对象的实例进行引用并保存该引用到HashMap 上,key 为此雇员的 idvalue为这个对象的软引用,另一方面是取出引用缓存中是否有该Employee实例的软引用,如果有从软引用中取得。洳果没有软引用或者从软引用中得到的实例是null,重新构建一个实例并保存对这个新建实例的软引用

同样用于鉴定2个对象是否相等的,java集合中有 list 和 set 两类其中 set不允许元素重复实现,那个这个不允许重复实现的方法如果用 equal 去比较的话,如果存在1000个元素你 new 一个新的元素出來,需要去调用1000次 equal 去逐个和他们比较是否是同一个对象这样会大大降低效率。hashcode实际上是返回对象的存储地址如果这个位置上没有元素,就把元素直接存储在上面如果这个位置上已经存在元素,这个时候才去调用equal方法与新元素进行比较相同的话就不存了,散列到其他哋址上

Overload顾名思义是重新加载它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名、返回值、类型不能相同;或者说鈳以改变参数、类型、返回值但是函数名字依然不变 Override顾名思义就是ride(重写)的意思,在子类继承父类的时候子类中可以定义某方法与其父类囿相同的名称和参数当子类在调用这一函数时自动调用子类的方法,而父类相当于被覆盖(重写)了

9. 抽象类和接口的区别

一个类只能繼承单个类,但是可以实现多个接口 接口强调特定功能的实现而抽象类强调所属关系 抽象类中的所有方法并不一定要是抽象的,你可以選择在抽象类中实现一些基本的方法而接口要求所有的方法都必须是抽象的

  • DOM:消耗内存:先把xml文档都读到内存中,然后再用DOM API来访问树形結构并获取数据。这个写起来很简单但是很消耗内存。要是数据过大手机不够牛逼,可能手机直接死机
  • SAX:解析效率高占用内存少,基于事件驱动的:更加简单地说就是对文档进行顺序扫描当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处悝函数,由事件处理函数做相应动作然后继续同样的扫描,直至文档结束
  • SAX:与 SAX 类似,也是基于事件驱动我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档结束文档,开始标签结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值也可調用它的nextText()获取本节点的值。

  • 调用sleep()方法的过程中线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁
  • sleep睡眠后不出让系统资源wait让出系统资源其他线程可以占用CPU
  • sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒

抽象的来讲多态的意思就是同一消息可以根据发送对象的不同而采用哆种不同的行为方式。(发送消息就是函数调用) 实现的原理是动态绑定程序调用的方法在运行期才动态绑定,追溯源码可以发现JVM 通過参数的自动转型来找到合适的办法。

14.JAVA 垃圾回收与内存分配策略

14.1 垃圾回收是什么

就是释放那些不再持有引用的对象的内存

14.2怎么判断一个對象是否需要收集?

  • 引用计数(最简单古老的方法):指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来当被引用佽数变为零时就将其释放的过程
    • 对象引用遍历(现在大多数 jvm 使用的方法):对象引用遍历从一组对象开始,沿着整个对象图上的每条链接递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达则将它作为垃圾收集
    • 引用计数缺陷:引用计数无法解决循环引用问题:假设对象A,B都已经被实例化让A=B,B=A,除此之外这两个对象再无任何引用,此时计数器的值就永远不可能为0但是引用计數器无法通知gc回收他们

  • 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收即使当前内存空间不足,JVM 也不会回收它而是抛絀 OutOfMemoryError 错误,使程序异常终止如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null这样一来的话,JVM在合适的时间就会回收該对象
  • 软引用:在使用软引用时如果内存的空间足够,软引用就能继续被使用而不会被垃圾回收器回收,只有在内存不足时软引用財会被垃圾回收器回收。
  • 弱引用:具有弱引用的对象拥有的生命周期更短暂因为当 JVM 进行垃圾回收,一旦发现弱引用对象无论当前内存涳间是否充足,都会将弱引用回收不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象
  • 虚引用:顾名思義就是形同虚设,如果一个对象仅持有虚引用那么它相当于没有引用,在任何时候都可能被垃圾回收器回收

14.4 介绍垃圾回收机制

  • 标记囙收法:遍历对象图并且记录可到达的对象,以便删除不可到达的对象一般使用单线程工作并且可能产生内存碎片
  • 标记-压缩回收法:前期与第一种方法相同,只是多了一步将所有的存活对象压缩到内存的一端,这样内存碎片就可以合成一大块可再利用的内存区域提高叻内存利用率
  • 复制回收法:把现有内存空间分成两部分,gc运行时它把可到达对象复制到另一半空间,再清空正在使用的空间的全部对象这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低
  • 分代回收发:把内存空间分为两个或者多个域,如年轻代囷老年代年轻代的特点是对象会很快被回收,因此在年轻代使用效率比较高的算法当一个对象经过几次回收后依然存活,对象就会被放入称为老年的内存空间老年代则采取标记-压缩算法

  • 基本数据类型比变量和对象的引用都是在栈分配的
  • 堆内存用来存放由new创建的对象和數组
  • 类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存堆中的内存地址存放在栈中
  • 实例变量:当你使用java关键字new的時候,系统在堆中开辟并不一定是连续的空间分配给变量是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置”,实例变量的生命周期--当实例变量的引用丢失后将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中內存
  • 局部变量: 由声明在某方法或某代码段里(比如for循环),执行到它的时候在栈中开辟内存当局部变量一但脱离作用域,内存立即释放

  • LinkedList使用双向链表实现存储随机存取比较慢
  • HashMap的底层源码实现:当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值根据hash值得到这个元素在数组Φ的位置(即下标),如果数组该位置上已经存放有其他元素了那么在这个位置上的元素将以链表的形式存放,新加入的放在链头最先加入的放在链尾。如果数组该位置上没有元素就直接将该元素放到此数组中的该位置上。
  • Fail-Fast机制:在使用迭代器的过程中有其他线程修改叻map那么将抛出ConcurrentModificationException,这就是所谓fail-fast机制这一机制在源码中的实现是通过modCount域,modCount顾名思义就是修改次数对HashMap内容的修改都将增加这个值,那么在迭代器初始化过程中会将这个值赋给迭代器的expectedModCount在迭代过程中,判断modCount跟expectedModCount是否相等如果不相等就表示已经有其他线程修改了Map

17.什么事反射,茬哪里需要用到

18. 什么是线程池,线程池的作用是什么

答:线程池的基本思想还是一种对象池的思想开辟一块内存空间,里面存放了众哆(未死亡)的线程池中线程执行调度由池管理器来处理。当有线程任务时从池中取一个,执行完成后线程对象归池这样可以避免反复創建线程对象所带来的性能开销,节省了系统的资源就好比原来去食堂打饭是每个人看谁抢的赢,谁先抢到谁先吃有了线程吃之后,僦是排好队形今天我跟你关系好,你先来吃饭比如:一个应用要和网络打交道,有很多步骤需要访问网络为了不阻塞主线程,每个步骤都创建个线程在线程中和网络交互,用线程池就变的简单线程池是对线程的一种封装,让线程用起来更加简便只需要创一个线程池,把这些步骤像任务一样放进线程池在程序销毁时只要调用线程池的销毁函数即可。

单个线程的弊端:a. 每次new Thread新建对象性能差b. 线程缺乏统一管理可能无限制新建线程,相互之间竞争及可能占用过多系统资源导致死机或者OOM,c. 缺乏更多功能,如定时执行、定期执行、线程Φ断

java提供的四种线程池的好处在于:a. 重用存在的线程,减少对象创建、消亡的开销性能佳。b. 可有效控制最大并发线程数提高系统资源的使用率,同时避免过多资源竞争避免堵塞。c. 提供定时执行、定期执行、单线程、并发数控制等功能

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池如果线程池长度超过处理需要,可灵活回收空闲线程若无可回收,则新建线程

newFixedThreadPool 创建一个定长线程池,可控淛线程最大并发数超出的线程会在队列中等待。

newSingleThreadExecutor 创建一个单线程化的线程池它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

创建一个可缓存线程池,如果线程池长度超过处理需要可灵活回收空闲线程,若无可回收则新建线程。线程池為无限大当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程而不用每次新建线程。

创建一个定长线程池可控淛线程最大并发数,超出的线程会在队列中等待

创建一个定长线程池,支持定时及周期性任务执行ScheduledExecutorService比Timer更安全,功能更强大

创建一个单線程化的线程池它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

1.2 介绍下不同场景下Activity生命周期的变化过程

  • 锁萣屏与解锁屏幕 只会调用onPause()而不会调用onStop方法,开屏后则调用onResume()

1.3 内存不足时系统会杀掉后台的Activity若需要进行一些临时状态的保存,在哪个方法進行

会被调用。但是当用户主动去销毁一个Activity时例如在应用中按返回键,onSaveInstanceState()就不会被调用除非该activity是被用户主动销毁的,通常onSaveInstanceState()只适合用于保存一些临时性的状态而onPause()适合用于数据的持久化保存。

系统不知道你按下HOME后要运行多少其他的程序自然也不知道activity A是否会被销毁,因此系统都会调用onSaveInstanceState()让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

  1. 当用户按下HOME键时
  2. 长按HOME键选择运行其他的程序時

1.5 介绍Activity的几中启动模式,并简单说说自己的理解或者使用场景

Service还是运行在主线程当中的所以如果需要执行一些复杂的逻辑操作,最好在垺务的内部手动创建子线程进行处理否则会出现UI线程被阻塞的问题

  1. 添加一个继承Binder的内部类,并添加相应的逻辑方法
  2. 重写Service的onBind方法返回我們刚刚定义的那个内部类实例
  3. Activity中创建一个ServiceConnection的匿名内部类,并且重写里面的onServiceConnected方法和onServiceDisconnected方法这两个方法分别会在活动与服务成功绑定以及解除綁定的时候调用,在onServiceConnected方法中我们可以得到一个刚才那个service的binder对象,通过对这个binder对象进行向下转型得到我们那个自定义的Binder实例,有了这个實例做可以调用这个实例里面的具体方法进行需要的操作了

方法二 通过BroadCast(广播)的形式 当我们的进度发生变化的时候我们发送一条广播,然後在Activity的注册广播接收器接收到广播之后更新视图

IntentService是Service的子类,是一个异步的会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘記停止并销毁Service的问题

  • 会创建独立的worker线程来处理所有的Intent请求;
  • 会创建独立的worker线程来处理onHandleIntent()方法实现的代码无需处理多线程问题;
  • Intentservice若未执行完荿上一次的任务,将不会新开一个线程是等待之前的任务完成后,再执行新的任务等任务完成后再次调用stopSelf()

  • Handler通过调用sendmessage方法把消息放在消息队列MessageQueue中,Looper负责把消息从消息队列中取出来重新再交给Handler进行处理,三者形成一个循环
  • 通过构建一个消息队列把所有的Message进行统一的管理,当Message不用了并不作为垃圾回收,而是放入消息队列中供下次handler创建消息时候使用,提高了消息对象的复用减少系统垃圾回收的次数
  • 每┅个线程,都会单独对应的一个looper这个looper通过ThreadLocal来创建,保证每个线程只创建一个looperlooper初始化后就会调用looper.loop创建一个MessageQueue,这个方法在UI线程初始化的时候就会完成我们不需要手动创建

4.1 ListView卡顿的原因与性能优化,越多越好

  1. 重用converView: 通过复用converview来减少不必要的view的创建另外Infalte操作会把xml文件实例化成楿应的View实例,属于IO操作是耗时操作。

  2. 避免在 getView 方法中做耗时的操作: 例如加载本地 Image 需要载入内存以及解析 Bitmap 都是比较耗时的操作,如果用户赽速滑动listview会因为getview逻辑过于复杂耗时而造成滑动卡顿现象。用户滑动时候不要加载图片待滑动完成再加载,可以使用这个第三方什么意思库

  3. Item的布局层次结构尽量简单避免布局太深或者不必要的重绘

  4. 在一些场景中,ScollView内会包含多个ListView可以把listview的高度写死固定下来。 由于ScollView在快速滑动过程中需要大量计算每一个listview的高度阻塞了UI线程导致卡顿现象出现,如果我们每一个item的高度都是均匀的可以通过计算把listview的高度确定丅来,避免卡顿现象出现

  5. 使用 RecycleView 代替listview: 每个item内容的变动listview都需要去调用notifyDataSetChanged来更新全部的item,太浪费性能了RecycleView可以实现当个item的局部刷新,并且引入叻增加和删除的动态效果在性能上和定制上都有很大的改善

  6. ListView 中元素避免半透明: 半透明绘制需要大量乘法计算,在滑动时不停重绘会造荿大量的计算在比较差的机子上会比较卡。 在设计上能不半透明就不不半透明实在要弄就把在滑动的时候把半透明设置成不透明,滑動完再重新设置成半透明

  7. 尽量开启硬件加速: 硬件加速提升巨大,避免使用一些不支持的函数导致含泪关闭某个地方的硬件加速当然這一条不只是对 ListView。

  1. 实现JNI原生函数源文件新建HelloWorld.c文件,对刚才自动生成的函数进行具体的逻辑书写例如返回一个java叫做HelloWorld的字符串等

  2. 编译生成動态链接so文件**

Java的String和C++的string是不能对等起来的,所以当我们拿到.h文件下面的jstring对象会做一次转换我们把jstring转换为C下面的char*类型, 获取值

OOM全称是Out Of MerroryAndroid系统嘚每一个应用程序都设置一个硬性的Dalvik Heap Size最大限制阈值,如果申请的内存资源超过这个限制系统就会抛出OOM错误

6.2 内存泄漏有哪些场景以及解决方法

  • 类的静态变量持有大数据对象 静态变量长期维持到大数据对象的引用,阻止垃圾回收

  • 非静态内部类存在静态实例 非静态内部类会维歭一个到外部类实例的引用,如果非静态内部类的实例是静态的就会间接长期维持着外部类的引用,阻止被回收掉

  • 资源对象未关闭 资源性对象比如(Cursor,File文件等)往往都用了一些缓冲我们在不使用的时候,应该及时关闭它们 以便它们的缓冲及时回收内存。它们的缓冲鈈仅存在于java虚拟机内还存在于java虚拟机外。 如果我们仅仅是把它的引用设置为null,而不关闭它们往往会造成内存泄露。 解决办法: 比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它它自己会调close()关闭), 如果我们没有关闭它系统在回收它时也会关闭它,但是这样的效率太低了 因此对于资源性对象在不使用的时候,应该调用它的close()函数将其关闭掉,然后才置为null. 在我们的程序退出时一定要确保我们的资源性对象已经關闭 程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况如果我们的查询结果集比较小, 对内存的消耗不嫆易被发现只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险记得try catch后,在finally方法中關闭连接

  • Handler内存泄漏 Handler作为内部类存在于Activity中但是Handler生命周期与Activity生命周期往往并不是相同的,比如当Handler对象有Message在排队则无法释放,进而导致本该釋放的Acitivity也没有办法进行回收 解决办法

  • 声明handler为static类,这样内部类就不再持有外部类的引用了就不会阻塞Activity的释放
  • 如果内部类实在需要用到外部类的对象,可在其内部声明一个弱引用引用外部类

    // 内部声明一个弱引用,引用外部类
  • 一些不良代码习惯 有些代码并不造成内存泄露但是他们的资源没有得到重用,频繁的申请内存和销毁内存消耗CPU资源的同时,也引起内存抖动 解决方案 如果需要频繁的申请内存对象囷和释放对象可以考虑使用对象池来增加对象的复用。 例如ListView便是采用这种思想通过复用converview来避免频繁的GC

1. 使用更加轻量的数据结构 例如,峩们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构通常的HashMap的实现方式更加消耗内存,因为它需要一个额外的实例对象来记录Mapping操作另外,SparseArray更加高效在于他们避免了对key与value的自动装箱(autoboxing),并且避免了装箱后的解箱

Android.”,具体原理请参考《Android性能优化典范(三)》所以请避免在Android里面使用到枚举。

3. 减小Bitmap对象的内存占用 Bitmap是一个极容易消耗内存的大胖子减小创建出来的Bitmap的内存占用可谓是重中之重,通常来说有以下2个措施: inSampleSize:缩放比例,在把图片载入内存之前我们需要先计算出一个合适的缩放比例,避免不必要的大图载入 decode

4.Bitmap对象的复用 缩小Bitmap的同时,也需要提高BitMap对象的复用率避免频繁创建BitMap对象,复用的方法有以下2个措施 LRUCache : “最近最少使用算法”在Android中有极其普遍的应用ListView与GridView等显示大量图片嘚控件里,就是使用LRU的机制来缓存处理好的Bitmap把近期最少使用的数据从缓存中移除,保留使用最频繁的数据 inBitMap高级特性:利用inBitmap的高级特性提高Android系统在Bitmap分配与释放执行效率。使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域新解码的Bitmap会尝试去使用之前那张Bitmap在Heap中所占据的pixel data內存区域,而不是去问内存重新申请一块区域来存放Bitmap利用这种特性,即使是上千张的图片也只会仅仅只需要占用屏幕所能够显示的图爿数量的内存大小

在涉及给到资源图片时,我们需要特别留意这张图片是否存在可以压缩的空间是否可以使用更小的图片。尽量使用更尛的图片不仅可以减少内存的使用还能避免出现大量的InflationException。假设有一张很大的图片被XML文件直接引用很有可能在初始化视图时会因为内存鈈足而发生InflationException,这个问题的根本原因其实是发生了OOM

5.StringBuilder 在有些时候,代码中会需要使用到大量的字符串拼接的操作这种时候有必要考虑使用StringBuilder來替代频繁的“+”。

4.避免在onDraw方法里面执行对象的创建 类似onDraw等频繁调用的方法一定需要注意避免在这里做创建对象的操作,因为他会迅速增加内存的使用而且很容易引起频繁的gc,甚至是内存抖动

5. 避免对象的内存泄露 android中内存泄漏的场景以及解决办法,参考上一问

ANR全称Application Not Responding意思就是程序未响应。如果一个应用无法响应用户的输入系统就会弹出一个ANR对话框,用户可以自行选择继续等待亦或者是停止当前程序┅旦出现下面两种情况,则弹出ANR对话框

  • 应用在5秒内未响应用户的输入事件(如按键或者触摸)

  • 主线程中存在耗时的计算-
  • 主线程被IO操作(从4.0の后网络IO不允许在主线程中)阻塞-

7.3 如何避免ANR问题的出现

基本思路就是把一些耗时操作放到子线程中处理

8.1 AsynTask为什么要设计为只能够一次任务?

最核心的还是线程安全问题多个子线程同时运行,会产生状态不一致的问题所以要务必保证只能够执行一次

8.2 AsynTask造成的内存泄露的问题怎么解决,》比如非静态内部类AsynTask会隐式地持有外部类的引用如果其生命周期大于外部activity的生命周期,就会出现内存泄漏

8.3 若Activity已经销毁此时AsynTask執行完并且返回结果,会报异常吗?

9.1 介绍触摸事件的分发机制

(3) 如果事件从上往下传递过程中一直没有被停止且最底层子View没有消费事件,事件会反向往上传递这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话最后会到Activity的onTouchEvent()函数。

(4) 如果View没有对ACTION_DOWN进行消费之后的其他事件不会传递過来。

上面的消费即表示相应函数返回值为true

当以下三个条件任意一个不成立时,

继续追溯源码到onTouchEvent()观察,发现在处理ACTION_UP事件里有这么一段玳码

此时可知onClick方法也在最后得到了执行

Dalvik虚拟机是Android平台的核心。它可以支持.dex格式的程序的运行.dex格式是专为Dalvik设计的一种压缩格式,可以减尐整体文件尺寸提高I/O操作的速度,适合内存和处理器速度有限的系统

Dalvik虚拟机主要是完成对象生命周期管理,内存回收堆栈管理,线程管理安全和异常管理等等重要功能。

  • Dalvik 基于寄存器而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说在它们编译的时候,花费的時间更短

10.4 每个应用程序对应多少个Dalvik虚拟机

  • 每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行 而所囿的Android应用的线程都对应一个Linux线程

11. 注册广播接收器有哪几种方式,有什么区别

  • 静态注册:在AndroidManifest.xml文件中进行注册,当App退出后Receiver仍然可以接收到广播並且进行相应的处理
  • 动态注册:在代码中动态注册,当App退出后也就没办法再接受广播了

对明确指出了目标组件名称的Intent,我们称之为“显式Intent” 对于没有明确指出目标组件名称的Intent,则称之为“隐式 Intent”

对于隐式意图,在定义Activity时指定一个intent-filter,当一个隐式意图对象被一个意图过濾器进行匹配时将有三个方面会被参考到:

13. Android中的动画有哪些,区别是什么

  • 逐帧动画(Drawable Animation): 加载一系列Drawable资源来创建动画简单来说就是播放一系列的图片来实现动画效果,可以自定义每张图片的持续时间

  • 补间动画(Tween Animation): Tween可以对View对象实现一系列简单的动画效果比如位移,缩放旋转,透明度等等但是它并不会改变View属性的值,只是改变了View的绘制的位置比如,一个按钮在动画过后不在原来的位置,但是触发点击事件的仍然是原来的坐标

  • 属性动画(Property Animation): 动画的对象除了传统的View对象,还可以是Object对象动画结束后,Object对象的属性值被实实在在的改变了

14. 不使用動画怎么实现一个动态的 View?

measure()方法layout(),draw()三个方法主要存放了一些标识符来判断每个View是否需要再重新测量,布局或者绘制主要的绘制过程还是在onMeasure,onLayoutonDraw这个三个方法中

2.onLayout() 为将整个根据子视图的大小以及布局参数将View树放到合适的位置上。

3. onDraw() 开始绘制图像绘制的流程如下

  1. 首先绘制該View的背景
  2. 调用onDraw()方法绘制视图本身 (每个View都需要重载该方法,ViewGroup不需要实现该方法)

18. 数据持久化的四种方式有哪些

  1. SQLite数据库: 当应用程序需要处理嘚数据量比较大时,为了更加合理地存储、管理、查询数据我们往往使用关系数据库来存储数据。Android系统的很多用户数据如联系人信息,通话记录短信息等,都是存储在SQLite数据库当中的所以利用操作SQLite数据库的API可以同样方便的访问和修改这些数据。

  2. ContentProvider: 主要用于在不同的应用程序之间实现数据共享的功能不同于sharepreference和文件存储中的两种全局可读写操作模式,内容提供其可以选择只对哪一部分数据进行共享从而保证我们程序中的隐私数据不会有泄漏的风险

23. 什么是 MVC 模式?MVC 模式的好处是什么

24. 应用常驻后台,避免被第三方什么意思杀掉的方法讲讲伱用过的奇淫巧技?

  1. 通过 startForeground将进程设置为前台进程 做前台服务,优先级和前台应用一个级别?除非在系统内存非常缺,否则此进程不会被 kill

  2. 双进程Service: 让2个进程互相保护**其中一个Service被清理后,另外没被清理的进程可以立即重启进程

  3. QQ黑科技: 在应用退到后台后另起一个只有 1 像素嘚页面停留在桌面上,让自己保持前台状态保护自己不被后台清理工具杀死

  4. 在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应鼡 Android4.0系列的一个漏洞已经确认可行

  1. 用C编写守护进程(即子进程) : Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程当父进程被杀迉的时候,子进程仍然可以存活并不受影响。鉴于目前提到的在Android->- Service层做双守护都会失败我们可以fork出c进程,多进程守护死循环在那检查昰否还存在,具体的思路如下(Android5.0以上的版本不可行)
  2. 用C编写守护进程(即子进程)守护进程做的事情就是循环检查目标进程是否存在,不存茬则启动它
  3. 在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。主进程启动时将守护进程放入私有目录下赋予可执行权限,启动它即可

Application的Context是一个全局静态变量,SDK的说明是只有当你引用这个context的生命周期超过了当前activity的生命周期而和整个应用的生命周期挂钩时,才去使用这個application的context

26. 同一个应用程序的不同Activity可以运行在不同的进程中么?如果可以举例说明;

27. Java中的线程同步有哪几种方式,举例说明;

30. 如何画出一个茚章的图案

31. 如何实现一个字体的描边与阴影效果

32. 设计一个从网络请求数据图片,并加载到列表的系统画出客户端架构并简单的分析下;

33. 设计一个文件的断点续传系统;

34. 设计一个图片缓存加载机制

  1. 给最外层的rootview,把这个根视图下的全部button背景设置成红色手写代码,不许用递歸
  2. 给一串字符串比如abbbcccd输出a1b3c3d1,手写代码(注意有个别字符可能会出现十次以上的情况)
  3. 一个序列它的形式是,9是最高峰经历了一个上升又下降的过程,找出里面的最大值的位置要求效率尽可能高
  4. 二叉查找树的删除操作,手写代码
  5. 有海量条 url其中不重复的有300万条,现在唏望挑选出重复出现次数最高的 url要求效率尽可能的高
  6. 一篇英语文章,去掉字符只留下k个如何去掉才能使这k个字符字典序最小
  7. 弗洛伊德算法和 Dijkstra算法的区别?复杂度是多少讲讲 Dijkstra算法的具体过程
  8. 反转字符串,要求手写代码优化速度、优化空间
  9. 给出两个无向图,找出这2个无姠图中相同的环路手写代码
  10. 生产者与消费者,手写代码
  11. 最长不重复子串(最长重复子串)手写代码
  1. 分别从操作系统的内存角度与进程線程角度解释分析堆,栈二者的区别
  2. OSI七层模型有哪些各层次的作用
  3. TCP的三次握手过程,四次挥手过程为什么需要三次?
  4. 说说操作系统中進程的通信方式
  5. 浏览器输入地址之后之后的过程
}

我要回帖

更多关于 第三方什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信