深圳智慧探索科技有限公司筆試題總結

1:ContentValues 的用法,對比HashTable

ContentValues 和HashTable類似都是一種存儲的機制 但是兩者最大的區別就在於,contenvalues只能存儲基本類型的數據,像string,int之類的,不能存儲對象這種東西,而HashTable卻可以存儲對象。

在忘數據庫中插入數據的時候,首先應該有一個ContentValues的對象所以:

ContentValues initialValues = new ContentValues();//語句實例化一個contentValues類。

initialValues.put(key,values);//語句將列名和對應的列值放置到initialValues裏邊。

SQLiteDataBase sdb ;

sdb.insert(database_name,null,initialValues);//語句負責插入一條新的紀錄,如果插入成功則會返回這條記錄的id,如果插入失敗會返回-1。



2:android中listview的優化方式

istview的優化其實就是去找getView中的耗時操作,然後提取出來,要麼使用異步的方式爲item的佈局設置數據,要是實在需要同步,就只能在Adapter初始化時將數據準備好,然後再getView中只需綁定一下就行。

listview可以說是Android開發中最常見的UI控件了,listview能夠以列表的方式顯示大量同類的數據,這樣問題就產生了,既然是大量數據,就會使用到很多佈局,給佈局綁定數據,listview將佔用大量資源還可能會產生卡頓現象。

    listview現在最常用也擁有很好的性能的優化方式是在Adapter中使用靜態的ViewHolder,具體代碼如下:


private TestAdapter mAdapter;
    private String[] mArrData;
    private TextView mTV;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mTV = (TextView) findViewById(R.id.tvShow);
        mArrData = new String[1000];
        for (int i = 0; i < 1000; i++) {
            mArrData[i] = "Google IO Adapter" + i;
        }
        mAdapter = new TestAdapter(this, mArrData);
        ((ListView) findViewById(android.R.id.list)).setAdapter(mAdapter);
    }
         Adapter
      private int count = 0;
    private long sum = 0L;
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // 開始計時
            long startTime = System.nanoTime();
            ViewHolder holder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.list_item_icon_text,
                        null);
                holder = new ViewHolder();
                holder.icon1 = (ImageView) convertView.findViewById(R.id.icon1);
                holder.text1 = (TextView) convertView.findViewById(R.id.text1);
                holder.icon2 = (ImageView) convertView.findViewById(R.id.icon2);
                holder.text2 = (TextView) convertView.findViewById(R.id.text2);
                convertView.setTag(holder);
            }
            else{
                holder = (ViewHolder)convertView.getTag();
            }
            holder.icon1.setImageResource(R.drawable.icon);
            holder.text1.setText(mData[position]);
            holder.icon2 .setImageResource(R.drawable.icon);
            holder.text2.setText(mData[position]);
            // 停止計時
            long endTime = System.nanoTime();
            // 計算耗時
            long val = (endTime - startTime) / 1000L;
            Log.e("Test", "Position:" + position + ":" + val);
            if (count < 100) {
                if (val < 1000L) {
                    sum += val;
                    count++;
                }
            } else
                mTV.setText(String.valueOf(sum / 100L));// 顯示統計結果
            return convertView;
        }
    }
    static class ViewHolder {
        TextView text1;
        ImageView icon1;
        TextView text2;
        ImageView icon2;
    }

在Adapter的代碼中,在getView方法裏首先判斷convertView是否爲空,若爲空則加載相應佈局,若不爲空則直接使用該佈局,這能夠很有效的使用Android爲listview提供的緩存機制:只加載一屏的佈局,之後滑動出來的item使用的是之前已經加載的佈局的緩存;
    而使用靜態的ViewHoulder的目的則是節省了findViewById的時間。如果不使用ViewHolder,每次getView的時候都需要得到一次子佈局,而這也是很耗時並且耗資源的;如果使用了ViewHolder作爲子佈局的緩存,使用View的setTag方法將緩存與每個item綁定,則也可以省去了findViewById的事件;而將ViewHolder設置爲static的目的是指在初始化Adapter時初始化一次這個內部類,否則將會在每次創建Adapter時都要初始化一次,而這是沒有必要的。



3:Android中dip、dp、sp、pt和px的區別

dip: device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬件有關,一般我們爲了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。

    dp: dip是一樣的

    px: pixels(像素). 不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。

    pt: point,是一個標準的長度單位,1pt=1/72英寸,用於印刷業,非常簡單易用;
    sp: scaled pixels(放大像素). 主要用於字體顯示best for textsize。

   據px = dip * density / 160,則當屏幕密度爲160時,px = dip

 根據 google 的建議,TextView 的字號最好使用 sp 做單位,而且查看TextView的源碼可知Android默認使用sp作爲字號單位。將dip作爲其他元素的單位。
url:
http://greatverve.cnblogs.com/archive/2011/12/27/Android-dip-dp-sp-pt-px.html




4:java構造函數能否被繼承,爲什麼?

不能,因爲子類繼承父類的時候,先運行父類構造函數;具體的說就是運行父類時就會先“調用”父類的構造函數,注意“調用”和繼承不是一個含義,實質上是“自動運行”。
繼承(extends)的含義其實是“擴展”,子類完全沒必要擴展父類的構造函數,因爲反正每次調子類的時候都會“自動運行”它父類的構造函數,如果真的需要子類構造函數特殊的形式,子類直接修改或重載自己的構造函數就好了。
估計是你對“構造函數”的意義本身不理解,“調用”一個類有“繼承”和“組合(說白了new 一個類)”兩種方式,當你“調用”一個類的時候就會“自動運行”它的“構造函數”。

這樣理解更好 
class Person{
     
 Person() {
System.out.println("父類構造函數");
}
 Person(int a) {
System.out.println("帶參數的父類構造函數");
}
}
public class Test extends Person {
        
public Test() {
System.out.println("子類構造函數");
}
public Test(int a) {
Person(12);//錯誤吧 只能用super(12)吧,如果能繼承的話就應該可以寫成Person(12);         System.out.println("帶參數的子類構造函數");
}
public static void main(String[] args) {
Test a=new Test(12);
         
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章