一般来说,一个Android工程的目录结构如下图所示。
1:src
JAVA源代码都放在这里面。
2:gen
编译器自动生成的一些JAVA代码
3:Android 4.2
Android平台(本工程用的版本是4.2)
4:Android dependencies
该目录出现在ADT16以后的版本中,是ADT第三方库新的引用方式,当我们需要引用第三方库的时候,只需要将
该库拷贝到libs文件夹中,ADT就会自动完成对该库的引用(如本例中android-support-v4.jar)
5:bin
该目录是编译之后的文件以及一些中间文件的存放目录,ADT先将工程编译成Android JAVA虚拟机(Dalvik Virtual Machine)
文件classes.dex. 最后将该classes.dex封装成apk包。(apk就是android平台生的安装程序包)。
6:libs
4中已经介绍,该目录用于存放第三方库,(新建工程时,默认会生成该目录,没有的话手动创建即可)。
7:res
存放项目中的资源文件,该目录中有资源添加时,R.java会自动记录下来。res目录下一般有如下几个子目录
drawable-hdpi, drawable-mdpi, drawable-xhdpi:存放图片文件(png, jpg), 三个子目录分别保存高,中,低质量的图片
layout:屏幕布局目录,layout目录内默认布局文件是activity_main.xml,可以在该文件内放置不同的布局结构和控件,来满足项目界面的需要,也可以新建布局文件。
menu:存放定义了应用程序菜单资源的XML文件。
values, values-v11, values-v14:存放定义了多种类型资源的XML文件。
package cn.thj.data_structures;
import java.util.Iterator;
public class MyArrayList<T> implements Iterable<T> {
// 定义默认的大小
private static final int DEFAULT_CAPACITY = 10;
private T[] Items;
private int size;
// 默认构造
public MyArrayList() {
clear();
};
// 清空集合
public void clear() {
size = 0;
ensureCapacity(DEFAULT_CAPACITY);
}
/**
* 保持集合容量增长
*
* @param newCapacity
*/
public void ensureCapacity(int newCapacity) {
if (newCapacity < size) {
return;
}
T[] old = Items;
Items = (T[]) new Object[newCapacity];
for (int i = 0; i < size(); i++) {
Items[i] = old[i];
}
}
// 返回集合的大小
public int size() {
return size;
}
// 是集合的容量为集合的大小
public void trimToSize() {
ensureCapacity(size());
}
// 判断集合是否为空
public boolean isEmpty() {
return size() == 0;
}
// 检查集合的边界,判断是否越界
private void RangeCheck(int index) {
if (index >size || index < 0)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
}
// 取指定位置的值
public T get(int index) {
RangeCheck(index);
return Items[index];
}
// 给指定位置设值
public T set(int index, T newVal) {
RangeCheck(index);
T old = Items[index];
Items[index] = newVal;
return Items[index];
}
// 添加元素,默认添加到末尾
public boolean add(T val) {
add(size(), val);
return true;
}
/**
* 根据指定位置添加数据
*
* @param index
* 添加的位置
* @param val
* 添加的值
*/
public void add(int index, T val) {
RangeCheck(index);
if (Items.length == size()) {
ensureCapacity(size() * 2 + 1);
}
for (int i = size; i > index; i--) {
Items[i] = Items[i - 1];
}
Items[index] = val;
size++;
}
/**
* 删除指定位置的元素
*
* @param index
* 删除的位置
* @return removeItem
* 返回被删除的元素
*/
public T remove(int index) {
RangeCheck(index);
T removeItem = Items[index];
for (int i = index; i < size; i++) {
Items[i] = Items[i + 1];
}
size--;
return removeItem;
}
public Iterator<T> iterator() {
return new ArrayListIterator();
}
/**
*实现迭代器,这里是用一个内部类来实现的
*/
private class ArrayListIterator implements java.util.Iterator<T> {
private int current = 0;
private boolean okToRemove = false;
public boolean hasNext() {
return current < size();
}
public T next() {
if (!hasNext())
throw new java.util.NoSuchElementException();
okToRemove = true;
return Items[current++];
}
public void remove() {
if (!okToRemove)
throw new IllegalStateException();
MyArrayList.this.remove(--current);
okToRemove = false;
}
}
}
Hibernate工作原理及为什么要用?
原理:
1. 读取并解析配置文件
2. 读取并解析映射信息,创建SessionFactory
3. 打开Sesssion
4. 创建事务Transation
5. 持久化操作
6. 提交事务
7. 关闭Session
8. 关闭SesstionFactory
为什么要用:
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
2. Hibernate是如何延迟加载?
1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
2. Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
3. Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)