黑马程序员基础测试题(精选7篇)
黑马程序员基础测试题 篇1
黑马程序员基础测试题
1、已知一个int数组, 编程从数组中获取最大数.2、编写一个方法(名字自定,但要符合Java编码规范),方法内打印一字符串,并在main()方法内调用它。
3、环境变量path和classpath的作用是什么?
系统环境 path 为了更方便应用java 开发工具 将要执行命令的所在路径给系统、让系统去寻找 方便执行、必须是可执行文件先找当前路径再找path 路径 临时配置方式 通过set 命令完成、设置查看环境变量的值 在path环境变量的基础上添加新的目录 在任意目录下执行java 执行程序 专门给类文件设置路径 将class 文件所在目录 告诉系统,让系统去寻找 虚拟机先从classpath 寻找
4、UDP协议与TCP协议有什么不同?
5、编写一个类Person,为Person类定义年龄、姓名两个属性,并且定义一个SayHello方法,方法执行时输出“我是***我的年龄是***”;定义一个Chinese类从Person类继承。
6、创建一个包含有private的属性和private方法的类。然后创建一个内部类,它有一个方法可用来修改外部类的属性,并调用外部类的方法。在外部类的另一个方法中,创建此内部类的对象,并且调用它的方法。
7、用控制台程序输出九九乘法表;输出结果按下图所示:
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
.........8、编写程序拷贝一个文件, 尽量使用效率高的方式.9、编写HTML注册表单, 需要字段: 用户名, 密码, 确认密码, 性别(单选), 城市(下拉列表), 兴趣爱好(多选), 个人简介(文本域).10、定义一个学生类, 需要有姓名, 年龄, 考试成绩三个成员属性,创建5个对象, 属性可为任意值.编程对这5个对象按成绩排序,并将结果输出。(提示,用TreeSet和Comparator实现)
黑马程序员基础测试题 篇2
1 明确学习目的, 激发学习兴趣
良好的学习兴趣可以促使学员更有选择地、积极主动的去学习, 它是学员学习的动力, 能够良好的推进学员自主学习。教学中如何提高学生的学习兴趣, 这里提几点建议。
1.1 让学员明白学习C语言的必要性
在课堂的开始, 引入学习程序设计的重要性, 可以提几个问题, 如“如何解决生活中的常见问题?C语言能做什么?如何来学习C语言?”;教员可通过几个简单的C程序实例演示来提高学员的兴趣。如:猴子吃桃问题, 星型图形输出问题, 求算术表达式的值等。
1.2 展示 C 语言设计魅力, 增加实例趣味性
在平时的课堂教学中, 尽量避开枯燥的语法式的实例, 而选用贴近生活的实例来充分调动学员的学习思维。提高思维的实例有很多, 如:多重循环是程序设计课程的一个难点, 但是在数组、函数、指针中均会用到, 所以必须学好。为了提高学习兴趣, 形成良好的程序思维, 可以引入贴近生活的实例, 如有100元钱, 换成1元、2元、5元、10元、20元、50元, 可以有几种兑换方式, 看学员是否能够一下子说出来, 然后教员可以通过引导学员用多重循环语句解决此问题。
实践证明, 通过贴近生活实例的实例引入, 然后讲解多重循环的语法, 可以充分调动学员学习热情, 学员也将被动的学习转变为主动学习, 并对学习程序设计有了浓厚的兴趣, 从而提高学习效率。
2 加强实验以及错误总结同时提高语法学习
《程序设计基础》是程序设计的入门课程, 也是计算机初学者很难理解的一门课程。如果学员只听课, 不加强实验, 根本无法达到学习目的。因此实验课的开设和开设质量显得非常重要。
首先, 理论需求与实践相结合。在课程设置上, 理论课应与实践课相结合。理论课上主要强调语法格式, 以及编写程序的步骤, 并且提出实验课需要完成的题目, 带领学员一起分析解决问题的算法。同时鼓励学员多用不同的方法解决问题。实践课上主要强调学员通过课堂上书写的算法进行程序的实现。让学员在实践中更好的理清程序设计思路, 同时体会程序设计带来的快乐, 从而树立学习信心。
再者, 要求每位学员建立调试错误档案。C程序语法比较简单, 但是能够熟练运用语法却不容易, 初学者往往只是简单的掌握了书写格式, 而在实验过程中往往会遇到各种各样的错误, 有些错误还是重复的。因此, 要求学员建立错误档案, 时时提醒学员调试常见错误, 可以更好的提高学习效率。
3 合理运用多媒体课件演示程序
学习C语言的语法是枯燥的, 而算法的复杂也给学习带来了一定的困难, 教员要有意识的运用直观地、动态地、图示化的方式来讲解C语言中有关的难点与重点内容。如在讲解数组一章中的冒泡排序中, 可以采用动画方式把数组元素比较的过程及每趟排序后的结果显示出来, 让学员将抽象的思维更加立体化, 从而提高理解, 更好的掌握排序算法。
4 课程设计分步教学法融入到教学中
课程设计分部教学法, 也称项目教学法, 是师生通过共同实施一个完整的项目工作而进行的教学活动。通过课程设计的完成, 学员可以更好的理解C语言程序设计课程每章的内容, 并培养学员良好的思维以及编程习惯, 能掌握综合运用所学知识的能力, 从而完全了解项目流程, 真正提高编程水平。如让学员编写一个简单的学员信息管理系统。
实际教学中, 笔者采用了上述教学方法, 教学效果得到了明显的提高。同时, 在注重培养学员学习兴趣的同时, 不可忽视学员学习态度、思维能力、认真精神的培养。这样, 才会使得C语言的教学更有意义。
5 把学习和实际应用结合
我们学校的任课教师在每次期中 (期末) 考试后, 都要对学生考试取得成绩进行汇总分析, 作为在下一步教学工作中改进提高的参考依据。假设全班共有40个人, 我们现在是这么对学生的考试成绩进行分析的:
1) 90100的共有名同学, 占总人数的%
2) 8090的共有名同学, 占总人数的%
3) 7080的共有名同学, 占总人数的%
4) 6070的共有名同学, 占总人数的%
5) 不及格的共有名同学, 占总人数的%
6) 最高分是分, 最低分是分, 平均分是分
每次我们教师在分析学生成绩的时候, 都是把成绩输入到Excel电子表格中, 逐步按照条件进行筛选、排序、计算, 最后得到我要的数据。能不能用我们所学的编程知识来编一个程序, 让我们的成绩分析工作变的简单些呢?我首先把这个问题留给了同学们, 先让他们去努力思考, 鼓励他们把所学习的知识运用到解决实际问题中。通过观察了解, 很多同学能知道这个程序应该怎么写, 用到那些知识点, 甚至有些学习好的同学能把大概的程序框架写出来了。我就根据大多数同学书写的水平, 有针对性地开始讲解。这个程序主要用到了分支结构、循环结构和数组这三大知识点, 具体的书写过程应该是这样的:定义变量、数组用循环控制输入数组元素值用循环控制筛选、统计、求最大最小值、求和求平均、百分比显示结果。然后将本程序的书写当作作业留给了同学。通过批改作业, 发现了同学们在书写过程中出现的一系列问题, 在下一次上课的时候有针对性地进行了讲解, 帮助同学们进行最后的修改和完善。
摘要:学院开设《程序设计基础》课程的主要目的是让学员掌握程序设计基本方法, 并培养学员的自学能力和动手解决问题的能力。但在实际教学过程中, 教员发现学员学习兴趣不浓。笔者针对教学存在的主要问题, 提出了提高《程序设计基础》课程教学质量的建议。
关键词:程序设计基础,教学质量,学习兴趣
参考文献
[1]王宁.C语言程序设计教学初探[J].科技创新导报, 2008 (8) .
[2]吕凤翥.C语言程序设计[M].北京:清华大学出版社, 2006:6.
[3]李雁冰著.课程评价论[M].上海教育出版社, 2002
[4]王景英主编.教育评价理论与实践[M].东北师范大学出版社, 2002
民事简易程序之理论基础研究 篇3
【关键词】:简易程序 经济效益 程序利益 诉讼费用相当
中图分类号:DF728.2 文献标识码:A 文章编号:1003-8809(2010)06-0162-01
一套制度或者一种程序欲求其合理设置与贯穿实施,必需先从理论上融会贯通,然后才能在现实中有效的运作。简易程序的设置有其现实需要性,当然也有其理论基础,理论基础是该程序设置内在的根基,为该制度提供了合理的论证。
一、经济效益理论
日本著名学者谷口安平曾经指出,在众多国家里,迅速地审判一直被当作诉讼制度的理想。繁琐的诉讼程序和日益增多的民事案件之间形成一个矛盾,摆在了法院的面前。有学者提出“从理论上讲,设立简易程序的主要目的在于对正义与效益这两大程序价值目标加以适当的协调,以避免或延缓两者的冲突和矛盾”[1]。由此,引出了简易程序最重要的理论基础——经济效益理论。
效益原本是经济学中的一个基本概念,效益机制(Mechanism of Efficiency)问题的产生基于稀缺规律,即人的欲望和需求的无限性与现实中满足欲望和需求的资源和方式的有限性存在矛盾。效益是成本和收益之比(或者投入和产出之比)。从哲学的角度来看,效益体现为一种过程与结果之间的发展关系,即效益的价值内涵应该不仅包括过程的经济合理性,还应包括结果的合目的性。
将上述分析结构引入司法,可以使我们对于采用一种规则而不采用另一种规则所产生的收益和分配进行理性的评价。诉讼效率通常是指程序主体以最快的速度终结案件,强调以最少的时间耗费来解决纠纷。由于司法资源的有限,诉讼效益要求诉讼方式的经济性选择,在达成一定的诉讼目的所选用的不同诉讼方式所包含的不同消耗间具有一定的可比性。[2]因此,在民事诉讼中,效益价值的实质就是通过寻求最佳方式,即以最少的人力、物力和财力,在最短的时间内最大限度的实现人们对于正义、权利的要求。诉讼程序的经济成本一般包括“错误判决的成本”(错误判决带来的资源浪费)和“诉讼制度的运行成本”(为达成判决消耗的司法资源),由此,程序法的目的便是实现错误成本(EC)与直接成本(DC)的最小化。[3]此外,美国学者德沃金主张错误判决除带来经济成本外,还造成道德浪费,构成道德成本(MC),据此贝勒斯将“道德的错误成本”(MC)作为一个新的变量引入程序法的经济分析中。于是,追求诉讼效益就成为了实现错误成本、直接成本和道德成本总额(EC+DC+MC)的最小化。[4]与普通程序相比,简易程序使诉讼的直接成本趋于最小化,适用简易程序审理能够达到与普通程序审理大致相当或至少差别不大的效果的前提下,简易程序显然比普通程序更具效益性。
一个国家在特定时期内可支出的司法资源是有限的,用成本昂贵的普通程序处理重大、复杂、疑难案件,而用花费较少的简易程序处理案情相对简单的案件,可以使有限的司法资源得到充分有效的利用,实现诉讼制度纠纷解决机能的最大化。
二、程序利益理论
程序利益是指由于简速化程序的利用或者避免使用繁琐、缺乏实益的程序,而可以节省的劳力、时间或者费用。当国家创设一种程序时,理应有保障当事人程序利益的考虑,否则,当事人极有可能因为所得利益不对称而放弃司法救济制度。当事人在诉讼过程中都有趋利避害的心理,会综合考虑程序利益与程序不利益,经过比较分析然后作出决定。如果程序不利益大于程序利益,可能会侵害当事人的实体利益,当事人为此甚至可能放弃诉讼。与普通程序相比而言,简易程序审理期间较短,程序简便灵活,当事人的诉讼权利并不会因为程序的简化而减损,反而收获更多的程序利益。程序利益理论与当事人在诉讼中趋利避害的心理相契合,为简易程序的设置提供了又一理论基础。
三、费用相当性原理
“所谓费用相当性原则是指在使当事人利用诉讼程序或由法官运作审判制度之过程中,不应使法院(国家)或者当事人(人民个人)遭受期待不可能之浪费或利益牺牲,否则显受如此浪费或牺牲之人即得拒绝使用此种程序制度,此即费用相当性基本原理,应为制定或运作程序制度时所遵循”。[5]普通诉讼程序的高额诉讼费用对简易程序当事人的权利保障有消减的作用。“能够为人们所信仰的法律必须是能够给人民至少是绝大多数人带来利益的”,[6]那么,我们有理由推导——能够为人民所接受的法律程序也应该是能够满足最大多数人利益诉求的程序。正是基于费用相当原则的考虑,简易程序简化了诉讼程序,去除当事人不必要的支出,当事人的诉讼费用比较低廉,对保障当事人的程序主体利益发挥重要作用。
此外,还有学者提出了“国家保障当事人平等使用诉讼制度”、“民事纠纷的程序设置应与案件类型相适应”、“平衡慎重裁判之程序保障与简速裁判之程序保障”等法理基础。[7]这都极大程度上丰富了简易程序的理论基础。
诉讼效益理论和程序利益理论等作为理论基础为简易程序的制度设计提供了支持与指导,同时也彰显了简易程序效率、平等的价值,简易程序的理论基础为其实践运作提供了内在动力。
参考文献:
[1]陈瑞华:《刑事审判原理论》,北京大学出版社1997年版,第378页。
[2]龙宗智:《相对合理主义》,中国政法大学出版社1999年版,第200页。
[3]R. A. Posner, An Economic Approach to Legal Procedure and Judicial Administration, in the Journal of Legal Studies 2 (1973) , p. 401.
[4][美]迈克尔•D. 贝勒斯著,张文显译:《法律的原则》,中国大百科全书出版社1996年版,第28页。
[5]邱联恭:《小额诉讼制度与简易程序法》,载《司法之现状与程序法》,1993年台湾三民书局出版,第272页。
[6]苏力:《制度是如何形成的》,中山大学出版社1999年版,第247—248页。
[7]章武生:《简易—小额诉讼程序与替代性程序之重构》,载《法学研究》,2000年第4期。
作者简介:
邢晓娟(1986—),女,山东聊城人,南京大学法学院2008级硕士研究生。研究方向:诉讼法学。
黑马程序员视频总结 篇4
类是对现实生活的描述。对象是一类事物实实在在存在的个体。
堆内存和栈内存:基本类型的变量和对象的引用存储在栈内存;用new创建的对象和数组存储在堆内存。
封装:隐藏对象的属性和实现细节,仅对外提供公共访问方法。原则:将不需要对外提供的内容都隐藏起来,将属性都隐藏,提供公共方法对其访问。好处:提高安全性,便于使用,提高重用性。
什么时候使用静态?成员变量:当对象中有共享数据时。成员函数:函数内部没有访问到非静态数据(对象的特有数据)。
帮助文档制作:/***/@author作者;@version 版本;@param 参数;@return 返回结果 命令:javadoc-d 文件夹-author-version xxx.java。将生成一系列网页。
静态代码块:static{}。用于给类进行初始化,只执行一次,优先于主函数。
Person p=new Person():
1、找到Person.class加载到内存。
2、执行static代码块。
3、在栈内存中开辟main()方法空间,并分配一个 变量p。
4、在堆内存中开辟实体空间。
5、进行属性的空间分配,并进行默认初始化。
6、对空间属性进行显示初始化。
7、实体的构造代码初始化。
8、调用对应的构造函数,进行构造函数初始化。
9、将实体空间首地址赋给p。单例:
class Single{
private Single(){} //私有化构造函数。
private static Single s = new Single();//静态方法要访问它,所以也要静态化。静态方法不能访问非静态的方法和属性。创建私有并静态的本类对象。
public static Single getInstance(){ //无法通过对象调用,只能是静态。定义公有并静态的方法,返回该对象。
return s;
}
}
//懒汉式:延迟加载方式。
class Single2{
private Single2(){}
private static Single2 s = null;
public static synchronized Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}
继承:提高代码复用性,并为多态打下基础。Java只支持单继承。多继承隐患:多个父类定义相同功能时,子类对象不确定要运行哪一个。重载:方法名相同,但参数不同的多个同名函数;
覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同
隐藏:父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
内部类:内部类可以直接访问外部类的成员,包括私有。外部类必须建立内部类对象才能访问内部类成员。
异常体系:error和exception
==和equals()的区别:“==”和“!=”比较的是“栈”中的内容(对象的地址),而equals()比较的是“堆”中的内容(对象的内容)。
多线程:建立线程两种方法:
1、继承Thread类;
2、实现Runnable接口。继承接口避免了单继承的局限性。
线程对象.setDaemon(true)设置守护线程。线程启动前调用,当正在运行的线程只有守护线程时,java虚拟机退出。
当a线程执行b线程的.join()方法时,a会等待b线程执行完才会执行。
线程对象.setPriority()设置线程优先级。
StringBuilder不是线程安全的,速度快;StringBuffer线程安全,慢。
泛型是一个类型安全机制,用于解决安全问题。
集合:
为方便存储和操作对象,出现集合类。数组可以存储对象,但长度固定,集合长度可变;数组可以存储基本数据类型,集合只能存储对象。
Collection:List和Set
List:有序,元素可以重复,有索引。
ArrayList,底层数据结构是数组。查找速度快。删除元素用equals()判断
LinkList,链表,增删速度快。
Vector。线程同步,数组,查找速度快。
Set:无序。元素唯一。
HashSet:底层数据结构式哈希表。通过hashCode()和equals()方法保持唯一性。如果元素hashCode值相同才会判断equals是否为true;
TreeSet:底层是二叉树。可以对元素进行排序。按自然顺序就是compareTo()。
实现排序的两种方法:
1、实现Comparable接口,覆盖comapreTo(Object obj)方法。
2、实现Comparator接口,覆盖compare(Object,Object)方法。
Map:
Hashtable,底层哈希表,不可以存储null值或键。线程同步。效率低。
HashMap,哈希表,允许使用null值或键。不同步,效率高。
TreeMap。底层是二叉树,线程不同步。可以给键进行排序。
获取Map元素的两种方法:
1、Set
2、Set
Collections:java集合的工具类,用于操作集合类。
Arrays集合:用于操作数组的工具类。
1.5新特性:可变参数,int...arr
静态导入:import static java.lang.System.*;用于导入静态方法;import java.lang.*;用于导入类文件。
System类:getProperties()方法获得返回系统属性Properties(Map集合子类)对象。Runtime类:运行时操作类。单例设计模式。
Calendar类:抽象类,用getInstance()获得对象。
Math类。
IO流:
常用基类:派生子类用父类名做后缀
字节流:InputStream,OutputStream
字符流:Reader,Writer
字符流:FileWriter,FileReader,需要flush();
字符流缓冲区:BufferedReader,BufferedWriter;要结合流才能使用。需要flush(),关闭缓冲区就是关闭缓冲区的流对象。
LineNumberReader(FileReader)类,getLineNumber()方法可以获得行号
字节流:FileOutputStream,FileInputStream。操作多媒体文件。
转换流:InputStreamReader,OutputStreamWriter。属于字符流的子类。In(System.in),out返回字节流。
System.setIn(InputStream),System.setOut(PrintStream);改变标准输入输出。
File类:
合并流:SequenceInnputStream。用vector的elements()得到Enumeration。
切割文件:循环里边创建流、关闭流。讲一个文件分部分存储在几个文件中。
java.Awt:需要调用本地系统方法实现功能。
javax.Swing:完全由java实现,增强移植性。
Component:
1、Container:Window,Panel
布局管理器:
1、FlowLayout,Panel默认布局;
2、BorderLayout,Fram默认。
TCP和UDP:TCP要经过三次握手建立连接,传输大量数据,可靠协议,效率低。UDP不需要建立连接,不可靠协议,速度快。
Socket:网络服务的一种机制,网络通信就是Socket间的通信,数据在两个Socket间通信。TCP:Socket,ServerSocket
UDP:DatagramSocket,DatagramPacket
加强:
overload:重载,存在于父类和子类、同类中。只能通过不同参数样式重载。
override:重写,存在于父类和子类之间。方法名、参数、返回值相同。子类方法不能缩小父类方法访问权限。不能抛出更多异常。
可变参数:int...arr
For循环增强:for(int i:int[])
枚举:让某个变量的取值只能为若干个固定值中的一个。
反射:在运行状态能够知道类的所有属性和方法,并调用对象的任意一个方法。获取类信息以及调用对象的方法。
类加载器:负责加载java类的字节码到虚拟机中。每个类加载器加载类时先委托给其上级加载器,当所有祖宗类加载器都没有加载到类,回到发起者类加载器时,还没加载到类,抛出ClassNotFoundException异常。
JavaBean:有set和get方法获得类属性的特殊java类。用于传递数据信息。
内省:IntroSpector,java语言对Javabean属性、事件的一些缺省处理方法。
Beanutils工具包
注解:@Override表示当前方法是覆盖父类的方法。
@Deprecated表示当前元素是不赞成使用的。
@SuppressWarnings 表示关闭一些不当的编译器警告信息。
Java系统默认三个类加载器:BootStrap,ExtClassLoader,AppClassLoader
创建动态类的实例对象:
1、通过实现的接口告诉要实现的动态类要实现哪些方法。
2、产生的类的字节码要有一个关联的类加载器对象。
3、执行代码的对象InvocationHandler。
代理:用Proxy类的getProxyClass(classLoader,interface)获得动态类的字节码文件。用反射获得构造器。用构造器的newInstance()InvocationHandler接口的对象做参数获得一个类对象。InvocationHandler对象重写pubic Object invoke(Object proxy,Method method,Object
[] args)方法返回method.invoke(target,args)。
创建动态代理对象步骤:
1、实现InvocationHandler 接口创建自己的调用处理器。重写invoke方法。
2、用Proxy.newProxyInstance(classLoader,new Class[]{Interface.class},handler}方法获得代理类实例。
Bank:
NumberManager类:产生客户
Private int lastNumber;
Private List
int synchronized generateNewManager():产生新客户号码。客户线程调用。
int synchronized fetchServiceNumber():取走客户号码。窗口线程调用。List是共享数据。需要互斥。
NumberMachine类:号码管理器,采用单例设计模式
private NumberManager commonManager;用get()返回对象。
private NumberManager expressManager;用get()访问。
private NumberManager vipManager;用get()访问。
Enum CustomerType COMMON,EXPRESS,VIP;
ServiceWindow类:窗口
private int windowId;窗口号码
enum CustomerType type;
public void start(){Executors.newSingleThreadExcutor().execute(new Runnable(){publicvoid run(){}})};根据type启动相应的窗口服务。
MainClass:main()函数类
开启5个普通窗口。
一个快速
一个vip
黑马程序员基础测试题 篇5
1、IOS中常用的数据存储方式有哪些?
答:1.数据存储有四种方案,NSUserDefault,KeyChain,File,DB.2.其中File有三种方式:plist,Archiver,Stream 3.DB包括core Data和FMDB
2、说一说你对sqlite的认识
SQLite是目前主流的嵌入式关系型数据库,其最主要的特点就是轻量级、跨平台,当前很多嵌入式操作系统都将其作为数据库首选。虽然SQLite是一款轻型数据库,但是其功能也绝不亚于很多大型关系数据库。学习数据库就要学习其相关的定义、操作、查询语言,也就是大家日常说得SQL语句。和其他数据库相比,SQLite中的SQL语法并没有太大的差别,因此这里对于SQL语句的内容不会过多赘述,大家可以参考SQLite中其他SQL相关的内容,这里还是重点讲解iOS中如何使用SQLite构建应用程序。先看一下SQLite数据库的几个特点:
1.基于C语言开发的轻型数据库
2.在iOS中需要使用C语言语法进行数据库操作、访问(无法使用ObjC直接访问,因为libqlite3框架基于C语言编写)
3.SQLite中采用的是动态数据类型,即使创建时定义了一种类型,在实际操作时也可以存储其他类型,但是推荐建库时使用合适的类型(特别是应用需要考虑跨平台的情况时)
4.建立连接后通常不需要关闭连接(尽管可以手动关闭)
在iOS中操作SQLite数据库可以分为以下几步(注意先在项目中导入libsqlite3框架):
1.打开数据库,利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作。
2.执行SQL语句,执行SQL语句又包括有返回值的语句和无返回值语句。3.对于无返回值的语句(如增加、删除、修改等)直接通过sqlite3_exec()函数执行;
4.对于有返回值的语句则首先通过sqlite3_prepare_v2()进行sql语句评估(语法检测),然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite3_column_类型()方法获得对应列的数据,如此反复循环直到遍历完成。当然,最后需要释放句柄。
3、说一说你对FMDB的认识
FMDB是一个处理数据存储的第三方框架,框架是对sqlite的封装,整个框架非常轻量级但又不失灵活性,而且更加面向对象。FMDB有如下几个特性:
1.FMDB既然是对于libsqlite3框架的封装,自然使用起来也是类似的,使用前也要打开一个数据库,这个数据库文件存在则直接打开否则会创建并打开。这里FMDB引入了一个MFDatabase对象来表示数据库,打开数据库和后面的数据库操作全部依
赖此对象。
2.对于数据库的操作跟前面KCDbManager的封装是类似的,在FMDB中FMDatabase类提供了两个方法executeUpdate:和executeQuery:分别用于执行无返回结果的查询和有返回结果的查询。当然这两个方法有很多的重载这里就不详细解释了。唯一需要指出的是,如果调用有格式化参数的sql语句时,格式化符号使用“?”而不是“%@”、等。
3.我们知道直接使用libsqlite3进行数据库操作其实是线程不安全的,如果遇到多个线程同时操作一个表的时候可能会发生意想不到的结果。为了解决这个问题建议在多线程中使用FMDatabaseQueue对象,相比FMDatabase而言,它是线程安全的。
4.将事务放到FMDB中去说并不是因为只有FMDB才支持事务,而是因为FMDB将其封装成了几个方法来调用,不用自己写对应的sql而已。其实在在使用libsqlite3操作数据库时也是原生支持事务的(因为这里的事务是基于数据库的,FMDB还是使用的SQLite数据库),只要在执行sql语句前加上“begin transaction;”执行完之后执行“commit transaction;”或者“rollback transaction;”进行提交或回滚即可。另外在Core Data中大家也可以发现,所有的增、删、改操作之后必须调用上下文的保存方法,其实本身就提供了事务的支持,只要不调用保存方法,之前所有的操作是不会提交的。在FMDB中FMDatabase有beginTransaction、commit、rollback三个方法进行开启事务、提交事务和回滚事务。
4、说一说你对Core Data的认识
Core Data使用起来相对直接使用SQLite3的API而言更加的面向对象,操作过
程通常分为以下几个步骤:
1.创建管理上下文
创建管理上下可以细分为:加载模型文件->指定数据存储路径->创建对应数据类型的存储->创建管理对象上下方并指定存储。
经过这几个步骤之后可以得到管理对象上下文NSManagedObjectContext,以后所有的数据操作都由此对象负责。同时如果是第一次创建上下文,Core Data会自动创建存储文件(例如这里使用SQLite3存储),并且根据模型对象创建对应的表结构。
2.查询数据
对于有条件的查询,在Core Data中是通过谓词来实现的。首先创建一个请求,然后设置请求条件,最后调用上下文执行请求的方法。
3.插入数据
插入数据需要调用实体描述对象NSEntityDescription返回一个实体对象,然后设置对象属性,最后保存当前上下文即可。这里需要注意,增、删、改操作完最后必须调用管理对象上下文的保存方法,否则操作不会执行。
4.删除数据
删除数据可以直接调用管理对象上下文的deleteObject方法,删除完保存上下文即可。注意,删除数据前必须先查询到对应对象。
5.修改数据
修改数据首先也是取出对应的实体对象,然后通过修改对象的属性,最后保存上下文。
5、OC中有哪些数据存储方式,各有什么区别? OC中有四种数据存储方式: 1).NSUserDefaults,用于存储配置信息 2).SQLite,用于存储查询需求较多的数据 3).CoreData,用于规划应用中的对象
4).使用基本对象类型定制的个性化缓存方案.NSUserDefaults:对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项。SQLite擅长处理的数据类型其实与NSUserDefaults差不多,也是基础类型的小数据,只是从组织形式上不同。开发者可以以关系型数据库的方式组织数据,使用SQL DML来管理数据。一般来说应用中的格式化的文本类数据可以存放在数据库中,尤其是类似聊天记录、Timeline等这些具有条件查询和排序需求的数据。CoreData是一个管理方案,它的持久化可以通过SQLite、XML或二进制文件储存。它可以把整个应用中的对象建模并进行自动化的管理。从归档文件还原模型时CoreData并不是一次性把整个模型中的所有数据都载入内存,而是根据运行时状态,把被调用到的对象实例载入内存。框架会自动控制这个过程,从而达到控制内存消耗,避免浪费。无论从设计原理还是使用方法上看,CoreData都比较复杂。因此,如果仅仅是考虑缓存数据这个需求,CoreData绝对不是一个优选方案。CoreData的使用场景在于:整个应用使用CoreData规划,把应用内的数据通过CoreData建模,完全基于CoreData架构应用。使用基本对象类型定制的个性化缓存方案:从需求出发分析缓存数据有哪些要求:按Key查找,快速读取,写入不影响正常操作,不浪费内存,支持归档。这些都是基本需求,那么再进一步或许还需要固定缓存项数量,支持队列缓存,缓存过期等。
数据存储这一块,面试常问, 你常用哪一种数据存储?什么是序列化?sqlite是直接用它还是用封装了它的第三方库?尤其是会问sqlite和core data的区别?
5、IOS平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?
iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data coredata可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。coredata提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用coredata的时候,你不用安装额外的数据库系统,因为coredata使用内置的sqlite数据库。coredata将你app的模型层放入到一组定义在内存中的数据对象。coredata会追踪这些对象的改变,同时可以根据需要做相应的改变,例如用户执行撤销命令。当coredata在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与coredata框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Dta支持SQLite作为一种存储类型, 但它不能使用任意的SQLite数据库。Core Data在使用的过程种自己创建这个数据库。Core Data支持对
一、对多的关系。
6、如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢?
编写SQL语句来操作原来表中的字段 增加表字段
ALTER TABLE 表名 ADD COLUMN 字段名字段类型;• 删除表字段
ALTER TABLE 表名 DROP COLUMN 字段名;
.修改表字段
ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名;
7、SQLite数据存储是怎么用?
添加SQLite动态库:
导入主头文件:#import
8、简单描述下客户端的缓存机制?
1>缓存可以分为:内存数据缓存、数据库缓存、文件缓存 2>每次想获取数据的时候 3>先检测内存中有无缓存
4>再检测本地有无缓存(数据库文件)5>最终发送网络请求
6>将服务器返回的网络数据进行缓存(内存、数据库、文件),以便下次读取
9、你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?
1>CoreData是对SQLite数据库的封装
2>CoreData中的NSManagedObjectContext在多线程中不安全
3>如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext 4>每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁
10、core data数据迁移
博客地址: http://blog.csdn.net/jasonblog/article/details/17842535
11、FMDB的使用和对多张表的处理
博客地址: http://blog.csdn.net/wscqqlucy/article/details/8464398
12、说说数据库的左连接和右连接的区别
黑马程序员基础测试题 篇6
1.谈谈你对Core Graphic 绘图的了解? CoreGraphics也称为Quartz 2D 是UIKit下的主要绘图系统,频繁的用于绘制自定义视图。Core Graphics是高度集成于UIView和其他UIKit部分的。Core Graphics数据结构和函数可以通过前缀CG来识别。
视图可以通过子视图、图层或实现drawRect:方法来表现内容,如果说实现了drawRect:方法,那么最好就不要混用其他方法了,如图层和子视图。自定义绘图大部分是由UIKit或者Core Graphics来实现的。
2D绘图一般可以拆分成以下几个操作: 线条 , 路径 , 文本 , 图片 , 渐变 由于像素是依赖于目标的,所以2D绘图并不能操作单独的像素,我们可以从上下文(Context)读取它。
绘图就好比在画布上拿着画笔机械的进行画画,通过制定不同的参数来进行不同的绘制。
http:///articles/jIJzMf
http://blog.csdn.net/mangosnow/article/details/37054765
2.Core Animation(核心动画)? CoreAnimation也就是核心动画, 是一组非常强大的动画处理API, 可以使用少量的代码做出绚丽的效果, 是直接作用在CALayer上的, 并非UIView, 并且Core Animation的动画执行过程都是在后台操作, 不会阻塞主线程.所有动画都是作用在CALayer上的, 当把动画添加到Layer上, 是不直接修改它的属性, Core Animation维护了两个平行layer的层次结构, 模型层树可以看到Layer的状态, 表示层树则是动画正在表现的值的近似.Core Animation的使用步骤: 1> 使用它需要先添加QuartzCore.framework框架和引入主头文件
3>.通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了
4>.通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画
1.转场动画? CATransition-转场动画, 作为CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点.UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果.如下是转场动画的过渡效果:
使用UIView的动画函数, 实现转场动画 1> 单视图:
+(void)transitionWithView:(UIView*)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options
animations:(void(^)(void))animations completion:(void(^)(BOOL finished))completion;参数说明:
duration:动画的持续时间 view:需要进行转场动画的视图 options:转场动画的类型
animations:将改变视图属性的代码放在这个block中 completion:动画结束后,会自动调用这个block 2> 双视图: +(void)transitionFromView:(UIView*)fromView toView:(UIView*)toView
duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options finished))completion;参数说明:
duration:动画的持续时间 options:转场动画的类型
animations:将改变视图属性的代码放在这个block中 completion:动画结束后,会自动调用这个block
completion:(void
(^)(BOOL 2.一个动画怎么实现? 以转场动画为例: 1> 创建CATransition对象
CATransition *animation = [CATransition animation];2> 设置运动时间(即动画时间)animation.duration = DURATION;3> 设置运动type(类型)
animation.type = type;if(subtype!= nil){ 4> 设置子类(和type配合使用, 指定运动的方向)animation.subtype = subtype;} 5> 设置运动速度(动画的运动轨迹,用于变化起点和终点之间的插值计算,形象点说它决定了动画运行的节奏,比如是均匀变化(相同时间变化量相同)还是先快后慢,先慢后快还是先慢再快再慢)animation.timingFunction = UIViewAnimationOptionCurveEaseInOut;
6> 将动画添加到view的Layer层
[view.layer addAnimation:animation forKey:@“animation”];动画类型如下: typedef enum : NSUInteger { Fade = 1, //淡入淡出 Push, //推挤 Reveal, //揭开 MoveIn, //覆盖 Cube, //立方体 SuckEffect, //吮吸 OglFlip, //翻转 RippleEffect, //波纹
PageCurl, //翻页 PageUnCurl, //反翻页 CameraIrisHollowOpen, //开镜头 CameraIrisHollowClose, //关镜头 CurlDown, //下翻页 CurlUp, //上翻页 FlipFromLeft, //左翻转 FlipFromRight, //右翻转 } AnimationType;3.CADisplayLink CADisplayLink是一种以屏幕刷新频率触发的时钟机制,每秒钟执行大约60次左右
CADisplayLink是一个计时器,可以使绘图代码与视图的刷新频率保持同步,而NSTimer无法确保计时器实际被触发的准确时间 使用方法:
黑马程序员基础测试题 篇7
最近有很多同学,就算是就业班毕业之后,还依然在问 java方法的调用中值的传递问题,实际参数究竟什么时候才会改变?接下来我们先由一个例子来引出大家的问题,请看如下例子,并回答 下面代码中的四个问题 public class Demo { public static void main(String[] args){ int a = 10;change(a);System.out.println(a);// 1:请问输出什么?
String str = “abc”;change(str);System.out.println(str);// 2:请问输出什么?
Student s = new Student(“张三”,13);System.out.println(s);// 输出 Student [name=张三, age=13] change(s);System.out.println(s);// 3:请问输出什么? change1(s);System.out.println(s);// 4:请问输出什么? }
public static void change(String s){ s = s+“def”;} public static void change(int a){ a = a + 10;} public static void change(Student s){ s = new Student(“李四”,14);} public static void change1(Student s){ s.setName(“李四”);s.setAge(14);} } 大家看完上面的题目之后,估计有很多同学能回答出前两问,1:输出10, 2:输出abc,因为这类的参数传递在咱们java基础课程的第5天和第13天都有讲到。但是虽然讲了,但
黑马程序员济南中心 编著
是有很多同学都没有充分的理解透彻,这也就是为什么大家回答不出 第三问 和 第四问 的原因。实际上第三问的答案是 3:输出Student [name=张三, age=13] 4:Student [name=李四, age=14]。下面我就给大家讲解一下。
首先用一句话来归纳java中参数传递:不管是基本类型还是引用类型: 形式参数做赋值操作的时候,实际参数不发生改变,如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变。1.不管是基本类型还是引用类型: 形式参数做赋值操作的时候,实际参数不发生改变
(当被调用的方法开始执行的时候,就从方法区里面把方法拿到了栈内存中,形式参数变量也根据传递过
去的值进行初始化,当方法用完了,那么该方法在栈内存中的变量也消失了。在所以也就是只在栈内存
中对方法里面变量进行了改变,是不影响实际参数的。而加减乘除、赋值[就算是引用类型之间的赋值,是
不是也只是在栈内存中把地址值进行的赋值]这一系列的赋值操作都是在栈内存中对方法里面变量进行了改
变,而方法执行完毕后 从栈内存中消失了,回到了调用这个方法 的 main方法栈内存中,实际参数原来是
什么 现在依然是什么)
2.如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变
(对于引用类型,它随着参数传递到方法里面去的是地址值,指向的是堆中的对象,如果在方法里面通过
这个地址值改变对象内部的一些属性,即使方法用完了,方法里面的变量的地址值的黑马程序员济南中心 编著
指向也消失了,但是
对象内部的一些属性还是已经改变了,这些属性不会消失[因为在堆内存中],所以实际参数还是会改变。如
果是基本类型,根本在堆内存中没有指向,基本类型都在栈内存或者常量池[值更不能被改变]中,所以基本
类型形式参数的改变无论如何是改变不了实际参数的)
3.看完上面的两句话和解释,相信大家还是觉得比较抽象,下面我给大家准备了一个代码案例,每一行代码都有对应的解释,看完下面的案例后估计大家就会真正的明白java中参数传递,参数改变时机的问题了
public class Demo2 { public static void main(String[] args){
int a = 10;int b = 20;
System.out.println(a+“ ”+b);//10 20 change1(a,b);//形式参数做赋值操作的时候,实际参数不发生改变
//基本类型一般都在栈内存中(所以 堆内存中没有指向 内部也就没有东西嘛),//所以值能做一些加减乘除、赋值的操作,//而做完了这些操作,就在占内存中消失了,所以不会影响实际参数 System.out.println(a+“ ”+b);//10 20
System.out.println(“-------------------”);
Student s = new Student();System.out.println(s);//Student [name=null, age=0]
change2(s);//详见方法内部注释
//如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变 System.out.println(s);//Student [name=hehe, age=1]
System.out.println(“-------------------”);
黑马程序员济南中心 编著
String string = “abc”;System.out.println(string);//abc
change3(string);//详见方法内部注释
//形式参数做赋值操作的时候,实际参数不发生改变 System.out.println(string);//abc
System.out.println(“-------------------”);
StringBuffer sb = new StringBuffer(“hello”);System.out.println(sb);//hello
change4(sb);//详见方法内部注释
//如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变 System.out.println(sb);//helloworld
System.out.println(“-------------------”);
int[] arr ={1,2,5,8,4,3};System.out.println(Arrays.toString(arr));//[1, 2, 5, 8, 4, 3] change5(arr,0,1);//详见方法内部注释
//如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变 System.out.println(Arrays.toString(arr));//[2, 1, 5, 8, 4, 3]
Arrays.sort(arr);System.out.println(Arrays.toString(arr));//[1, 2, 3, 4, 5, 8]
System.out.println(“-------------------”);
StringBuffer sb1 = new StringBuffer(“abcd”);StringBuffer sb2 = new StringBuffer(“efgh”);change6(sb1,sb2);//详见方法内部注释 System.out.println(sb1);//abcd
//形式参数做赋值操作的时候,实际参数不发生改变
System.out.println(“-------------------”);Student s1 = new Student(“hehe”,1);Student s2 = new Student(“haha”,20);change7(s1,s2);//详见方法内部注释
//形式参数做赋值操作的时候,实际参数不发生改变
System.out.println(s1);//Student [name=hehe, age=1]
} private static void change7(Student s1, Student s2){ //引用类型s1指向的是一个地址值,s2也是指向的地址值,那么把s2的地址值赋给了s1,这
黑马程序员济南中心 编著
时候s1指向的地址
//值改变了,而s1内部(堆内存)的东西改变了吗?没有啊,等这个方法调用完毕了,地址值的指向也都消失了,//s1还是指向原来的地址值,原来的地址值内部(堆内存)的东西还是没有改变,所以 赋值操作不会影响实际参数 s1=s2;} private static void change6(StringBuffer sb1, StringBuffer sb2){ //引用类型sb1指向的是一个地址值,sb2也是指向的地址值,那么把sb2的地址值赋给了sb1,这时候sb1指向的地址
//值改变了,而sb1内部(堆内存)的东西改变了吗?没有啊,等这个方法调用完毕了,地址值的指向也都消失了,//sb1还是指向原来的地址值,原来的地址值内部(堆内存)的东西还是没有改变,所以 赋值操作不会影响实际参数 sb1=sb2;} private static void change5(int[] arr, int i, int j){ //引用类型arr指向的其实是一个地址值,那么通过地址值将对象内部(堆内存)的值发生改变了,//即使这个方法调用完毕了,s所代表的地址的指向消失了,那么对象的内部其实已经改变了,所以形式参数改变实际参数 int temp = arr[i];[/i] [i] arr = arr[j];[/i] [i] arr[j] = temp;[/i]
[i] }[/i] [i] private static void change4(StringBuffer sb){[/i] [i] //引用类型sb指向的其实是一个地址值,那么通过地址值将对象内部(堆内存)的字符长度改变了,[/i]
[i] //即使这个方法调用完毕了,s所代表的地址的指向消失了,那么对象的内部其实已经改变了,所以形式参数改变实际参数[/i] [i] sb.append(“world”);[/i]
[i] }[/i] [i] private static void change3(String string){[/i] [i] //String也是一个引用类型,但是String的值是放在了常量池中,而且常量池中的值是不能被改变的[/i]
[i] //在方法里面这个string所代表的是常量池中值得地址值,那么我说string += “def”这句话在常量池中其实是这样的:“找有没有abcdef,如果有就把abcdef的地址值赋给string[/i]
[i] //如果没有就在常量池中创建一个abcdef 并把地址值赋给string”。然而当我方法用完了 string代表的地址值的指向也消失了,那么原来main方法中的string
黑马程序员济南中心 编著
也不发生改变[/i]
[i] string += “def”;[/i]
[i] }[/i] [i] private static void change2(Student s){[/i] [i] //引用类型s指向的其实是一个地址值,那么通过地址值将对象内部(堆内存)的属性改变了,[/i]
[i] //即使这个方法调用完毕了,s所代表的地址的指向消失了,那么对象的内部其实已经改变了,所以形式参数改变实际参数[/i] [i] s.setName(“hehe”);[/i] [i] s.setAge(1);[/i]
[i] }[/i] [i] private static void change1(int a, int b){[/i] [i] int temp = a;[/i] [i] a= b;[/i] [i] b=temp;[/i]
[i] }[/i] [i]} 当大家看完这个例子的时候,相信很多同学有一种恍然大悟的感觉,终于搞明白为什么参数传递的时候,实际参数有什么改变有时候不改变。如果大家还有什么疑问需要一起交流,请在下面直接给我留言就可以了,或者直接来济南黑马程序员找大山哥哥来咨询,我会亲自给同学讲解
【黑马程序员基础测试题】推荐阅读:
黑马程序员面试题精编06-01
黑马程序员:AJAX入门系列10-17
【黑马程序员】Java之debug总结三09-22
黑马程序员PHP培训教程:同步和异步介绍05-29
黑马程序员济南中心PHP第11天教程11-12
【黑马程序员】为什么面试官喜欢问职业规划05-19
黑马程序员C语言教程:C++语言78个常见编译错误及分析11-15
高考黑马学习方法总结08-22
程序设计基础考试试题06-08