天天看點

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

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