我刚刚了解了Java Collections Framework如何在链表中实现数据结构.根据我的理解,这Iterators
是一种遍历数据结构(如列表)中的项目的方法.为什么使用这个界面?为什么这些方法hasNext()
,next()
而remove()
不是直接编码到数据结构实现本身?
从Java网站:链接文本
public interface Iterator <E>
集合上的迭代器.Iterator取代了Java集合框架中的Enumeration.迭代器在两个方面与枚举不同:
此接口是Java Collections Framework的成员.
- 迭代器允许调用者在迭代期间使用定义良好的语义从底层集合中删除元素.
- 方法名称已得到改进.
我试着用Google搜索,似乎无法找到明确的答案.有人可以解释为什么Sun选择使用它们吗?是因为更好的设计?增加安全性?好的OO练习?
任何帮助将不胜感激.谢谢.
请在将此标记为重复之前阅读.我从谷歌和SO搜索了很多,但我无法找到我想要的确切答案.
我的问题:在JDBC中,我可以使用单个Statement
对象executeQuery("")
多次调用吗?安全吗?或者我应该在每次查询后关闭语句对象,并创建新对象以执行另一个查询.
例如:
Connection con;
Statement s;
ResultSet rs;
ResultSet rs2;
try
{
con = getConnection();
s = con.prepareStatement();
try
{
rs = s.executeQuery(".......................");
// process the result set rs
}
finally
{
close(rs);
}
// I know what to do to rs here
// But I am asking, should I close the Statement s here? Or can I use it again for the next query?
try
{
rs2 = s.executeQuery(".......................");
// process the result …
Run Code Online (Sandbox Code Playgroud) 我有一个lots\t of\nwhitespace\r\n
我简化的字符串 ,但我仍然需要摆脱字符串中的其他空格.
QString str = " lots\t of\nwhitespace\r\n ";
str = str.simplified();
Run Code Online (Sandbox Code Playgroud)
我可以erase_all(str, " ");
在提升中做到这一点,但我想留在qt.
我有一个独立的CSV数据加载过程,我用Java编码,必须使用一些模糊的字符串匹配.这绝对不是理想的,但我没有太多选择.我使用名字和姓氏进行匹配,并在运行开始时缓存所有可能性.找到匹配后,我需要该人在运行期间对多个位置.我使用guava Objects.hashCode()
来创建名字和姓氏的哈希值.
缓存机制如下所示:
Map<Integer,PersonDO> personCache = Maps.newHashMap();
for(PersonDO p: dao.getPeople()) {
personCache.put(Objects.hashCode(p.getFirstName(),p.getLastName()), p);
}
Run Code Online (Sandbox Code Playgroud)
大部分时间我都会在名字+姓氏上点击,但是当它错过时我会使用Apache StringUtils.getLevenshteinDistance()
来尝试匹配它.这就是匹配逻辑流程的方式:
person = personCache.get(Objects.hashCode(firstNameFromCSV,lastNameFromCSV));
if(person == null) {//fallback to fuzzy matching
person = findClosetMatch(firstNameFromCSV+lastNameFromCSV);
}
Run Code Online (Sandbox Code Playgroud)
这是findClosetMatch()
方法:
private PersonDO findClosetMatch(String name) {
int min = 15;//initial value
int testVal=0;
PersonDO matchedPerson = null;
for(PersonDO person: personCache.values()) {
testVal = StringUtils.getLevenshteinDistance(name,person.getFirstName()+person.getLastName());
if( testVal < min ) {
min = testVal;
matchedPerson = person;
}
}
if(matchedPerson == null) {
throw new Exception("Unable to …
Run Code Online (Sandbox Code Playgroud) 当getter返回一个属性时,例如返回List
其他相关对象,该列表和它的对象是否应该是不可变的以防止类外的代码,更改这些对象的状态,而主要的父对象不知道?
例如,如果一个Contact
对象,具有getDetails
吸气剂,它返回一个List
的ContactDetails
目的,那么任何码调用该吸气剂:
ContactDetail
在没有Contact
对象知道的情况下从该列表中删除对象.ContactDetail
没有Contact
对象知道的情况下更改每个对象.那我们该怎么办呢?我们应该只是信任调用代码并返回容易变化的对象,还是努力工作并为每个可变类创建一个不可变类?
我一直在使用番石榴的已经ImmutableMap
有Builder
一段时间没有过多考虑如何/为什么它的工作原理.我一直在以Javadoc描述的方式使用构建器:
ImmutableMap<String, Integer> WORD_TO_INT =
new ImmutableMap.Builder<String, Integer>()
.put("one", 1)
.put("two", 2)
.put("three", 3)
.build();
Run Code Online (Sandbox Code Playgroud)
我也在其他地方看到过这种语法的例子:
ImmutableMap<String,Integer> myMap = ImmutableMap.<String, Integer>builder()
.put("one", 1)
.put("two", 2)
.put("three", 3)
.build();
Run Code Online (Sandbox Code Playgroud)
两者似乎都产生完全相同的结果.
快速浏览一下ImmutableMap
源表明builder()
第二个例子中的静态调用返回:new Builder<K, V>()
这两种方法之间似乎没有任何功能差异.
引擎盖下有什么不同吗?有理由偏好其中一个吗?
编辑:添加字节码差异.
除了一行之外,生成的字节码几乎相同:
方法1(Builder<K,V>
):
static {};
0 new com.google.common.collect.ImmutableMap$Builder [12]
3 dup
4 invokespecial com.google.common.collect.ImmutableMap$Builder() [14]
7 ldc <String "key1"> [17]
........
Run Code Online (Sandbox Code Playgroud)
方法2 :( <K,V>builder()
)
static {};
0 invokestatic com.google.common.collect.ImmutableMap.builder() …
Run Code Online (Sandbox Code Playgroud) 我正在为我编写的Java程序制作一个迷你ORM ...我的数据库中的每个表都有一个类,都继承自ModelBase
.
ModelBase
是抽象的,提供了一堆静态方法,用于从db中查找和绑定对象,例如:
public static ArrayList findAll(Class cast_to_class) {
//build the sql query & execute it
}
Run Code Online (Sandbox Code Playgroud)
所以你可以做一些事情,比如ModelBase.findAll(Albums.class)
获得所有持久专辑的列表.我的问题是,在这个静态上下文中,我需要从具体类Album中获取相应的sql字符串.我不能有像这样的静态方法
public class Album extends ModelBase {
public static String getSelectSQL() { return "select * from albums.....";}
}
Run Code Online (Sandbox Code Playgroud)
因为Java中没有静态方法的多态性.但我不想创建getSelectSQL()
一个实例方法,Album
因为我需要创建一个实例,只是为了获得一个在行为上非常静态的字符串.
目前,findAll()
使用反射来获取相关类的相应sql:
select_sql = (String)cast_to_class.getDeclaredMethod("getSelectSql", new Class[]{} ).invoke(null, null);
Run Code Online (Sandbox Code Playgroud)
但这非常糟糕.
那么任何想法?这是我一次又一次的一般问题 - 无法在类或接口中指定抽象静态方法.我知道为什么静态方法多态不会也无法工作,但这并不能阻止我再次使用它!
是否有任何模式/构造允许我确保具体的子类X和Y实现一个类方法(或者失败,类常量!)?
在我正在研究的多线程应用程序中,我们偶尔会看到ConcurrentModificationExceptions
我们的列表(大多数情况下ArrayList
,有时候是矢量).但是还有一些时候我认为并发修改正在发生,因为遍历集合似乎缺少项目,但没有抛出异常.我知道文档ConcurrentModificationException
说你不能依赖它,但我怎样才能确保我不会同时修改List?并且在同步块中包装对集合的每个访问权限是防止它的唯一方法吗?
更新:是的,我知道Collections.synchronizedCollection
,但它并没有防止有人在你迭代它时修改集合.我认为至少有一些问题发生在我正在迭代它时有人向集合添加内容时.
第二次更新 如果有人想结合提到的synchronizedCollection和像Jason那样的克隆,提到java.util.concurrent和像jacekfoo和Javamann这样的apache集合框架,我可以接受一个答案.
我对正确运行的Web应用程序进行了一系列功能测试,但每个都需要使用@BeforeClass
和@AfterClass
注释提供的类级别设置和拆卸,因此需要JUnit 4.0或更高版本.
现在我想使用少量的这些功能测试来执行负载测试,这些测试模拟了大量用户请求Web应用程序的相关页面.为了让每个用户在JWebUnit中拥有自己的"模拟浏览器",我需要在JUnitPerf中使用TestFactory来实例化测试中的类,但是由于JUnit 4测试是通过注释@Test
而不是从中派生出来的TestCase
,所以我得到了一个TestFactory must be constructed with a TestCase class
例外.
是否有人成功使用JUnitPerf及其TestFactory与JUnit 4?什么是让它全部起作用的秘诀?
我正在使用jersey和jackson来开发我的REST API,并且在反序列化日期字符串时遇到问题.我在泽西岛注册了一个提供者类:
@Provider
public class MyJsonProvider extends JacksonJsonProvider {
public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Override
public void writeTo(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String,Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
ObjectMapper mapper = locateMapper(type, mediaType);
// Enable human readable date format
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
mapper.getDeserializationConfig().setDateFormat(sdf);
mapper.getSerializationConfig().setDateFormat(sdf);
// Enable JAXB annotation, with Jackson annotation being the preferred one.
AnnotationIntrospector primary = new JacksonAnnotationIntrospector();
AnnotationIntrospector secondary = new JaxbAnnotationIntrospector();
AnnotationIntrospector introspector = …
Run Code Online (Sandbox Code Playgroud)