<commit_before><commit_msg>java面试题<commit_after>笔试题

简答题
1. java支持的数据类型都有哪些,什么是自动拆装箱？

	```
	基本数据类型:byte:short:int:long:float:double:char = 1:2:4:8:4:8:2(字节)
	引用类型:类,接口,枚举,数组,集合等,对象内容在堆内存中
	
	如果一个基本类型值出现在需要对象的环境中，会自动装箱;Integer intObjct = 2 
	如果一个包装类型值出现在需要计算的环境中，会自动开箱;int a = 3 + new Integer(3);
	自动开箱和装箱:Integer b = 3 + new Integer(3); 
	```
2. [如何确保N个线程可以访问N个资源同时又不导致死锁？](https://www.nowcoder.com/questionTerminal/7192c9454277483d8711a7b4237a0bbe?pos=156&orderByHotValue=1)

	```
	所有的线程都是以同样的加锁和释放锁，就不会出现死锁了。
	多线程产生死锁的四个必要条件：
	互斥条件：一个资源每次只能被一个进程使用。
	保持和请求条件：一个进程因请求资源而阻塞时，对已获得资源保持不放。
	不可剥夺调教：进程已获得资源，在未使用完成前，不能被剥夺。
	循环等待条件：若干进程之间形成一种头尾相接的循环等待资源关系。
	```
3. `Iterator` 和 `ListIterator` 的区别是什么

	```
	1. iterator()方法在set和list接口中都有定义，
			但是ListIterator（）仅存在于list接口中（或实现类中）；
	2. ListIterator有add()方法，可以向List中添加对象，而Iterator不能；
	3. ListIterator和Iterator都有hasNext()和next()方法，可以实现顺序向后遍历，
			但是ListIterator有hasPrevious()和previous()方法，可以实现逆向（顺序向前）遍历。
			Iterator就不可以。
	4. ListIterator可以定位当前的索引位置，nextIndex()和previousIndex()可以实现。
			Iterator没有此功能。
	5. 都可实现删除对象，
			但是ListIterator可以实现对象的修改，set()方法可以实现。
			Iterator仅能遍历，不能修改。　　
	因为ListIterator的这些功能，可以实现对LinkedList等List数据结构的操作。
			其实，数组对象也可以用迭代器来实现。
	```

4. [`ArrayList`，`Vector`, `LinkedList` 的存储性能与特性](https://blog.csdn.net/u014044812/article/details/48325307)

	```
	ArrayList: 	存储方式为数组存储,遍历快,
				插入前可调用ensureCapacity方法来增加容量以提高插入效率。
	Vector:		同ArrayList,但线程同步,
				多线程同时处理会抛出ConcurrentModificationException;
	LinkedList:	允许null元素。此外LinkedList提供额外的get()，remove()，insert()
				在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈（stack）
				，队列（queue）或双向队列（deque）。
	```

5. 多线程有几种实现方法，都是什么？同步有几种实现方法，都是什么？

	```
	1. 实现Runnable 或 继承Thread类。
	2. synchronized 关键字 或 代码块。
	```

6. `StringBuffer` 与 `StringBuilder` 的区别

	```
	StringBuilder非线程安全（单线程使用），String与StringBuffer线程安全（多线程使用）；
	如果程序不是多线程的，那么使用StringBuilder效率高于StringBuffer。
	```

7. [`heap` 和`stack`有什么区别](https://blog.csdn.net/wl_ldy/article/details/5935528)

	```
	程序员不可直接设置栈堆信息。
	栈: 随线程创建而创建，存取速度比堆要快，存在栈中的数据可以共享。			
				但数据大小与生存期必须是确定的，缺乏灵活性。
	堆: JVM启动时创建，可动态地分配内存大小，Java的垃圾收集器会自动收走这些不再使用的数据。其他数据类型对象的指向问题。
				但由于要在运行时动态分配内存，存取速度较慢。 
			
	```


数据库语句:
1. 创建数据库

	```java
	public class DatabaseHelper extends SQLiteOpenHelper {}
	SQLiteOpenHelper dbHelper
				= new DatabaseHelper(SQLiteActivity.this,"SQLiteName");
	SQLiteDatabase sqliteDatabase
				= dbHelper.getReadableDatabase(); 
	```
2. 创建新表

	```java
	CREATE TABLE IF NOT EXISTS tableName
		(_id integer primary key autoincrement, name varchar(20) not null , ...)
	```
3. 排序

	```
	SELECT * FROM table_name 
			WHERE ...
			ORDER BY column1, column2, .. columnN 
			[ASC | DESC];
	```
4. 求和
	
	```
	 SELECT count(列名) FROM COMPANY;
	```	

算法题:
1. 使用条件运算符的嵌套完成:学习成绩>=90分的同学用A表示,60-89的用B表示,<60用C表示
2. 输入一行字符,分别统计出英文字母,空格,数字,其他字符的个数。
	
	```
	BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	String str=br.readLine(); 
	int countNum = 0;//统计数字的个数
	int countChar = 0;//统计英文字母的个数
	int countSpace = 0;//统计空格的个数
	int countOthers = 0;//统计其它字符的个数
	for (int i = 0; i < str.length(); i++) {
		char c = str.charAt(i);
		if (c >= '0' && (int) c <= '9') {
			countNum++;
		} else if ((c >= 'a' && c <= 'z')||(c >= 'A' && c <= 'Z')) {
			countChar++;
		} else if (c == ' ') {
			countSpace++;
		} else{
			countOthers++;
		}
	}
	```

3. 打印菱形图案1-3-6-8-6-3-1

程序题:
1. 兔子不死的情况下从一对兔子开始,从出生后3个月起每个月生一对,小兔子长到第四个月后又生一对,每个月的兔子数?
2. [判断101-200之间的素数并输出](https://blog.csdn.net/u012249177/article/details/49449985)

	```
	用一个数分别去除2到sqrt(这个数)，如果能被整除，则表明此数不是素数，反之是素数。  
	```

3. 判断"水仙花数"=三位数的每位数的立方和

	```
	public static boolean isDaffodilNumber(int i) {  
        boolean flag = true;  
        int a = i / 100; // 取得百位数  
        int b = (i / 10) % 10; // 取得十位数  
        int c = i % 10; // 取得个位数  
        /* 
         * if ((Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3)) != i) {// 若各位数字立方和不等于该数本身 
         *       flag = false;// 返回false  
         * } 
         */  
        if (a * a * a + b * b * b + c * c * c != i) {// 若各位数字立方和不等于该数本身  
            flag = false;//返回false  
        }  
        return flag;  
    }  
	```
	
4. 正整数分解质因数 例:90=2×3×3×5

	```
	public static void getNumber(int number){
        int a = 2;
        System.out.print(number + "=");
        while(number > a){
            if(number % a == 0){
                System.out.print(a + "*");
                number = number / a;
            }else{
                a++;
            }
        }

        System.out.print(a);
    }
	```

5. 32位的整数二进制表示中有多少个1
6. 有个项目的用户推荐关系是双轨加太阳线，直推图是树状，每个会员都有 2 个推
广链接（左右）发出去给自己的推荐人，这样他就会有2个区域的业绩，现在业绩计算.是只
计算会员自己左右区下面所有人的业绩，但是这样的业锁计算方式客户说不对，他们需要公
排的计算方法，也就是业绩的计算要按公排的方式来计箅，公排的解释可以M下黄总，诺问
怎么解决，具体见PPT文件
{'fraction_non_alphanumeric': 0.14789337919174547, 'fraction_numerical': 0.035898538263112637, 'mean_word_length': 3.521865889212828, 'pattern_counts': {'":': 0, '<': 8, '<?xml version=': 0, '>': 8, 'https://': 4, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2534583', 'n_tokens_mistral': 2859, 'n_tokens_neox': 2898, 'n_words': 298}