JavaSE基础

(1)

设定两个变量a,b.如何不通过第三方变量使得两两变量交换

int a=a+b;

int b=a-b

int a=a-b;

总结:这个做法可以减少栈的空间,并且这个不断利用更新的值进行运算,不错的思想(不添加,则保留),可是可读性较差

 

(2)

集合遍历的其中一种方法

ArrayList a=new ArrayList();

a.add(0,30);

a.add(1, 15);

Iterator it1 = a.iterator();

while(it1.hasNext()){

System.out.println(it1.next());

}

 

(3)

fail-fast机制出现于两种场景,第一种是单线程情况下,使用Iterator对集合进行增加和删除操作(Java底层对集合增加和删改加入了一个变量用来记录删除和

添加记录数,以此判断是否对集合进行增加和删除操作)

第二种是多线程情况下去对集合进行操作

解决方案:第一种情况就是遍历集合的时候不要增加和删除操作

第二种情况使用对应的copyonwrite容器来保障线程安全(CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。)

 

(4)

HashMap是一个基于数组的数据结构,不过这个数组的类型是一个实体

存储下标获取的方式先是hash(key.hashCode()),然后和数组的长度减去一来进行和运算来获取下标索引(不採用与运算是因为和运算更快)

一旦HashMap的equal方法被重写,那麽对应的hashCode()方法也需要被重写。(这是基于原则,因为判断equal有一部分是需要判断Hashcode的)

 

(5)

Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。

当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。

 

(6)

webService是一个远程调用平台,基于Soap协议,通过wsdl文件格式以及查找对应的UDID来获取连接(要暴露方法出去和访问的时候需要加上wsdl后缀)。写好服务端的代码后,通过cmd运行对应指令会自动生成客户端的代码

具体参考 https://www.cnblogs.com/fengwenzhee/p/6915606.html

 

(7)

服务器端,首先是服务器初始化Socket,然后是与端口进行绑定(blind()),端口创建ServerSocket进行监听(listen()),然后调用阻塞(accept()),等待客户端连接。与客户端发生连接后,会进行相关的读写操作(read(),write()),最后调用close()关闭连接。


(8)

访问修饰符权限如下所示:

 

(9)

switch语句后的控制表达式只能是short、char、int、long整数类型和枚举类型,不能是float,double和boolean类型。String类型是java7开始支持。

 

(10)

ThreadLocal不是继承自Thread

ThreadLocal没有进行数据共享,除非同步

ThreadLocal是采用哈希表的方式来为每个线程都提供一个变量的副本

ThreadLocal保证各个线程间数据安全,每个线程的数据不会被另外线程访问和破坏

 

(11)

String str1="hello";

String str2="he"+ new String("llo");

System.out.println(str1==str2);

答案是false

原因是String str1="hello";    这样创建字符串是存在于常量池中

String str2=new String("hello");    str2存在于堆中,

==是验证两个对象是否是一个(内存地址是否相同)一个在堆中,一个在常量池中,内存地址不一致

 

(12)

list和set都是接口

ArrayList和linkedlist类是实现了List接口,而不是继承

AbstractSet类实现Set接口

 

(13)

(不定项选择题) 在Java中下面Class的声明哪些是错误的? 

A public abstract final class Test { abstract void method(); }

B public abstract class Test { abstract final void method(); }

C public abstract class Test { abstract void method() { } }

D public class Test { final void method() { } }

答案:ABC

A、final修饰的类为终态类,不能被继承,而 抽象类是必须被继承的才有其意义的,因此,final是不能用来修饰抽象类的。

B、 final修饰的方法为终态方法,不能被重写。而继承抽象类,必须重写其方法。

C中定义的抽象方法没有实体时候,大括号必须省略。抽象类可以没有抽象方法

 

(14)

HashMap根据key的hashCode值来保存value,需要注意的是,HashMap不保证遍历的顺序和插入的顺序是一致的。HashMap允许有一条记录的key为null,但是对值是否为null不做要求。HashTable类是线程安全的,它使用synchronize来做线程安全,全局只有一把锁,在线程竞争比较激烈的情况下hashtable的效率是比较低下的。因为当一个线程访问hashtable的同步方法时,其他线程再次尝试访问的时候,会进入阻塞或者轮询状态,比如当线程1使用put进行元素添加的时候,线程2不但不能使用put来添加元素,而且不能使用get获取元素。所以,竞争会越来越激烈。相比之下,ConcurrentHashMap使用了分段锁技术来提高了并发度,不在同一段的数据互相不影响,多个线程对多个不同的段的操作是不会相互影响的。每个段使用一把锁。所以在需要线程安全的业务场景下,推荐使用ConcurrentHashMap,而HashTable不建议在新的代码中使用,如果需要线程安全,则使用ConcurrentHashMap,否则使用HashMap就足够了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值